Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 21

Discussione: [C] esercizio struct

  1. #11
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Quote Originariamente inviata da myricio Visualizza il messaggio
    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 :-)
    Lo scrivo più per capire se ci sto capendo qualcosa di C/C++ quindi aspetta pareri di + navigati
    Non sono sicuro del cast (struct dato*) ?

    codice:
    ....
    int x = 0;
    struct dato *p = NULL; //realloc si comporta come malloc la prima volta
    do{
    ...
    fscanf ....
    p = (cast) realloc(p,(x+1)*sizeof(struct dato));
    p[x].valore = tmp2;
    p[x].classe = tmp1;
    x++;
    }while(...)
    Ultima modifica di Toxotes; 23-01-2014 a 22:09

  2. #12
    diceva oregon l'altro giorno che il casting è obligatorio solo in c++.
    dato che stiamo lavorando in c si può omettere.
    invece per il resto sembra quadrare anche se secondo me si potrebbe snellire ulteriormente eliminando le variabili temporanee.
    vedo di lavorarci un attimino e vediamo cosa ne esce.

  3. #13
    allora io ho scritto così:

    codice:
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include "dati.h"
    
    
    
    
    
    
    struct dato *read_dati (const char *filename, unsigned int *pn) {
    	
    	FILE *f;
        struct dato *p = NULL;
    	unsigned int x=0;
    
    
    	f=fopen(filename, "rt");
    	if(f==NULL)
    		exit(EXIT_FAILURE);
    
    
    	for(x=0;feof(f)==0;x++) {
    		p = realloc(p,(x+1)*sizeof(struct dato));
    		fscanf(f, "%lf %lu", &p[x].valore, &p[x].classe);
    	}
    	pn=&x;
    	return p;
    }
    dentro dati.h c'è anche la definizione della struct.
    si potevano facilmente far fuori le variabili temporanee.
    l'unica cosa che non capisco è che se faccio il debug con pelles (che useremo durante l'esame) mi viene detto che il programma non termina nel tempo prestabilito e c'è un ciclo infinito.
    con visual studio invece va tutto liscio.
    bah.

  4. #14
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Occhio a questa

    pn=&x;

    che è sbagliata (e pericolosa).

    Cambia con

    *pn = x;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #15
    eh lo so oregon, avevo scritto pure io così inizialmente ma se provo a cambiarlo sembra non avere spazio a sufficienza per farlo.. sono entrambi unsigned int. nel main il puntatore l'ho fatto puntare a null.

    Unhandled exception at 0x773415ee in lettura_dati_indiretta.exe: 0xC0000005: Access violation writing location 0x00000000.


    nel mentre hai qualche idea del perchè pelles non riesce ad uscire dal sito?

  6. #16
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Deve essere così. Forse hai scritto male nel main.

    Uscire dal sito? Che vuol dire?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #17
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Occhio a questa

    pn=&x;

    che è sbagliata (e pericolosa).

    Cambia con

    *pn = x;
    puoi spiegarmi meglio? cioè non capisco perchè è sbagliato. Capisco che è pericoloso (forse meglio pass by reference), ma perchè sbagliato?

    p.s. in ogni caso non ne capisco davvero l'utilizzo nel codice presentato...
    Ultima modifica di Toxotes; 24-01-2014 a 15:38

  8. #18
    oregon: scusami, stavo facendo 400 cose ed ho avuto un lapsus, volevo dire "ciclo" non "sito".
    il compilatore pelles mi dice che il main non termina nel tempo previsto e che probabilmente c'è un ciclo che non si chiude. ma visual studio compila tutto perfettamente... ti segnalo inoltre che nella versione che ho testato su pelles ho corretto i "NULL" in "0" dato che pelles usa 0 invece che null.

    toxotes: il programma vuole che il puntatore pn valga quanto il numero di righe.
    dato che se faccio come dice oregon *pn=x (che è la definizione corretta) mi viene restituito un errore ho trovato come alternativa semplicemente far puntare pn ad x alla fine del programma in modo che alla fine il suo valore sia quello corretto.

    oregon nel main ho scritto:

    codice:
    int main(void) {
        char file[]="dati1.txt";
        unsigned int *p=NULL;
        read_dati(file, p);
    }

  9. #19
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Nel main devi usare una variabile

    unsigned int val;

    che passerai per puntatore alla funzione con

    &val

    altrimenti restituisci un puntatore ad una variabile locale che non esiste piu'
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #20
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Ops non ci avevo proprio fatto caso. Cmq se il numero di righe è una quantità importante, se ti è cnsentito, mettilo cme campo della struttura. Dopo il ciclo gli assgni x e cosí per ogni file (e quindi ogni struct) hai anche il numero di righe. Almeno io farei cosí.
    Poi se proprio vuoi qualcosa che la punti farei const int& pn e gli assegni il campo contenente le righe....

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.