Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    6

    [C] Passaggio ad una funzione di un puntatore ad un array di struct allocato dinamicamente

    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)


    codice:
    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.


    codice:
    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.
    Ultima modifica di noob9; 06-11-2016 a 15:09

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Chiami la funzione stampa passando il vettore, quindi

    stampa(p_cat, ....)

    Che problema hai?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    6
    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

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

    codice:
    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

    codice:
    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'?
    Grazie per la risposta
    Ultima modifica di noob9; 06-11-2016 a 18:03

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.