pingumen96 (Normal User)
Newbie
Messaggi: 9
Iscritto: 30/10/2013
|
Ciao a tutti, sono qui per chiedervi un aiuto.
Sto provando a creare un dizionario in C++ (molto semplice, sono agli inizi) e sono arrivato alla necessità di ordinare le parole che vengono inserite nella struct.
Avrei intenzione di usare qualche libreria già presente per ordinare l'array di struct (per le parole) basandomi sul nome della parola, che è una variabile all'interno della struct.
Come fare?
Grazie in anticipo.
|
|
ZioCrocifisso (Member)
Pro
Messaggi: 135
Iscritto: 06/03/2013
|
La funzione "qsort" della stdlib ti permette di ordinare un array qualunque usando una funzione comparatrice a tua scelta.
|
|
pingumen96 (Normal User)
Newbie
Messaggi: 9
Iscritto: 30/10/2013
|
Postato originariamente da ZioCrocifisso:
La funzione "qsort" della stdlib ti permette di ordinare un array qualunque usando una funzione comparatrice a tua scelta. |
Mhm, ok.
E un esempio di funzione comparatrice quale può essere?
Boh, tipo tra stringhe. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Ultima modifica effettuata da nessuno il 23/08/2014 alle 0:31
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
pingumen96 (Normal User)
Newbie
Messaggi: 9
Iscritto: 30/10/2013
|
Grazie mille, provo appena possibile
|
|
pingumen96 (Normal User)
Newbie
Messaggi: 9
Iscritto: 30/10/2013
|
Allora, ho riscontrato alcuni errori, copio direttamente tutto il programma.
Codice sorgente - presumibilmente C++ |
#include <iostream> #include <string> #include <stdlib.h> using namespace std; struct parole { string nome, definizione; } dizio1[10000]; char risp='s'; int I=0; int compare(const void *a,const void *b) { return ( *(int*)a - *(int*)b ); } bool cont() { int tentativi=1; while(tentativi<4) { cout<<"Vuoi continuare? (s/n)"<<endl; char risp=0; cin>>risp; switch(risp) { case 's': return true; case 'n': return false; default: cout<<"La risposta inserita non e' corretta. "<<tentativi<<"o tentativo su 4."<<endl; tentativi++; } } cout<<"Lo prendero' come un no."<<endl; return false; } void caricamento() { while(cont==true&&I<20) { cout<<"Inserire nome parola"<<endl; cin>>dizio1[I].nome; cout<<"Definizione: "<<endl; getline(cin,dizio1[I].definizione); getline(cin,dizio1[I].definizione); I++; cont(); } }; void ordinamento() { int n; qsort (dizio1.nome, I, sizeof(string), compare); return 0; } void visualizzazione() { for(I=0;I<20;I++) { if(dizio1[I].nome==""); else cout<<endl<<"- - - -"<<dizio1[I].nome<<" - "<<dizio1[I].definizione<<endl<<endl; }; } int main() { caricamento(); visualizzazione(); ordinamento(); cout<<"Ora verra' visualizzato il dizionario in ordine alfabetico:"; visualizzazione(); }
|
Un errore è nella riga 46, non va bene il confronto con la booleana e non ho idea del motivo.
Idem con l'altro errore alla riga 61:
"error: request for member 'nome' in 'dizio1', which is of non-class type 'parole [10000]'"
e 62:
"error: return-statement with a value, in function returning 'void' [-fpermissive]|"
|
|
ZioCrocifisso (Member)
Pro
Messaggi: 135
Iscritto: 06/03/2013
|
Per il primo errore: cont è una funzione, anche se è senza argomenti devi comunque chiamarla con () se vuoi ottenere il valore booleano che restituisce.
Per il secondo: dizio1 è un array di struct parole, non un singolo struct. Non puoi ottenere un campo da un array di struct, devi usare dizio1 e basta. Inoltre la tua funzione compare è sbagliata, dovresti usare quella che ti ha suggerito nessuno specificando però il campo della struct.
Per il terzo: beh mi sembra abbastanza chiaro, non puoi restituire un valore in una funzione che non dovrebbe (void).
|
|
pingumen96 (Normal User)
Newbie
Messaggi: 9
Iscritto: 30/10/2013
|
Postato originariamente da ZioCrocifisso:
Per il primo errore: cont è una funzione, anche se è senza argomenti devi comunque chiamarla con () se vuoi ottenere il valore booleano che restituisce.
Per il secondo: dizio1 è un array di struct parole, non un singolo struct. Non puoi ottenere un campo da un array di struct, devi usare dizio1 e basta. Inoltre la tua funzione compare è sbagliata, dovresti usare quella che ti ha suggerito nessuno specificando però il campo della struct.
Per il terzo: beh mi sembra abbastanza chiaro, non puoi restituire un valore in una funzione che non dovrebbe (void). |
Ok, il primo errore mi è chiarissimo, idem il terzo e li ho corretti.
Per il secondo non ci sono con la funzione compare.
La sintassi ok, è questa
Codice sorgente - presumibilmente C++ |
int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); }
|
ma come la adatto? |
|
ghostmars919 (Member)
Newbie
Messaggi: 9
Iscritto: 06/09/2012
|
Devi passare due parametri alla funzione... In questo caso le parole che devono essere confrontate per poi poterle ordinare.
|
|