PDA

Visualizza la versione completa : [C] Passaggio ad una funzione di un puntatore ad un array di struct allocato dinamicamente


noob9
06-11-2016, 13:54
Salve a tutti, sono nuovo sul forum e apro questa discussione perché non sono riuscito a trovare niente di già aperto che mi potesse aiutare.

Sto scrivendo un programma in C, e sono bloccato in un punto. Ho creato una struct, che deve contenere i dettagli di un catalogo; nel main ho dichiarato un puntatore che punta alla struct. Ho allocato dinamicamente la struct, così da avere un array di struct allocate dinamicamente, prendendo da un file il numero di righe, e quindi il numero di strutture da allocare. Ho allocato dinamicamente anche i campi della struct presi da file, ma fin qui nessun problema.

(Questa parte funziona, l'ho testata, alloca e acquisisce bene tutti i dati)



typedef struct cat{
char *codice, *nome_prodotto, *categoria, *data;
int prezzo,unita;
}catalogo;


int main(int argc, const char * argv[]) {
int n_prodotti=0, i=0;
char codice_curr[10], nome_prodotto_curr[25], categoria_curr[25], data_curr[10];
FILE *fp;

catalogo *p_cat;

fp=fopen("catalogo.txt", "r");

fscanf(fp, "%d", &n_prodotti);

p_cat= (catalogo *)malloc((n_prodotti)*sizeof(catalogo));


while (i<n_prodotti) {

fscanf(fp, "%s %s %s %d %d %s", codice_curr, nome_prodotto_curr, categoria_curr, &p_cat[i].prezzo,&p_cat[i].unita, data_curr);

p_cat[i].codice=(char *)malloc((strlen(codice_curr))*sizeof(char));
p_cat[i].nome_prodotto=(char *)malloc((strlen(nome_prodotto_curr))*sizeof(char) );
p_cat[i].categoria=(char *)malloc((strlen(categoria_curr))*sizeof(char));
p_cat[i].data=(char *)malloc((10)*sizeof(char));
strncpy(p_cat[i].codice, codice_curr, strlen(codice_curr));
strncpy(p_cat[i].nome_prodotto, nome_prodotto_curr, strlen(nome_prodotto_curr));
strncpy(p_cat[i].categoria, categoria_curr, strlen(categoria_curr));
strncpy(p_cat[i].data, data_curr, 10);
i++;
}

Adesso dovrei passare (credo si possa fare) il puntatore all'array di struct ad una funzione, per poter effettuare, tramite la funzione, la stampa dell'array di struct.
Ho provato a dichiarare questa funzione, ma mi da errori continui ,tra cui "conflicting type for stampa", e dato che abbiamo appena affrontato l'argomento allocazione dinamica e puntatori, non so proprio come muovermi.



void stampa(struct str *pt, int n_prod);

int main(int argc, const char * argv[]){...}


void stampa (struct str *pt, int n_prod) {
//stampa
}


Quello che vorrei riuscire a fare, è passare il puntatore di array di struct alla funzione e stampare ogni campo di ogni struct.

Spero sia stato chiaro nella spiegazione, grazie in anticipo.

oregon
06-11-2016, 16:34
Chiami la funzione stampa passando il vettore, quindi

stampa(p_cat, ....)

Che problema hai?

noob9
06-11-2016, 17:01
Ho risolto. In pratica ho capito che devo passare alla funzione un puntatore generico, ma che punti alla struct cat che ho dichiarato fuori dal main, altrimenti se do un nome generico alla struct nella funzione, non funziona. Non posso scrivere


void stampa (struct strgenerica *pt,int n_prod) {..} <---
Ma devo scrivere cosi.}




struct cat{ <----
char *codice, *nome_prodotto, *categoria, *data;
int prezzo,unita;
};
void stampa(struct cat *pt,int n_prod);


int main(int argc, const char * argv[]) {
...
stampa(p_cat, n_prodotti);
...
}


void stampa (struct cat *pt,int n_prod) {...} <----

Però ho ancora un po' di dubbi.
Se per esempio avessi dichiarato la struct all'interno del main



int main(int argc, constchar * argv[]) {
struct cat{
char *codice, *nome_prodotto, *categoria, *data;
int prezzo,unita;
};
}
come avrei dovuto scrivere la funzione e passare il puntatore alla struct, visto che al di fuori del main non è visibile il nome della struct se dichiarata all'interno di esso?

Oppure le struct, per usarle in questo modo devono essere dichiarate al di fuori del main, come ho fatto io?
Così non diventano una sorta di 'variabili globali'? :dhò:
Grazie per la risposta

Loading