[C++] Errore Selection Sort

Messaggioda Nagato » 02/02/2019, 13:18

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

Codice:
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?
Nagato
Junior Member
Junior Member
 
Messaggio: 60 di 220
Iscritto il: 08/06/2018, 20:47

Re: [C++] Errore Selection Sort

Messaggioda Super Squirrel » 02/02/2019, 14:18

Cosa ritorna la funzione getComponent()?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 341 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Errore Selection Sort

Messaggioda Nagato » 02/02/2019, 14:29

Eccola qui:

Codice:
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);
   }
}
Nagato
Junior Member
Junior Member
 
Messaggio: 61 di 220
Iscritto il: 08/06/2018, 20:47

Re: [C++] Errore Selection Sort

Messaggioda Super Squirrel » 02/02/2019, 16:10

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?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 342 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Errore Selection Sort

Messaggioda Nagato » 02/02/2019, 16:43

Il set è:

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

Codice:
MAIN
int ndata=atoi(argv[1]);
   char* filename=argv[2];

   Vettore v;
   readDataFromFile(filename,ndata,v);
con la funzione readDataFromFile implementata così:

Codice:
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);
}
Nagato
Junior Member
Junior Member
 
Messaggio: 63 di 220
Iscritto il: 08/06/2018, 20:47

Re: [C++] Errore Selection Sort

Messaggioda apatriarca » 03/02/2019, 17:16

Nel main la tua funzione riceve tre argomenti invece dei due che si trovano nella definizione della funzione. Siccome non sembra che ndata sia utile, allora dovresti semplicemente usare readDataFromFile(filename,v);.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5180 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C++] Errore Selection Sort

Messaggioda Nagato » 03/02/2019, 23:53

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
Nagato
Junior Member
Junior Member
 
Messaggio: 64 di 220
Iscritto il: 08/06/2018, 20:47


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite