ciao a tutti
vorrei implementare in c una struttura dati, tipo stack o lista, però vorrei slegarmi dal tipo di dati contenuto, in modo da poterla utilizzare per inserirci struct,int,double,char, ecc ecc
è possibile?
grazie nik
ciao a tutti
vorrei implementare in c una struttura dati, tipo stack o lista, però vorrei slegarmi dal tipo di dati contenuto, in modo da poterla utilizzare per inserirci struct,int,double,char, ecc ecc
è possibile?
grazie nik
"durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."
http://www.kumbe.it
Di solito la soluzione piu` comune in C e` una cosa del genere...Originariamente inviato da nik600
vorrei implementare in c una struttura dati, tipo stack o lista, però vorrei slegarmi dal tipo di dati contenuto, in modo da poterla utilizzare per inserirci struct,int,double,char, ecc ecc
è possibile?
codice:struct element { /* ... */ void *data; int data_size; /* ... */ };
"Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".
ok, e poi ogni volta che estraggo lelemento faccio un cast, giusto?
"durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."
http://www.kumbe.it
la crei con malloc esempioOriginariamente inviato da nik600
ok, e poi ogni volta che estraggo lelemento faccio un cast, giusto?
struct pippo{
int *c;
}
struct pippo s,v;
s.c=(int *)malloc(sizeof(int)*12213);
v.c=(int *)malloc(sizeof(int)*113);
e poi ci accedi come *(s.c+23) o *(v.c+1);
infine devi ricordarti di liberare la memoria..
spero di non aver sbagliato sintassi..
ciao
io ho fatto una cosa di questo tipo:
struttura dati
funzionicodice:typedef struct ArrayList{ int initialized;//variabile di controllo float growth;//crescita in percentuale int size;//dimensione effettiva int indice;//indice di inserimento void **db;//array di elementi }ArrayList; /* funzione che fa crescere la dimensione dell'array */ void cresci(ArrayList *); /* inizializza la struttura dati */ void initialize(ArrayList *,int,float); void add_element(ArrayList *,void *); void print_array(ArrayList *); void copia(void **from,int size,void **to);
maincodice:#include "funzioni.h" void initialize(ArrayList *array,int size,float growth){ array->growth=growth; array->size=size; array->indice=0; //alloco la memoria richiesta array->db=(void *)malloc(sizeof(void *)*array->size); array->initialized=1;//segno la struttura dati come inizializzata } void cresci(ArrayList *array){ printf("cresco\n"); int size_tmp=array->size; //incremento la dimensione array->size+=(array->size*array->growth); //creo il nuovo database void **new_db=(void *)malloc(sizeof(void *)*array->size); //copio i dati dal vecchio nel nuovo copia(array->db,size_tmp,new_db); //elimino il vecchio free(array->db); //assegno il nuovo alla struttura dati array->db=new_db; } void copia(void **from,int size,void **to){ int i=0; printf("copio\n"); for(i=0;i<size;i++){ to[i]=from[i]; } printf("fine copia\n"); } void add_element(ArrayList *array,void *element){ //controllo che la struttura sia stata inizializzata if(array->initialized){ printf("elemento = %i\n",(int)element); if(array->indice==array->size){ cresci(array); array->db[array->indice]=element; array->indice++; }else{ array->db[array->indice]=element; array->indice++;//incremento l'indice } }else{ printf("attenzione la struttura dati non è stata inizializzata\n"); } } void print_array(ArrayList *array){ int i; for(i=0;i<array->indice;i++){ printf("elemento %i=%i\n",i,(int)array->db[i]); } }
codice:#include <stdio.h> #include "src/arraylist.c" int main(){ ArrayList *a; a=(ArrayList *)malloc(sizeof (ArrayList)); initialize(a,10,0.1); int i=0; int *element; for(i=0;i<10;i++){ element=(int *)malloc(sizeof (int)); *element=i; //printf("elemento- %i=%i\n",i,*element); add_element(a,element); } printf("stampo:\n\n"); print_array(a); return 0; }
però qando eseguo ottengo questo:
in pratica nella funzione add_elemento perdo il valore di i!codice:elemento = 134520984 elemento = 134521000 elemento = 134521016 elemento = 134521032 elemento = 134521048 elemento = 134521064 elemento = 134521080 elemento = 134521096 elemento = 134521112 elemento = 134521128 stampo: elemento 0=134520984 elemento 1=134521000 elemento 2=134521016 elemento 3=134521032 elemento 4=134521048 elemento 5=134521064 elemento 6=134521080 elemento 7=134521096 elemento 8=134521112 elemento 9=134521128
dove sbaglio?
grazie nik
"durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."
http://www.kumbe.it
ma guarda che X *c e' un puntatore ad un indirizzo di tipo X (anche se questo non e' propriamente vero)
se tu vuoi un array di elementi X(sia X una struttura o cio' che vuoi)
ti basta un puntatore *c e non un **c (che definisce un array di array)
infatti quando fai
(X *)malloc(sizeof(X)*n)
n e' la grandezza dell'area di memoria puntata da c (o se vuoi la grandezza dell' array di oggetti X a cui punta c),
quindi credo(non ho guardato bene)
che il tuo errore sia
void **db;//array di elementi
che deve diventare void *db;
ciao
ti ringrazio per la segnalazione, ho capito che prima di complicarmi la vita con le cose astratte è meglio vedere prima come funzionano in pratica...
"durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."
http://www.kumbe.it