PDA

Visualizza la versione completa : [C] Matrice dinamica NxN di double


Sessio
02-05-2009, 14:48
Ciao. Volevo chiedere un aiuto su un problema con un programma.
Volevo scrivere un programma che caricasse una matrice di double di dimensione nxn.
Siccome n è variabile, ho dovuto allocare dinamicamente nxn double con la funzione malloc.
Ho voluto usare un puntatore uni-dimensionale, quindi la matrice A la considero come un vettore riga nxn, e l'elemento A[i][j] quindi lo considero come A[n*i+j].
A quanto pare il programma mi fa un errore di segmentazione, ma non riesco a capire dove sia l'errore. Ve lo copio qua sotto:

//===============PROGRAMMA===============

#include<stdio.h>
#include<stdlib.h>

//================PROTOTIPI================

void carica_matrice(double *,int);

//==============DATI GLOBALI================

int n; //Per la dimensione della matrice
double *A_p; //Per puntare la matrice

//===============DEFINIZIONI================

int main(void)
{
printf("Quante righe e colonne?\n");
scanf("%d",&n);
A_p=(double *) malloc (sizeof(double[n*n]));//Per allocare la memoria per la matrice
carica_matrice(A_p,n);
system("pause");
return(0);
}

void carica_matrice(double *a,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;i++)
{
printf("\n elemento [%d][%d]= ",i+1,j+1);
scanf("%lf",&a[n*i+j]);
printf(" i=%d, j=%d",i,j);//??Perchè incrementa i indefinitamente e lascia j=0??
}
}
return;
}

/* Grazie a chi mi aiuta! */

mondobimbi
02-05-2009, 15:30
il programma che hai scritto è in C. Se vuoi usare il C++ alloca la memoria con new e rilasciala con delete [] .
Acquisisci l'imput da tastiera con cin e scrivi sullo schermo con cout.
Non usare dati globali.
ciao
sergio

Sessio
02-05-2009, 15:42
Chiedo scusa, ma mi sono sbagliato: il linguaggio che devo usare è il C, quindi la funzione malloc va bene. Chiarito questo, riesci a riconoscere l'errore concettuale in quel programma?

mondobimbi
02-05-2009, 15:52
mi cade l'occhio sul loop interno for (j=0; .. dove incrementi i anzichè j .
Inizia a correggere questo
ciao
sergio

Sessio
02-05-2009, 16:00
Perfetto, mi è sfuggita la spiegazione più banale... copiando e incollando il contatore mi sono dimenticato di cambiare l'indice.
Grazie!

Loading