PDA

Visualizza la versione completa : [c++] swap di puntatori


bako
14-12-2004, 18:56
void swap(lemma * v1,lemma * v2){
lemma * vtemp;
vtemp=v1;
v1=v2;
v2=vtemp;
}

chiamata:swap (array[i], array[j]);


giusta questa funzione? dovrebbe fare lo swap .. ma secondo me nn va .. alla fine tutto uguale..

LeleFT
14-12-2004, 19:00
Io aggiungerei i caratteri &:


void swap(lemma * v1,lemma * v2){
lemma * vtemp;
vtemp=v1;
v1=v2;
v2=vtemp;
}

chiamata:swap (&array[i], &array[j]);

Ciao. :ciauz:

bako
14-12-2004, 19:04
no nn va .. diemnticavo .. quello che passo io sono delle struct puntate da un vettore di puntatori .. :oVVoVe:
cio
ho un vettore di struct principale e poi un vettore che punta a questo vettore di struct, e io devo ordinare il vettore di puntatori ..

pprllo
14-12-2004, 20:51
Prova a dereferenziare:


void swap(lemma * v1,lemma * v2){
lemma vtemp;
vtemp=*v1;
*v1=*v2;
*v2=vtemp;
}

pprllo
14-12-2004, 20:58
Anche questo funziona, ma scambia i puntatori e non i valori, che mi sembra sia quello che ti serve:



void swap(lemma**a, lemma**b)
{
lemma *temp;
temp = *a;
*a = *b;
*b = temp;
}

swap(&a, &b);

pprllo
14-12-2004, 21:01
Entrambi i metodi ottengono lo stesso risultato in modo diverso: il primo scambiando i valori, il secondo i puntatori. Credo che per strutture dati complesse, scambiare i puntatori sia pi veloce che non scambiare i valori.

bako
15-12-2004, 22:01
ok lo swap va ma nn sono capace di ordinare :dh: ho lasciato perdere il quick sort e ho provato con il bubble sort


void bubblesort(lemma * x[], int n) {
lemma * vtemp;
for (int k=n-1; k>=0; k--)
for (int i=0; i<k; i++){
if (x[i]->italiano < x[i+1]->italiano) {
// exchange elements
swap(&x[i], &x[i+1]);

}
}
}

in entrata ho il vettore (->italiano)inizializzato cos
z io ciao a b
e dopo il sort cos :dh:
b a ciao io z

pprllo
15-12-2004, 22:45
Credo che tu debba usare strcmp(x[i]->italiano, x[i+1]->italiano). Gli operatori di confronto sulle stringhe non funzionano bene.

bako
15-12-2004, 22:49
gi .. dopo ore c'ero arrivato .. adesso devo sistemare il quick sort ..


void quicksort (int left, int right, lemma * array[]) {
int i = 0, j = 0;
char pivot[128];
lemma * vtemp;

i = left;
j = right;
strcpy(pivot,array[(left + right) / 2]->italiano);
do {
while (strcmp(array[i]->italiano,pivot) < 0 )
i++;
while (strcmp(pivot,array[j]->italiano)<0)
j--;
if (i <= j) {
swap(array[i],array[j]);
i++;
j--;
};
}
while (!(i > j));
if (left < j)
quicksort(left, j, array);
if (i < right)
quicksort(i, right, array);
}

in teoria, credo che vada a leggere fuori dalla memoria e quindi winzoz mi da errore

pprllo
15-12-2004, 22:49
Ah no aspetta ho capito: Il secondo ciclo fatto male:



for (int i=0; i<k; i++)


Poich k viene decrementato ad ogni ciclo, i cicli successivi al primo non eseguono una scansione completa dell'array ma solo parziale !!! Inoltre, usa comunque strcmp();

Loading