Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C] Vettore di struct

  1. #1

    vettore di struct

    ho le seguenti strutture

    codice:
    typedef struct studente
    {
     char nome[200];
     char cognome[200];
     int  matricola;
     char iscrizione[200];
    } Studente;
    
    typedef struct studente
    {
     char *nome:
     char *cognome;
     int  *matricola;
     char *iscrizione;
    } Studente;
    con la prima non mi funzione il bubblesort (devo ordinare un vettore di studenti tramite il campo cognome); con la seconda nn mi funziona il caricamento da file.
    Per quanto riguarda il riempimento del vettore di strutture utilizzando la notazione char *s (puntatore a char) non permette il riempimento "corretto" dei campi della struttura, cosa che non accade utilizzando la notazione char s[200] (vettore di char, che è un puntatore all'indirizzo base del vettore); per quanto riguarda il secondo caso l'ordinamento tramite l'algoritmo del bubblesort funziona solamente se si usa la notazione char *s e non char s[200].

    codice:
    void sort(Studente s[], int dim)
    {
        Studente temp;
        int i, ordinato=0;
    
        while(!ordinato)
        {
            dim--;
            ordinato=1;
            for(i=0;i< dim;i++)
                if(strcmp(s[i].cognome,s[i+1].cognome)>0)
                {
                    temp.nome=s[i].nome; //incompatible types when assigning to type ‘char[200]’ from type ‘char *’
                    temp.cognome=s[i].cognome;
                    temp.matricola=s[i].matricola;
                    temp.iscrizione=s[i].iscrizione;
                    s[i].nome=s[i+1].nome;
                    s[i].cognome=s[i+1].cognome;
                    s[i].matricola=s[i+1].matricola;
                    s[i].iscrizione=s[i+1].iscrizione;
                    s[i+1].nome=temp.nome;
                    s[i+1].cognome=temp.cognome;
                    s[i+1].iscrizione=temp.iscrizione;
                    s[i+1].matricola=temp.matricola;
                    ordinato=0;
                }
        }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    temp.nome=s[i].nome;
    In C l'assegnazione delle stringhe si fa con la funzione

    strcpy

    e non in quel modo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non essendo abituato al C non la ricordavo

    ora ritornando sempre allo stesso vettore...
    codice:
    s=(Studente *) calloc(*dim, sizeof(Studente));
        for(i=0;i<*dim;i++)
            if(fscanf(fp,"%s %s %d %s",s[i].nome, s[i].cognome, &s[i].matricola, s[i].iscrizione)!=4)
            {
                perror(nomefile);
                *dim=-1; return NULL;
            }
    perchè con definendo la struct nel primo modo mi funziona e nell'altro no??

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da 00disaster00

    perchè con definendo la struct nel primo modo mi funziona e nell'altro no??
    Ti ripeto ... se usi i puntatori, la memoria deve essere allocata prima.

    Leggi sul tuo libro il capitolo riguardante i puntatori.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    vero non ci pensavo, giustamente non saprebbe quanta memoria allocare ...ma la cosa ke mi lascia più perplesso è che il compilatore me lo lascia compilare tranquillamente..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Il problema dell'allocazione è a runtime. Il compilatore non sa se la memoria è disponibile prima dell'esecuzione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Grazie per la spiegazione oregon....Sono riuscito a risolvere il problema.
    Sto utilizzando lo stesso codice con un altra struct ma non riesce il caricamento errore: "Segmentation fault"; il codice è si può dire preciso eccoli:

    codice:
    typedef struct studente
    {
     char *nome;//[200];
     char *cognome;//[200];
     int  matricola;
     char *iscrizione;//[200];
    } Studente;
    
    Studente* caricamento(char *nomefile, int *dim)
    {
        FILE *fp; Studente *s; int i;
        fp=fopen(nomefile, "r");
        if(fp==NULL)
        {   perror(nomefile);
            *dim=-1; return NULL;
        }
        if(fscanf(fp,"%d",dim)!=1)
        {
            perror(nomefile);
            *dim=-1; return NULL;
        }
    
        s=(Studente *) calloc(*dim, sizeof(Studente));
        for(i=0;i<*dim;i++){
            s[i].nome=(char *) malloc(MAXLENGTH*sizeof(char));
            s[i].cognome=(char *) malloc(MAXLENGTH*sizeof(char));
            s[i].iscrizione=(char *) malloc(MAXLENGTH*sizeof(char));
    
            if(fscanf(fp,"%s %s %d %s",s[i].nome, s[i].cognome, &s[i].matricola, s[i].iscrizione)!=4)
            {
                perror(nomefile);
                *dim=-1; return NULL;
            }
        }
        fclose(fp);
        return s;
    }
    
    int main(void)
    {
        Studente *s;
        int dim, i;
        s=caricamento("studenti.txt",&dim);
    //    sort(s,dim);
        for(i=0; i<dim; i++)
            printf("%s %s %d %s",s[i].nome, s[i].cognome, s[i].matricola, s[i].iscrizione);
        return 0;
    }

    codice:
    typedef struct oggetto
    {
        char *fornitore;
        double prezzo;
        int codice;
        int quantita;
    
    } OGGETTO;
    
    OGGETTO* caricamento(char *nomefile, int *dim)
    {
        FILE *fp; OGGETTO *v; int i;
        fp=fopen(nomefile, "r");
        if(fp==NULL){
            perror(nomefile);
            *dim=-1;
            return NULL;
        }
        if(fscanf(fp,"%d",dim)!=1){
            perror(nomefile);
            *dim=-1;
            return NULL;
        }
    
        v=(OGGETTO *) calloc(*dim, sizeof(OGGETTO));
        for(i=0; i< *dim; i++)
        {
            v[i].fornitore=(char *) malloc(MAXLENGHT*sizeof(OGGETTO));
            if(fscanf(fp,"%s %lf %d %d",v[i].fornitore, &v[i].prezzo, &v[i].codice, &v[i].quantita)!=4);
            {perror(nomefile); *dim=-1; return NULL;}
        }
        fclose(fp);
        return v;
    }
    
    int main(int argc, char** argv) {
        OGGETTO *v; int *dim, i;
        v=caricamento("magazzino.txt",dim);
        /*for(i=0; i<dim; i++)
            printf("%s %lf %d %d", v[i].fornitore, v[i].prezzo, v[i].codice, v[i].quantita);
        */return (EXIT_SUCCESS);
    }

    Il primo blocco funziona; il secondo no...non riesco a vedere nessuna differenza e quindi il motivo per cui uno parta e l'altro no....grazie in anticipo.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Deve essere

    int dim;

    e poi passi

    &dim

    e non

    int *dim;

    e passi

    dim
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Grazie mille solito errore di distrazione

    codice:
    if(fscanf(fp,"%s %lf %d %d",v[i].fornitore, &v[i].prezzo, &v[i].codice, &v[i].quantita)!=4);
            {perror(nomefile); *dim=-1; return NULL;}
        }
    ora in questo blocco mi fa eseguire l'if anche se non dovrebbe dato che il file di testo è il seguente:

    codice:
    3
    Pfannu 23.00 34234 2
    Canu 2.44 9903 10
    asd 3.44 04932 3

  10. #10
    ps: il file è si può dire preciso a quello da cui vengono caricati i dati dell'altro vettore

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.