Reputation: 52
when i try to compile it i have this error , and i really have no idea what to do . Maybe you can help me about this .
Main.cpp:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <list>
using namespace std;
list<int> liste;
int size=0;
void list_initialization(){
cout << "Quicksort" << endl << endl;
cout <<"List Initialization" << endl;
while ((size<1)||size>100){
cout << "Please enter the size (between 1 and 100)" << endl;
cin >> size;
}
srand ( time(NULL) );
for (int i=0; i<size; i++){
liste.push_back(rand() %100 +1);
}
}
void list_display(){
cout << endl;
for (list<int>::const_iterator ite=liste.begin(), end=liste.end(); ite!=end; ++ite)
cout << *ite << " ";
cout << endl;
}
int choose_pivot( int const& left, int const& right){
int pivot;
pivot = rand()%(right-left) + left ;
return pivot;
}
int partition(int left, int right, int pivotIndex){
//We Save pivotValue
list<int>::iterator itPivotIndex = liste.begin();
advance (itPivotIndex, pivotIndex);
int pivotValue = *itPivotIndex;
//Those 2 iterators will be used to swap 2 elements
list<int>::iterator itSwap1 = liste.begin();
list<int>::iterator itSwap2 = liste.begin();
//2 iterators to point left and right elements
list<int>::iterator itLeft = liste.begin();
advance (itLeft, left);
list<int>::iterator itRight = liste.begin();
advance (itRight, right);
//1 iterator to point the StoreIndex
list<int>::iterator itStoreIndex=itLeft;
//Move Pivot to End
advance(itSwap1, pivotIndex);
advance(itSwap2, right);
swap(*itSwap1, *itSwap2);
//Move all elements less than pivotValue before the pivot
for(list<int>::iterator it=itLeft; it!=itRight; it++)
if (*it < pivotValue){
//Swap array[k] and array[storeIndex]
itSwap1=it;
itSwap2=itStoreIndex;
swap(*itSwap1, *itSwap2);
itStoreIndex++;
}
//Move pivot to its final place
swap(*itStoreIndex, *itRight);
return (distance(liste.begin(), itStoreIndex));
}
void quicksort (int left, int right){
int pivotNewIndex=0;
list<int>::iterator ite=liste.begin();
if (left < right){
int pivotIndex = choose_pivot(left,right);
advance (ite,pivotIndex);
cout << "The pivot is " << *ite <<endl;
pivotNewIndex = partition(left, right, pivotIndex);
list_display();
cout << endl;
// Recursively sort elements smaller than the pivot
quicksort(left, pivotNewIndex - 1);
// Recursively sort elements at least as big as the pivot
quicksort(pivotNewIndex + 1, right);
}
}
int main()
{
list_initialization();
list_display();
cout << endl;
int left=0;
int right=size-1;
quicksort(left, right);
cout << "Sorted List :";
list_display();
cout << endl;
return 0;
}
quicksort.cpp:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <list>
using namespace std;
extern int array [];
int selectPivot( int const& left, int const& right);
int Partition(int left, int right, int pivotIndex);
void sorting (int left, int right);
int selectPivot( int const& left, int const& right){
int pivot;
pivot = rand()%(right-left) + left ;
return pivot;
}
int Partition(int left, int right, int pivotIndex){
int temp=0;
int storeIndex=left;
int pivotValue = array[pivotIndex];
temp=pivotValue;
pivotValue=array[right];
array[right]=temp;
for (int k=left; k<right; k++)
if (array[k] < pivotValue){
temp=array[k];
array[k]=array[storeIndex];
array[storeIndex]=temp;
storeIndex++;
}
temp = array[storeIndex];
array[storeIndex]=array[right];
array[right]=temp;
return storeIndex;
}
void sorting (int left, int right){
int pivotNewIndex=0;
if (left < right){
int pivotIndex = selectPivot(left,right);
pivotNewIndex = Partition(left, right, pivotIndex);
sorting(left, pivotNewIndex - 1);
sorting(pivotNewIndex + 1, right);
}
}
-------------- 1>------ Build started: Project: practical2, Configuration: Debug Win32 ------ 1>Compiling... 1>quicksort.cpp 1>Linking... 1>quicksort.obj : error LNK2001: unresolved external symbol "int * array" (?array@@3PAHA) 1>C:\Users\Amed\Documents\Visual Studio 2008\Projects\practical2\Debug\practical2.exe : fatal error LNK1120: 1 unresolved externals 1>Build log was saved at "file://c:\Users\Amed\Documents\Visual Studio 2008\Projects\practical2\practical2\Debug\BuildLog.htm" 1>practical2 - 2 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Upvotes: 1
Views: 2405
Reputation: 153
You could fix the unresolved external by changing it to: int array[1024];
Notes: 1024 was chosen arbitrarily as the array dimension. Choosing the dimension(s) of a statically defined C-style array is tricky at times. You can avoid this issue by switching to a dynamic structure like the Standard Library's std::vector class: std::vector nameOtherThanArray; // ;)
Naming the (global) variable "array" is probably too genetic to impart expected use in addition to possibly clashing with names in other libs. I did not attempt to code review the rest but if I were writing a real general purpose method, I'd want to pass in the structure being manipulated, or if it's just a temporary helper, declare it locally. Of course, like I said I didn't closely examine the rest of the code so your way may make sense for other reason.
Upvotes: 0
Reputation: 224864
You wrote extern int array[]
in quicksort.cpp
, but didn't actually define it anywhere. There's an unresolved symbol because it doesn't exist anywhere, so the linker can't find it to resolve it.
Upvotes: 4