Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: [C] esercizio struct

  1. #1

    [C] esercizio struct

    ciao a tutti, ho nuovamente un problema sulle struct.
    la funzione deve rimanere tale quindi le vostre correzioni vanno apportate o dentro il main o dentro la funzione ma i valori che questa accetta non possono essere mutati.

    posto il codice e allego il file da cui vanno letti dei valori.
    a fine esercizio si deve avere un puntatore a variabile unsigned int che indica il numero di righe del file che viene passato come secondo parametro alla funzione. la funzione deve restituire un puntatore alla struct che abbia dentro tutti i valori del file. il primo parametro da passare alla funzione + il nome del file che va poi aperto dentro la funzione.
    non capisco dove sbaglio. quando vado a gestire struct e malloc dentro le funzioni mi cominciano i guai, che diamine.
    grazie in anticipo a chi vorrà dedicarmi un pò del suo tempo.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct dato {
        double valore;
        unsigned int classe;
    };
        struct dato *p;
    
    
    struct dato *read_dati (const char *filename, unsigned int *pn) {
        
    
    
        FILE *fp;
        unsigned int x=0;
        unsigned int tmp1;
        double tmp2;
        fp=fopen(filename, "rt");
        if(fp==NULL)
            exit(EXIT_FAILURE);
        while(feof(fp)==0) {
            fscanf(fp, "%lf %lu", &tmp2, &tmp1);
            x++;
        }
        pn=&x;
        p=malloc(x*sizeof(struct dato));    
        fread(p, sizeof(struct dato), x, fp);
        for(tmp1=0; tmp1<x; tmp1++)
            printf("%lf %lu \n", p[tmp1].valore, p[tmp1].classe);
        return p;
    }
    
    
    int main(void) {
        char nomefile[]="dati1.txt";
        unsigned int *puntatore=0;
        read_dati(nomefile, puntatore);
        }
    File allegati File allegati

  2. #2
    PS: se non si capisce il problema:basta eseguire il programma, i valori a cui punta il nostro puntatore sono indirizzi. non prende i valori dall'fread

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Scusa, non ho capito che vorresti fare. Leggi con la fread da un file di testo? Che senso ha?

    E a che serve pn? E cosa vuoi dire con pn=&x ?
    Ultima modifica di oregon; 22-01-2014 a 19:06
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    ahh mio caro oregon! saresti un piacevole compagno di corso, mi sto affezionando ahahah.
    allora, veniamo a noi:
    devo leggere i valori dal file di testo che ho allegato e farli puntare uno dopo l'altro da p es: (p[1].valore, p[1].classe p[2]p[3]ecc)

    pn invece sarebbe il puntatore che la consegna vuole punti al numero di righe che ci sono sul file.
    ho incontrato diversi problemi durante la scrittura che ho risolto con quell'obrobrio. (lo so è atroce.) di seguito:

    1) non riesco a far incrementare direttamente il valore del puntatore pn di 1 ad ogni ciclo dell'fscaf quindi l'ho fatto con una variabile i.
    poi ho dato a pr l'indirizzo di i in modo tale che questo punti effettivamente al numero di righe come chiede la consegna.

    2) non riesco a dare come 2 valori che leggo dall'fscanf quelli della struct (valore e classe) e quindi ho usato due variabili momentanee (anche questo inguardabile ma quantomeno funzionante)

    3) non riesco a fare quello che effettivamente la consegna finale mi chiede, cioè far puntare a p i valori contenuti nel file.

    io davvero non capisco come mai man mano che mi avvicino all'esame, script che ho chiari in test non riesco a farli funzionare, uno su tutti quello dove devo lavorare con le malloc dentro la funzione e non definite nel main. sono in una fase dove mi sembra che il compilatore deliri. sarà la fase pre-esame.. spero.

    comunque se oltre a trovare un (e so che ci riuscirai) una soluzione al punto 3 mi sapresti illuminare anche sui punti 1 e 2 te ne sarei immensamente grato. grazie mille oregon!

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma che c'entra la fread? Non lo hai detto ...!

    P.S. Hai il testo originale dell'esercizio ? Perché non è che ci abbia capito molto dalla tua spiegazione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    beh avevo avevo testato anche la fscanf con una scrittura del tipo
    codice:
    for(tmp1=0;tmp1<x;tmp1++)
        fscanf(fp, "%lf %lu", &p[tmp1].valore, &p[tmp1].classe);
    ma l'output è lo stesso. alla fine devo solo leggere dal file in ciclo 'x' righe di valori e metterli in una struct; si può fare con entrambe le funzioni...

    la consegna: (andrebbero fatte in due file separati, funzione e main intendo, li ho uniti per comodità)

    Creare i file dati.h e dati.c che consentano di utilizzare la seguente
    struttura:

    struct dato {
    double valore;
    unsigned classe;
    };

    e la funzione:

    extern struct dato *read_dati (const char *filename, unsigned int *pn);

    La struttura contiene il campo valore che descrive un certo valore numerico e
    il campo classe che descrive la tipologia del dato. La classe sarà un valore
    tra 0 e 10.
    La funzione accetta come parametro un nome di file che deve essere aperto in
    lettura in modalità tradotta (testo) e un puntatore ad una variabile di tipo
    unsigned int in cui si dovrà inserire il numero di dati presenti in un file
    così strutturato:

    <valore><whitespace><classe><a capo>
    <valore><whitespace><classe><a capo>
    <valore><whitespace><classe><a capo>
    ...

    La funzione deve ritornare un puntatore ad una zona di memoria (allocata
    dinamicamente nell’heap) contenente tutti i dati letti dal file.

    Ad esempio, un file valido è:

    0.0961 2
    0.4929 0
    0.9252 0
    0.2186 1

    In questo caso la variabile puntata da pn varrà 4. Per testare la funzione,
    utilizzare i file dati1.txt, dati2.txt, dati3.txt disponibili nella pagina
    dell'esame.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ora è più chiaro ... quindi la fread non c'entra nulla.

    Ma dimmi, hai già studiato (e puoi usare) la realloc (oltre alla malloc) oppure no?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    sisi la conosco anche se in effetti non l'ho mai usata.
    suggerisci una prima malloc per fscanf che conta i caratteri e una realloc quando devo allocarci i dati?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No, suggerisco un uso della realloc all'interno del ciclo di lettura del file con le fscanf.

    P.S. Ricorda che la realloc di un puntatore NULL è equivalente ad una malloc.
    Ultima modifica di oregon; 22-01-2014 a 22:33
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Mh Se ce la fai potresti correggerlo ora e poi domani in biblioteca provo a farlo e male che vada mi aiuto col tuo esempio. Grazie :-)

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.