[C++] Errore Selection Sort

Nagato2
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ì:

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
Super Squirrel
Cosa ritorna la funzione getComponent()?

Nagato2
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);
	}
}

Super Squirrel
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?

Nagato2
Il set è:

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

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);
}

apatriarca
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].

Nagato2
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 :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.