Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]procedura che però ritorna un valore

    Salve a tutti,ho questo dubbio su una funzione che è allo stesso tempo una procedura ma ha anche un valore di ritorno.
    Ho scritto una funzione che legge una struttura da file,la struttura è questa:
    codice:
    typedef struct
    {
        int data [4];
        char *oggetto;
        char *testo;
    }nota;
    Nel file ci saranno elementi ordinati separati da newline,ecco un esempio:
    codice:
    4
    4
    4
    4
    ciao
    ciao
    Questa funzione deve leggere i valori dal file,allocare n strutture e ogni struttura contiene i valori letti da file.Ad esempio se nel file ci sono 12 righe+1 (significa che ci sono scritte 2 strutture),alloca 2 strutture e ritorna come valore il numero di strutture allocate.
    Ho testato la funzione,e pare che se all' interno della funzione provo a stampare tutti i valori letti me li stampa pure,ma se provo a farlo all' interno del main mi stampa numeri casuali grandissimi.
    Sembrerebbe che anche se ha l' effetto di allocare n strutture già contenenti valori,quest' effetto non viene prodotto.
    Questo è il codice della funzione:
    codice:
    int nota_read(FILE*fp,nota *ptr)
    {
        char *p;
        int i,k=0;
        if(num_line(fp)==0)
          ptr=NULL;
        else
          ptr=(nota*)calloc((num_line(fp)/6),sizeof(nota));
        while(cur_line(fp)<num_line(fp))
        {
            for(i=0;i<4;i++)
            {
                p=get_string(fp,p);
                (ptr[k]).data[i]=atoi(p);
                free(p);
            }
            (ptr[k]).oggetto=get_string(fp,(ptr[k]).oggetto);
            (ptr[k]).testo=get_string(fp,(ptr[k]).testo);
            k++;
        }
        free(p);
        return num_line(fp)/6;
    }
    Se nel main provo a scrivere:
    codice:
    int main()
    {
        nota *ptr;
        FILE *fp;
        fp=fopen("dati.txt","r");
        nota_read(fp,ptr);
        printf("%d",ptr[0].data[0]);          // e' un esempio per testare la funzione;
        fclose(fp);
        free(ptr);
        return 0;
    }
    Mi stampa un numero negativo,cosa potrebbe essere?

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Per quanto riguarda all'affermazione è una procedura che ritorna un valore
    e bene sapere che la distinzione tra funzione e procedura è che la prima ritorna un
    valore la seconda nessuno quindi avrà tipo di ritorno Void ,quindi se tipo di ritorno non è void
    è una funzione questo indipendentemente dal
    codice contenuto ("potrebbero tutte e due stampare "ciao mondo!" e la funzione ritornare
    ad esempio un intero per scrittura avvenuta e la procedura niente")


    Il tuo codice è complesso , ma volevo chiederti se hai pensato alle funzioni fwrite() e fread()
    per scrivere strutture su un file binario la cosa è semplice se si sa la dimensione in byte della
    strutta .Comunque sarebbe bene che tutte le strutture scritte nel file abbiano la stessa dimensione ,questo per facilitarne la lettura .
    un piccolo esempio con strutture non allocate dinamicamente:


    codice:
    typedef struct
    {
       char nome[20];
       int a;
    
    }nuovo_tipo;
    
    
    nuovo_tipo s;
    strcpy(s.nome,"testo");
    s.a=23;
    FILE *f;
    f=fopen("prova.txt","wb");
    if(f==NULL)
              perror("errore");
    fwrite(&s,sizeof(s),1,f);
    fclose(f);
    Tecnologia

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Il problema è che adesso ho già tutte le funzioni dell' agenda per leggere non in binario,mi sono reso conto che in binario è molto più comodo,infatti adesso me le studio così la prossima volta mi risparmio un bel pò di fatica
    Per adesso mi straconviene gestire un file txt,il problema era proprio che non davo il valore di ritorno,infatti adesso ho risolto facendo ritornare il puntatore già allocato.
    Il chè è però ridondante,nel senso che io gli passo un puntatore e ricevo come ritorno lo stesso puntatore ma allocato,vorrei sapere se si può fare senza far ritornare il puntatore,così posso usare come valore di ritorno ad esempio il numero di strutture allocate.
    Per adesso l' ho modificata così:
    codice:
    nota *nota_read(FILE*fp,nota *ptr)
    {
        char *p;
        int i,k=0;
        if(num_line(fp)==0)
          ptr=NULL;
        else
          ptr=(nota*)calloc((num_line(fp)/6),sizeof(nota));
        while(cur_line(fp)<num_line(fp))
        {
            for(i=0;i<4;i++)
            {
                p=get_string(fp,p);
                (ptr[k]).data[i]=atoi(p);
                free(p);
            }
            (ptr[k]).oggetto=get_string(fp,(ptr[k]).oggetto);
            (ptr[k]).testo=get_string(fp,(ptr[k]).testo);
            k++;
        }
        return ptr;
    }
    E mi ero dimenticato di dire che num_line è la funzione che legge il numero di righe del file,cur_line la funzione che dice in che riga mi trovo.
    Così è comodo da gestire,l' unica cosa è che so sicuramente che la prossima volta scriverò tutto in binario.
    Il token di riconoscimento è newline.

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.