[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
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