Core Dump Problem

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Alice_Kora
Prode Principiante
Messaggi: 8
Iscrizione: giovedì 26 giugno 2014, 9:52
Località: Bordeaux-France

Core Dump Problem

Messaggio da Alice_Kora »

Lasciando perdere il tipo lapack questa funzione mi restituisce un core dump che riguarda i malloc del tipo Ele, una volta fuori dalla funzione non riesco ad esempio ad accedere alla matrice A, qualcuno ha idee?

Codice: Seleziona tutto

typedef double Ele;
typedef Ele* PEle;
typedef PEle* PPEle; 

int row = 5;
int col =3;

typedef lapack_complex_double* complessa;

void DataAllocation(PPEle A, PPEle B, PPEle U, PPEle V, complessa AC, complessa BC, complessa UC, complessa VC){
	int i,j,k;
	A=(PPEle)malloc(sizeof(PEle)*row+1);
	for (i=0; i <row; i++){
		A[i] = (PEle)malloc(sizeof(Ele)*col+1);
		for(j=0;j<col;j++){
			A[i][j]=0;
		}
	} 	
	B=(PPEle)malloc(sizeof(PEle)*row+1);
	for (i=0; i <row; i++){
		B[i] = (PEle)malloc(sizeof(Ele)*col+1);
		for(j=0;j<col;j++){
			B[i][j]=0;
		}
	} 	
	U=(PPEle)malloc(sizeof(PEle)*row+1);
	for (i=0; i <row; i++){
		U[i] = (PEle)malloc(sizeof(Ele)*row+1);
		for(j=0;j<col;j++){
			B[i][j]=0;
		}
	} 	
	V=(PPEle)malloc(sizeof(PEle)*col+1);
	for (i=0; i <col; i++){
		V[i] = (PEle)malloc(sizeof(Ele)*col+1);
		for(j=0;j<col;j++){
			V[i][j]=0;
		}
	}
	AC=(complessa)malloc(sizeof(lapack_complex_double)*col*row+1);
	BC=(complessa)malloc(sizeof(lapack_complex_double)*col*row+1);
	UC=(complessa)malloc(sizeof(lapack_complex_double)*row*row+1);
	VC=(complessa)malloc(sizeof(lapack_complex_double)*col*col+1);
	
	return;
}


Alice R
INRIA~IMB
Bordeaux-Talence
Bat.A 33 Bureau 168
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: Core Dump Problem

Messaggio da ixamit »

Alice_Kora ha scritto:Lasciando perdere il tipo lapack questa funzione mi restituisce un core dump che riguarda i malloc del tipo Ele, una volta fuori dalla funzione non riesco ad esempio ad accedere alla matrice A, qualcuno ha idee?
Ciao,
ci sono degli errori di reference che puoi studiarti qui

In breve devi avere:

Codice: Seleziona tutto

void DataAllocation (PPEle *A, .... )
   ....
   *A=(PPEle)malloc(sizeof(PEle)*row);
   for (i=0; i <row; i++){
      (*A)[i] = (PEle)malloc(sizeof(Ele)*col);
      for(j=0;j<col;j++){
         (*A)[i][j]=0;
      }
   ...
   ...
/* funzione chiamante */
PPEle A,.... ;
DataAllocation (&A, .... ) ;
Altre note a riguardo:
a) Non mi è chiaro perché incrementi le allocazioni di uno.
b) Se devi azzerare/inizializzare una matrice allocata esistono almeno un paio di opzioni migliori:
1) Usare calloc al posto di malloc

Codice: Seleziona tutto

    (*A)[i] = (PEle)calloc(col, sizeof(Ele));
2) Usare la memset

IMPORTANTE
EDIT (1 Ottobre 2014 - ore 10:15):
Stupidamente, nella seconda parte del post ho asserito a condizioni NON PRETTAMENTE VERITIERE riguardo le inizializzazioni float/double, le quali possono dipendere dal compilatore utilizzato e dagli standard o normative applicate - così come particolari architetture hardware.

Per cui, **non fare affidamento di portabilita'** - un riempimento a zero byte "potrebbe" non essere uguale a zero.
Avatar utente
Alice_Kora
Prode Principiante
Messaggi: 8
Iscrizione: giovedì 26 giugno 2014, 9:52
Località: Bordeaux-France

Re: Core Dump Problem

Messaggio da Alice_Kora »

Avevo risolto per via traversa in realtà usando un puntatore locale e poi piazzandolo sotto A ma ho visto la tua versione e mi sembra decisamente più puilita
Alice R
INRIA~IMB
Bordeaux-Talence
Bat.A 33 Bureau 168
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 8 ospiti