Ciao gurus.
Io ho un grosso problema.
Un errore incomprensibile nel mio codice mi impedisce di proseguire.
Si tratta di un programma in C++, composto da più file:
i file contengono rispettivamente, il main, funzioni, classi (una classe o una funzione per ogni file).
C'è poi un header.h che includo all'inizio di quasi tutti i file.
La programmazione è di tipo modulare, cioè, a parte per una costante, non faccio uso di variabili globali, ma passo ciò che serve alle funzioni per parametro.
La compilazione è andata a buon fine e sto ora eseguendo il debug con dei file di prova in input.
Con un file piccolo non c'è problema.
Con un file medio invece, durante l'inizializzazione di una matrice 27 x 27 (Identica 27), viene generato un accesso violato all'interno di una malloc()
Mi spiego meglio (Riporto in fondo al messaggio la funzione in questione, in corrispondenza della freccia il debug si blocca)
La funzione ha lo scopo di allocare diverse strutture in base al contenuto del file di input, dopo di che deve restituire i puntatori a tali strutture ai parametri passati per indirizzo.
Le strutture vengono allocate con la malloc(). I puntatori a tali strutture vengono prima memorizzati in variabili d'appoggio e solo alla fine della funzione, restituiti.
Come potete notare si tratta di una comune costruzione di una matrice quadrata. Eppure quando alloco la terza riga, la stessa malloc() provoca un accesso violato, scrive dove non le è consentito.
Spero di essere stato chiaro e spero che tra di voi ci sia qualcuno che abbia già riscontrato questo problema, oppure che conosca meglio di me il funzionamento della malloc() e dell'allocazione della memoria.
Personalmente pensavo che poiché è la malloc() a gestire la memoria dinamica l'unico problema che potesse dare fosse l'esaurimento della memoria.
Vi ringrazio anticipatamente per l'aiuto.
Ciao, Danilo
// LeggiFile non solo legge il problema dal file richiesto, ma inizializza anche alcune strutture
void LeggiFile(char *nomefile, gestore_A *A, gestore_X *X, gestore_C *c, double ***_B, double**_w, double **_b, int *_m, int *_n, int *_svar, int *_rvar, int *_avar)
{
//VARIABILI
...
//VARIABILI D'APPOGGIO
int m, n, rvar, svar, avar;
double **B;
double *w;
double *b;
...
// inizializzo B all'identica Im
if ( (B=(double**)malloc(sizeof(double*)*m))==NULL ) { printf("ERRORE\n"); exit(0); }
for ( i=0 ; i<m ; i++ )
{
-> if ( (B[i]=(double*)malloc(sizeof(double)*m))==NULL ) { printf("ERRORE\n"); exit(0); }
for ( j=0 ; j<m ; j++)
{
if (i==j)
B[i][j]=1;
else
B[i][j]=0;
}
}
...
*_m = m;
*_n = n;
*_rvar = rvar;
*_svar = svar;
*_avar = avar;
*_B = B;
*_w = w;
*_b = b;
}