PDA

Visualizza la versione completa : [C] Operatori not e ritorno funzioni


Metallica
17-11-2008, 12:09
Ho un programma che a un certo punto dell'esecuzione ha due while


while (a[i].id<x.id) i++;
while (a[j].id>x.id) j--;

Per vari motivi mi serve generalizzare il confronto interno al while, utilizzando una funzione:


int confronta(int i, myStruct *a, myStruct x)
{
return a[i].id < x.id;
}


Riscrivo il primo while come


while (confronta(i, ID, a, x)) i++;

Tutto Ok!!! Ora a rigor di logica il secondo while dovrebe essere il risultato della funzione però negato, in quanto stavolta il confronto non è minore come nella funzione ma è maggiore, quindi il risultato va negato e l'indice da passare non è più i ma j, quindi:


while (!confronta(j, ID, a, x)) j--;

Ma così non funziona, idee???

oregon
17-11-2008, 12:12
Se non e' < (minore) allora e' >= (maggiore o uguale), non "strettamente" maggiore ...

Questo puo' darti problemi ...

Pero' non vedo motivi per usare quella funzione ...

Metallica
17-11-2008, 12:28
Quei due while fanno parte di un algoritmo di quicksort. Ho anche altri due algoritmi di ordinamento. Ognuno degli algoritmi deve poter ordinare su 4 campi di una struttura.
Se volessi fare a meno di quella funzione ogni algoritmo di ordinamento, avrebbe, nelle righe di confronto codice extra enorme, pieno di if per capire che campo della struttura scegliere e per capire se usare uno strcmp nel caso confronto stringhe o un > nel caso di confronto interi.

Stoicenko
17-11-2008, 12:45
la funzione confronta ritorna un int.. non credo proprio che l'operatore di negazione funzioni..

Metallica
17-11-2008, 12:52
Ho provato scrivendo

int a = 1;
printf("%D", !a);

e funziona.

Cmq ho risolto modificando:


int confronta(int i, myStruct *a, myStruct x, int *ritorno)
{
ritorno[0] a[i].id < x.id;
ritorno[0] a[i].id > x.id;
}
// ...
int r[2];
while (confronta(i, ID, a, x, r), r[0]) i++;
while (confronta(j, ID, a, x, r), r[1]) j--;


Non è molto elegante ma funziona!!!

oregon
17-11-2008, 13:28
Ma cosa vuol dire questo



ritorno[0] a[i].id < x.id;
ritorno[0] a[i].id > x.id;


?? :confused:

Metallica
17-11-2008, 19:35
Originariamente inviato da oregon
Ma cosa vuol dire questo



ritorno[0] a[i].id < x.id;
ritorno[0] a[i].id > x.id;


?? :confused:
La seconda riga è:


ritorno[0] a[j].id > x.id;

:D

oregon
17-11-2008, 19:51
Ma anche fosse, ripeto, che vuol dire?

Loading