Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [Ling. C]Gestire gli errori e aumentare l'heap

    Ciao a tutti ho due problemi di cui non riesco a trovare la soluzione:
    1. Ho scritto un programmino che alloca e dealloca dinemicamente memoria.Quando però le informazioni da memorizzare diventano troppe il programma si pianta. Credo sia un errore di stack overflow ma come faccio a catturare un errore del genere in C? C'è un meccanismo simile a java?
    2. Visto che non posso diminuire la dimensione degli input c'è un modo per chiedere al compilatore di allocare più memoria(in questo caso si tratta dell'heap del processo principale in cui vengono memorizzati i dati e non dello stack di sistema che serve per le chiamate di funzioni giusto)?
    Grazie mille.....

  2. #2

    Re: [Ling. C]Gestire gli errori e aumentare l'heap

    Originariamente inviato da anonimo80
    Ciao a tutti ho due problemi di cui non riesco a trovare la soluzione:
    1. Ho scritto un programmino che alloca e dealloca dinemicamente memoria.Quando però le informazioni da memorizzare diventano troppe il programma si pianta. Credo sia un errore di stack overflow ma come faccio a catturare un errore del genere in C? C'è un meccanismo simile a java?
    Se allochi la memoria dinamicamente sarà piuttosto un problema di heap non sufficiente (e non di stack overflow), ma in questo caso la malloc/calloc ti dovrebbe restituire NULL e non bloccarsi. Sei sicuro che il programma non si blocchi per altri motivi?
    2. Visto che non posso diminuire la dimensione degli input c'è un modo per chiedere al compilatore di allocare più memoria(in questo caso si tratta dell'heap del processo principale in cui vengono memorizzati i dati e non dello stack di sistema che serve per le chiamate di funzioni giusto)?
    Il compilatore che io sappia non limita l'heap, piuttosto prepara uno stack di determinate dimensioni (tra l'altro non ce n'è uno solo "di sistema", ma ce n'è uno per ogni thread).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Guarda il prog è questo...
    Creo una matrice di interi,la memorizzo in un vettore rispettando le posizioni(nel senso che la stendo :-)per capirci prima tutta la riga 1 poi la riga 2 etc..). Fatto questo voglio dividere la matrice originale in n sottomatrici partendo dall'array. Quindi divido le dimensioni di base e altezza in 2(o 4 o 8 etc..)e mi calcolo i quadrati risultanti,che poi memorizzo dinamicamente in una lista. Dico che è un errore di heap(grazie per la dritta sono riandato a leggere la differenza fra stck e heap e ho chiarito la lacuna)perchè per matrici piccole tutto funziona bene ma se divido matrici grandi in tanti pezzi(ad es divido larghezza e altezza di una matrice 1000x1000 per 16)dopo qualche passo mi appare la finestra di windows con la scitta "il programma ProvaMatrici.exe ha smesso di funzionare" e devo killare tutto.Il fatto che questo accada solo per matrici grandi mi fa pensare a un problema di occupazione di memoria per questo volevo anche sapere come si gesticono gli errori....Grazie mille e scusa per le varie imprecisioni.
    Per inciso uno CodeBlocks 8.02 su Vista
    codice:
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <malloc.h> 
    #include <string.h> 
    #define ALTEZZA 100 
    #define LARGHEZZA 100 
    #define NOT_COVERED 0 
    #define COVERED 1 
    struct lista_array{ 
    int *elemento;
     int largh; 
    int alt; 
    struct lista_array *next; 
    };
     int main (int argc,char *argv[])
     {
     int vect[ALTEZZA][LARGHEZZA]; 
    int arr[ALTEZZA*LARGHEZZA]; 
    int cover[ALTEZZA*LARGHEZZA];
     int larghezzasub,altezzasub; int larghezzasubBase=LARGHEZZA/2,altezzasubBase=ALTEZZA/2; 
    int x,i,j,ptr=0,h,k,cnt=1,tmp=0;
     struct lista_array *head=NULL,*queue=NULL,*tmp2; 
    
    for (i=0;i<ALTEZZA*LARGHEZZA;i++) cover[i]=NOT_COVERED; for(i=0;i<ALTEZZA;i++)//inizializzo matrice e ricavo array lineare
     for(j=0;j<LARGHEZZA;j++){ 
    vect[i][j]=cnt++; arr[tmp++]=vect[i][j];
     } 
    if(larghezzasubBase*altezzasubBase>16) { 
    for (ptr=0;ptr<ALTEZZA*LARGHEZZA;ptr++) 
    { if (cover[ptr]==NOT_COVERED)
     { larghezzasub=larghezzasubBase;
     altezzasub=altezzasubBase;
     k=0;
     h=ptr; 
    if(((((ptr/LARGHEZZA)+1)*LARGHEZZA)-(ptr))<larghezzasub*2) larghezzasub=((((ptr/LARGHEZZA)+1)*LARGHEZZA)-(ptr));
    
     if (ALTEZZA-(ptr/LARGHEZZA)<altezzasub*2) altezzasub=ALTEZZA-(ptr/LARGHEZZA); 
    
    tmp2=(struct lista_array *)malloc(sizeof(struct lista_array)); 
    tmp2->largh=larghezzasub; 
    tmp2->alt=altezzasub; 
    tmp2->elemento=malloc((larghezzasub*altezzasub)*sizeof(int));
    
     if(head==NULL){ 
    head=tmp2;
     tmp2->next=NULL;
     queue=tmp2; }
     else{ tmp2->next=NULL; 
    queue->next=tmp2; 
    queue=tmp2; }
     for(i=0;i<altezzasub;i++)
     { for(j=0;j<larghezzasub;j++)
    { tmp2->elemento[k++]=arr[h++];
     cover[h-1]=COVERED; } 
    h+=LARGHEZZA-larghezzasub; } 
    }
     }
     }
     else printf("\n\nPORZIONE TROPPO PICCOLA DA ANALIZZARE\n\n");
     x=1; 
    tmp2=head; 
    while(tmp2!=NULL) 
    { printf("\n\nSTAMPO %d° SOTTOPORZIONE DELLA MATRICE - DIMENSIONI %d X %d\n\n",x,tmp2->largh,tmp2->alt); 
    for(i=0;i<(tmp2->largh*tmp2->alt);i++)
     { printf("%5d",tmp2->elemento[i]); } 
    tmp2=tmp2->next; x++; }
     return 0; }

  4. #4
    come ti diceva MItaly comincia a controllare cosa ti ritorna malloc

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E dove sono le free (dato che hai parlato anche di deallocazione ...) ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Le free non ci sono per il semplice motivo che non devo deallocare memoria fino alla fine generale del programma (uscita dal main). Tutte le info memorizzate sono necessarie a una successiva elaborazione. Le deallocazioni di cui parlavo erano state inserite nel programma generale che dava gli stessi problemi di questo. In parole povere tutte le info presenti nella coda mi servono...quindi non dealloco(mi sembra logico).
    Per gli errori sulle malloc ho pulito un pò il codice prima di postarlo per avere un pò più di chiarezza. Cmq nell'originale sono :



    codice:
    if((tmp2=(struct lista_array *)malloc(sizeof(struct lista_array)))==NULL) {printf("\n\nESAURITA MEMORIA DISPONIBILE PER LA MALLOC DI TMP2"); return 0;}
    e simile per la seconda malloc...ma non risolvono il problema(c'erano fin dall'inizio....).
    Eseguendo il debug con gdb mi da errore di segmentation fault. Più precisamente:
    "Program received signal SIGSEV,Segmentation fault.Do you want to view the
    backtrace?"
    Digitando yes mi appare la finestra delle call stack con
    elencate queste due funzioni:
    Nr Address Function
    0 00401D9B probe()
    1 00401878 main().

    Facendo il debug istruzione per istruzione dopo varie probe mi da lo stesso
    segnale di errore elencato prima. Se provo a continuare mi appare:
    In ntdll!LdrEnumerateLoadedModules () (C:\Windows\system32\ntdll.dll)
    Se continuo mi appare di nuovo SIGSEV e infine se continuo ancora windows mi
    avvisa che il mio programma ha smesso di funzionare.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ho compilato ed eseguito il codice che hai mostrato e tutto funziona regolarmente (almeno, non ho avuto errori a runtime).

    Cosa posso fare per ottenere il tuo errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Provato su Ubuntu 9.10 AMD64 con GCC 4.3.3 e non ho nessun problema.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Grazie a tutti ho finalmente risolto il problema....
    Per conoscenza generale:
    Il codice postato non si pianta perchè le dimensioni di ALTEZZA e LARGHEZZA sono relativamente piccole.Se lo provate con i valori 1000 e 1000 avete l' errore.
    Il motivo è il modo in cui alloco la memoria:
    Con la dichiarazione
    vect[ALTEZZA][LARGHEZZA]
    il compilatore riserva memoria nello stack, che ha una capacità limitata(anche allocare più di un mega di valori può creare problemi). In questo caso alloco 4.000.000 di elementi ognuno di almeno 4 byte(misura tipica di un intero) arrivano a occupare qualcosa come 15 MB ce impallano tutto.
    La soluzione sta nell'allocare le risorse dinamicamente attraverso le malloc() utilizzando cosi l'heap, ed eliminando il problema...
    int *arr
    arr=malloz((ALTEZZA*LARGHEZZA)sizeof(int))
    n.b.cosi otteniamo l'equivalente di un array(lo dico per chiarezza anche se so che non è proprio la definizione corretta lo so).
    Grazie a tutti per la pazienza e spero che i miei problemi possano essere stati,o potranno essere, d'aiuto a qualcuno...

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Questo era ovvio ... dovevi pero' dirci che si piantava con valori di 1000x1000 e lo avremmo detto subito facendoti risparmiare tempo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.