[C++] Errore Selection Sort
Salve, ho un problema in questo codice: avendo già implementato una classe vettore con i soliti metodi set, get e size ho scritto il selection sort così:
Tuttavia sullo swap (di utility/algorithm) ottengo un errore: cannot bind non-const lvalue reference of type double& to an rvalue of type double. Come mai?
void selectionSort(Vettore &v) { for (int i = 0; i < v.getSize() - 1; ++i) { int min = i; for (int j=i+1; j<v.getSize(); ++j) { if (v.getComponent(j) < v.getComponent(min)) min = j; } swap(v.getComponent(i),v.getComponent(min)); } }
Tuttavia sullo swap (di utility/algorithm) ottengo un errore: cannot bind non-const lvalue reference of type double& to an rvalue of type double. Come mai?
Risposte
Cosa ritorna la funzione getComponent()?
Eccola qui:
double Vettore::getComponent(int i) const { assert((m_N>i) && "Error, index too large"); if(i<m_N) return m_v[i]; else { cerr << "Error, index " << i << "length " << m_N << endl; exit(2); } }
Dal momento che la funzione swap() si aspetta due l-values, dovresti far in modo che la funzione getComponent() ritorni un riferimento a double.
Per curiosità, il metodo set invece come è strutturato?
Per curiosità, il metodo set invece come è strutturato?
Il set è:
Ho modificato il codice, aggiungendo una referenza, e adesso il problema è diverso
nel linkaggio mi dice:
main.o:main.C:(.text+0xab): undefined reference to 'readDataFromFile(const char*, int, Vettore&)'
collect2.exe: error: ld returned 1 exit status
mingw32-make: *** [makefile:2: esercizio2.2] Error 1
Non capisco come sistemarlo. I pezzi di codice che credo siano rilevanti sono questi:
void Vettore::setComponent(int i, double x) { assert((m_N>i) && "Error, index too large"); if(i<m_N) m_v[i]=x; else { cerr << "Error, index " << i << "length " << m_N << endl; exit(1); } }
Ho modificato il codice, aggiungendo una referenza, e adesso il problema è diverso

main.o:main.C:(.text+0xab): undefined reference to 'readDataFromFile(const char*, int, Vettore&)'
collect2.exe: error: ld returned 1 exit status
mingw32-make: *** [makefile:2: esercizio2.2] Error 1
Non capisco come sistemarlo. I pezzi di codice che credo siano rilevanti sono questi:
MAIN int ndata=atoi(argv[1]); char* filename=argv[2]; Vettore v; readDataFromFile(filename,ndata,v);con la funzione readDataFromFile implementata così:
void readDataFromFile(const char *file, Vettore &v) { ifstream in(file); if(!in) { cout << "Cannot open file" << endl; exit(0); } else { for(int k=0; k<v.getSize(); k++) { double value; in >> value; v.setComponent(k, value); if(in.eof()) { cout << "End of file, exiting" << endl; exit(0); } } } exit(0); }
Nel main la tua funzione riceve tre argomenti invece dei due che si trovano nella definizione della funzione. Siccome non sembra che [tt]ndata[/tt] sia utile, allora dovresti semplicemente usare [tt]readDataFromFile(filename,v);[/tt].
Caspita, hai ragione, ho un parametro in più
grazie per l'aiuto, chissà quanto sarei stato a cercare l'errore... il problema è che questo codice è l'update di un altro, e ho lasciato dei rimasugli nella modifica
](/datas/uploads/forum/emoji/eusa_wall.gif)
