Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 54
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322

    [c] allocare, non allocare...

    espongo il quesito cercando d essere chiaro:

    ho una struttura di questo tipo:

    typedef struct
    {
    FILE *file;
    struttura stato; // stato è definito tramite un enum come APERTO o CHIUSO
    int x;
    } struttura;


    e devo fare una funzione che inizializzi un oggetto di questa struttura. L'ho fatta in questo modo:

    int nuovo(char *fname, struttura *St) {

    /* controlli vari sul nome del file */

    FILE *fp = fopen(fname,"r");
    if (!fp) return ERR; // ritorna un codice di errore

    /*non ci sono errori, inizializza */
    St = (struttura *)malloc(sizeof(struttura));
    St->file=fp;
    St->stato=APERTO; // all'inizio APERTO di default
    St->x=1; // valore iniziale di default

    return 0;
    }


    or ail mio problema è che quando nel main vado a creare una variabile di tipo struttura e a usare la funzione, sembrerebbe che funziona..

    int main() {

    struttura *A;

    int prova;
    char *nomefile;
    nomefile="testo.txt";

    prova = nuovo(nomefile,A);
    printf("%d\n",prova);
    ....


    poi però quando vado a chiudere il file aperto nella funzione o a fare quasi qualsiasi altra cosa mi da un errore di SEGMENATION DEFAULT.

    essendo io un dilettante non so cosa pensare. Sbaglio nell'allocare la memoria? Devo iniziallizzare l'oggetto di tipo struttura in maniera diversa?

    Help!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa, ma se

    struttura e' questa

    typedef struct
    {
    FILE *file;
    struttura stato; // stato è definito tramite un enum come APERTO o CHIUSO
    int x;
    } struttura;

    come mai dichiari l'elemento stato come struttura? Se deve essere un enum, devi dichiararlo del tipo enum di cui parli ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    si scusa mi sono sbagiato a scrivere.. stato è dichiarato tramite un enum come STRUTTURA_STATO e puo essere aperto o chiuso..

    errore di battitura.. ma prutroppo non è quello il mio problema..

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    non riesco a capire perche dopo aver chiamato la funzione NUOVO, apre correttamente il file testo.txt, ci prendo dei caratteri o delle parole o stampo i valori (x esempio: printf("%d",A->x) oppure printf"%c",getc(A->file) ) e poi se faccio una fclose(A->file) mi da SEGMENTAION DEFAULT



  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    aiuto!

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Nel codice che hai postato non vedo errori di sorta. L'unica cosa che mi venga in mente è che usi la tua struttura in un altro punto non inizializzata, cosa per altro sicura se l'apertura del file fallisce.


    Personalmente io cambierei la funzione nuovo così:

    Codice PHP:
    struttura *nuovo(char *fname) {
      
    struttura *St;
       
    /* controlli vari sul nome del file */
      
    FILE *fp fopen(fname,"r");
      if (!
    fp) return NULL// 

      /*non ci sono errori, inizializza */
      
    St = (struttura *)malloc(sizeof(struttura));
      if (!
    St) return NULL;

      
    St->file=fp;
      
    St->stato=APERTO// all'inizio APERTO di default
      
    St->x=1// valore iniziale di default

      
    return St;

    oppure puoi allocare la struttura al di fuori della tua funzione e controllare all'interno se il puntatore che passi sia valido.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    purtroppo non posso cambiare il prototipo della funzione per cause di forza maggiore..

    proverò ad allocare fuori dalla funzione..

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ricordati sempre di azzerare i puntatori se li dichiari.

    Codice PHP:
       struttura *NULL
    così puoi controllare facilmente se il pointer è già inizializzato o no.

  9. #9
    Così funziona.
    codice:
    int nuovo( char *fname, STRUTTURA **St)
    {
    	/* controlli vari sul nome del file */
    	FILE *fp = fopen(fname, "r");
    	if (!fp)
    		return ERR; // ritorna un codice di errore
    
    	/* non ci sono errori, inizializza */
    	(*St)        = malloc(sizeof(STRUTTURA));
    	(*St)->file  = fp;
    	(*St)->stato = APERTO;   // all'inizio APERTO di default
    	(*St)->x     = 1;            // valore iniziale di default
    	return 0;
    }
    
    int main()
    {
    	STRUTTURA *A = NULL;
    	int i;
    
    	if( nuovo( "testo.txt", &A ) != ERR )
    	{
    		fscanf( A->file, "%d", &i);
    		printf("Intero (test) = %d\n", i );
    		fclose(A->file);
    	}
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    ok funge. grazie x l'aiuto..

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 © 2025 vBulletin Solutions, Inc. All rights reserved.