Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Problema di memoria?

    Ciao, stavo eseguendo un semplice programma in C e il sistema mi risponde con return code 128.
    In fase di compilazione non ho ricevuto nessun messaggio di errore.
    Ho fatto altre prove e sono giunto alla conclusione che il problema sta nella dichiarazione delle variabili.
    Allego una versione ridotta del programma.
    Se commento la dichiarazione del "float" il programma gira senza problemi.
    Se gli faccio leggere anche la riga "float" ricevo in fase di esecuzione il return code 128.
    Possibile che non abbia + memoria? Facendo un conto veloce non dovrei consumare più di 4-5 megabyte di memoria. Ho 512MB di ram.
    Utilizzo LCC-WIN32 sotto WinXp come compilatore.
    Può essere il compilatore, il sistema operativo? Che mi consigliate?
    Grazie.
    Massimo

    include<math.h>
    #include<stdio.h>

    int main()
    {
    FILE *fp,*fi;
    float lat[200][300],lon[200][300],out[200][300],la1,la2,lo1,lo2;
    int i=0,j,k,n;
    double x[36000],y[700],z[700],dbz[700],sum,pi,lat_r0,lon_r0,eradm,merarc,pararc,latr[700],lonr[700];
    /*unsigned char out[200][300];*/
    pi = 3.1415927;
    lat_r0 = 41.1359;
    lon_r0 = 16.7798;
    eradm = 6367.57;
    merarc = 2.0*pi*eradm/360.0;
    fp=fopen("ascii1.max","r");
    fi=fopen("nomeout.txt","w");
    printf ("%lf rdam",eradm);
    }

  2. #2
    A me non da problemi (a patto che metta il dovuto cancelletto di fronte all'include di math.h).
    L'output è questo:

    codice:
    6367.570000 rdam
    
    Terminated with return code 0
    Press any key to continue ...
    Uso dev-c++ sottto winxp

    PS. Metti i tag CODE
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    A me da invece un'eccezione non gestica (Con Visual C++ 2003) per uno stack overflow.
    Lo stesso tuo errore...
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Ciao, ho riprovato il programma su Linux RH9 con GCC 3.2.2 su un PC con 128MB di ram e non ho avuto errori in fase di esecuzione.
    Il problema xrò ritorna anche con GCC (mi da segmentation fault) se incremento il numero degli elementi degli array dichiarati in double (tutti questi array dovrebbero essere dimensionati a 360000)
    Fin quando porto a 360000 x e y nessun problema, ma poi se porto anche z ho segmentation fault. Riesco a portare anche z se dichiaro quelle variabili come float e non double, ma poi comunque ridimensionando anche le altre cado nello stesso errore.
    Mi sembra un problema di memoria o di compilatore o di OS. Non saprei anche xchè con LCC-WIN32 e XP con 512MB di ram avevo errore già con array a 36000 elementi.
    Ricordo che il problema sorge solo in esecuzione mentre in compilazione va tutto bene.
    Sapreste aiutarmi magari anche provando con altri compilatori l'estratto del programma listato di seguito?
    Grazie 1000. Ciao.


    #include<math.h>
    #include<stdio.h>

    int main()
    {
    FILE *fp,*fi;
    float lat[200][300],lon[200][300],out[200][300],la1,la2,lo1,lo2;
    int i=0,j,k,n;
    double x[360000],y[360000],z[360000],dbz[360000],sum,pi,lat_r0,lon_r0,eradm,merarc,pararc,latr[360000],lonr[360000];
    /*unsigned char out[200][300];*/
    pi = 3.1415927;
    lat_r0 = 41.1359;
    lon_r0 = 16.7798;
    eradm = 6367.57;
    merarc = 2.0*pi*eradm/360.0;
    fp=fopen("ascii1.max","r");
    fi=fopen("nomeout.txt","w");
    printf ("%lf rdam",eradm);
    }

  5. #5
    Originariamente inviato da XWolverineX
    A me da invece un'eccezione non gestica (Con Visual C++ 2003) per uno stack overflow.
    Lo stesso tuo errore...
    Non ho soluzioni dirette da proporre se non quella di allocare le matrici nello heap, cioè dinamicamente, dubito che il problema sorga anche così.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Originariamente inviato da unomichisiada
    Non ho soluzioni dirette da proporre se non quella di allocare le matrici nello heap, cioè dinamicamente, dubito che il problema sorga anche così.
    Cioè mi spiegheresti come fare per favore?
    Sono molto alle prime armi.
    Grazie.

  7. #7
    Originariamente inviato da maximovic
    Cioè mi spiegheresti come fare per favore?
    Sono molto alle prime armi.
    Grazie.
    Se non metti i tag code smetto di intervenire... :rollo:

    codice:
    #include<math.h>
    #include<stdio.h>
    
    int main()
    {
    FILE *fp,*fi;
    float lat[200][300],lon[200][300],out[200][300
    ],la1,la2,lo1,lo2;
    int i=0,j,k,n;
    double x[360000],y[360000],z[360000],dbz[360000
    ],sum,pi,lat_r0,lon_r0,eradm,merarc,para
    rc,latr[360000],lonr[360000];
    /*unsigned char out[200][300];*/
    pi = 3.1415927;
    lat_r0 = 41.1359;
    lon_r0 = 16.7798;
    eradm = 6367.57;
    merarc = 2.0*pi*eradm/360.0;
    fp=fopen("ascii1.max","r");
    fi=fopen("nomeout.txt","w");
    printf ("%lf rdam",eradm);
    }
    Ad esempio per allocare float lat[200][300] dinamicamente fai così:
    codice:
    int i;
    float** lat = (float**)malloc(sizeof(float*) * 200);
    for(i = 0 ; i < 200 ; i++)
    {
       lat[i] = (float*)malloc(sizeof(float) * 300);
    }
    Ovviamente ricordati che questa memoria va liberata non appena non ti serve più, quindi devi prima fare un altro ciclo for chiamando free(lat[i]) per ogni membro dell'array e poi richiamare free(lat) per liberare la memoria ssociata all'array di puntatori esterno. Prova e facci sapere.

    PS. Studiati le basi del C perchè non saper allocare dinamicamente un array è una lacuna non da poco.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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.