Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    8

    Segmentation fault

    Ciao! Ho la seguente porzione di codice C:

    main()
    {
    float *x;
    x=(float*) malloc (16000*sizeof(float));

    i=0;
    if ((filedati=fopen("a.txt","r"))==NULL)

    printf("File non presente\n");

    else

    for (stato=fscanf(filedati,"%f",&x[i]);stato!=EOF;stato=fscanf(filedati,"%f",&x[i]))

    i++;

    a e' un file con 16000 elementi che devo inserire nel vettore x. Il programma e' stato compilato con GCC usando il software Anjuta. Il compilatore non mi segnala nessun problema, ma in fase di run il programma termina segnalando segmentation fault.
    Ora sto operando sotto Linux. Lo stesso programma, invece, eseguito sotto Windows con CodeBlocks e senza usare la malloc non mi crea problemi e funziona correttamente. Perche'?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    Forse in fase di run la malloc non riesce a trovare 1600 locazioni consecutive per contenere i tuoi float ...
    quando si usa la malloc è normale che i problemi si abbiano in run time

    Cmq questo è un problema che mi afflige da parecchio tempo , perche ci vorrebbe qualche metodo per richiedere al S.O. più memoria ,ad esempio un segmento più grande ...

    spero che esista una soluzione ...

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La memoria necessaria ad allocare 16000 float e' pari a 64K circa e quindi non penso sia un problema di mancanza di memoria ...

    Semmai il problema e' nella lettura del file, ovvero se durante la lettura del file, per un qualsiasi motivo, l'indice i supera il massimo possibile (16000) ...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Segmentation fault

    Originariamente inviato da wolf82
    Ciao! Ho la seguente porzione di codice C:

    main()
    {
    float *x;
    x=(float*) malloc (16000*sizeof(float));

    i=0;
    if ((filedati=fopen("a.txt","r"))==NULL)

    printf("File non presente\n");

    else

    for (stato=fscanf(filedati,"%f",&x[i]);stato!=EOF;stato=fscanf(filedati,"%f",&x[i]))

    i++;

    a e' un file con 16000 elementi che devo inserire nel vettore x. Il programma e' stato compilato con GCC usando il software Anjuta. Il compilatore non mi segnala nessun problema, ma in fase di run il programma termina segnalando segmentation fault.
    Ora sto operando sotto Linux. Lo stesso programma, invece, eseguito sotto Windows con CodeBlocks e senza usare la malloc non mi crea problemi e funziona correttamente. Perche'?
    Il programma è corretto, non ci sono errori. Ci possono essere quindi 2 cause al tuo problema:
    a) La malloc fallisce (cosa strana, deve allocare solo 64000 bytes, una vera miseria sui PC di oggi).
    b) Il tuo file, per qualche motivo, contiene più di 16000 elementi numerici.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    746
    for (stato=fscanf(filedati,"%f",&x[i]);stato!=EOF;stato=fscanf(filedati,"%f",&x[i]))

    i++;
    se accetti un consiglio da un neofita...evita di scrivere cicli for in quel modo:
    non sono troppo leggibili

    per quanto riguarda la malloc puoi usare assert, e se non sei
    sicuro che il file non contenga più di 16000 elementi potresti
    fare qualcosa di questo tipo (è solo un esempio...difficilmente
    ti sarà utile ):

    codice:
    else
    {
    	for (i = stato = 0; stato != EOF; i++ ) 
    	{
    	        if (i != 0 && i % 16000 == 0) 
    		{
    			free(x);
    			x = calloc(16000, sizeof (float));
    			assert(x != NULL);
    			i = 0;
    		}
    		stato = fscanf(filedati, "%f", &x[i]);
    	}
    }
    free(x);

    .

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    8
    Grazie per l'aiuto, il problema era nel numero di elementi del file. Il problema è che quando si usano troppi file in un programma e si cerca di ricordare il numero degli elementi a memoria, succedono sempre queste cose.

    Ancora grazie a tutti!

    Ciao!

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh ... se avessi inserito una linea di controllo del contatore, avresti "prevenuto" il problema automaticamente e velocemente ...

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.