PDA

View Full Version : [C] Problema puntatori


Negative_creep
02-02-2011, 17:30
Ciao a tutti, ho questa struttura dati:

struct a{
int x;
int y;
float z;
}*vett;

vett=calloc(100,sizeof(struct a));

Quindi avrò vett[0].z = 55.5
vett[1].z = 43.5
vett[2].z = 62.4

ecc..

Ho bisogno di ordinare vett in base al valore di z (che è un float) usando il mergesort ma non riesco a passare l'indirizzo di vett
alla funzione.

mergesort((*vett).z,0,n-1); /* Dove n è in numero degli elementi */

Sono sicuro che (*vett).z non va bene (infatti il compilatore mi segnala "Incompatible type for argument 1 of mergesort) ma non so come passare quell'indirizzo alla funzione che si aspetta un vettore di float.

- Lke -
02-02-2011, 18:50
Ciao a tutti, ho questa struttura dati:

struct a{
int x;
int y;
float z;
}*vett;

vett=calloc(100,sizeof(struct a));

Quindi avrò vett[0].z = 55.5
vett[1].z = 43.5
vett[2].z = 62.4

ecc..

Ho bisogno di ordinare vett in base al valore di z (che è un float) usando il mergesort ma non riesco a passare l'indirizzo di vett
alla funzione.

mergesort((*vett).z,0,n-1); /* Dove n è in numero degli elementi */

Sono sicuro che (*vett).z non va bene (infatti il compilatore mi segnala "Incompatible type for argument 1 of mergesort) ma non so come passare quell'indirizzo alla funzione che si aspetta un vettore di float.
La sparo:
mergesort(*((*vett).z),0,n-1);

Prova, al massimo non va :P

tuccio`
02-02-2011, 18:55
ma è la funzione mergesort di stdlib.h?

se sì, ti basta scrivere una funzione che confronta, tipo:


int compare(const void * a, const void *b)
{
struct a *v1, *v2;
v1 = (struct a*)a;
v2 = (struct a*)b;
if (v1.z == v2.z)
{
return 0;
}
else if (v1.z > v2.z)
{
return 1;
}
else
{
return -1;
}
}


e poi chiamare la funzione con


mergesort(vett, n, sizeof(struct a), compare);

Negative_creep
02-02-2011, 19:41
Grazie delle risposte, in realtà ho dovuto cambiare il prototipo e la funzione del mergesort in quanto l'errore è concettuale,

vett[] è un vettore di strutture di tipo struct a che è ben diverso da
vett[1].z ossia un campo della struttura di tipo float.

La funzione mergesort come la qsort() si aspetta un vettore di elementi non un singolo elemento :stordita:

Grazie ancora per l'aiuto ;)