PDA

Visualizza la versione completa : [C] Programma va in crash


Nicepose
25-11-2014, 16:39
Salve a tutti, sto sviluppando un programma che mi permetta di salvare su un file di testo una matrice bidimensionale. L'esercizio richiedeva l'implementazione di due matrici, la cui somma doveva essere salvata in una terza matrice, da salvare quindi su file di testo in output.
Il programma compila correttamente ma al momento di salvare la matrice finale, va in crash.
Riporto le linee che riguardano il salvataggio in output.
Grazie in anticipo :)


void salva_file (int riga, int col){
int i,j;
FILE *fp_in, *fp_out;
float mat_somma[MAX_DIM][MAX_DIM];
// apertura file di output
fp_out=fopen("Esercitazione 2.txt","w");
// scrittura su file di output
for (i=0;i<riga;i++){
for (j=0;j<col;j++){
fprintf(fp_out,"%f ",mat_somma[i][j]);
// chiusura file di output
fclose(fp_out);
}
}
}

poi, richiamo la funzione nel main



printf("\nSalvo la matrice in output ");
salva_file (riga, col);

oregon
25-11-2014, 18:38
1) la matrice è locale alla funzione ... i suoi valori sono casuali ... perché li salvi ?

2) quanto vale MAX_DIM ?

3) quanto valgono riga e col ?

Nicepose
25-11-2014, 22:03
1) la matrice è locale alla funzione ... i suoi valori sono casuali ... perché li salvi ?

2) quanto vale MAX_DIM ?

3) quanto valgono riga e col ?

Per quanto riguarda riga e col, inserisco io valori in input in un'altra funzione così da poter definire e scrivere i valori della matrice, MAX_DIM vale 10 (definito col
#define, così da poter definire una funzione di grandezza massima 10x10.

Riguardo al punto 1 non ho capito :bhò:

oregon
25-11-2014, 22:10
Intendo dire, come inserisci i valori nella matrice?

Nicepose
25-11-2014, 22:16
Tramite tastiera, qui posto le linee di codice (leggo due matrici da input e salvo la matrice somma in una terza)


typedef float vettore[MAX_DIM];typedef vettore matrice[MAX_DIM]; // matrice con 10x10 celle, ognuna delle quali puo’ contenere 1 int


void leggimatrici(matrice mat1, matrice mat2, int *riga, int *col){
float z;
printf("\nDammi il numero di righe: ");
scanf("%d",riga);
printf("\nDammi il numero di colonne: ");
scanf("%d",col);
printf("\nCompila la matrice numero 1:\n");
for (int i=0;i<*riga;i++)
for (int j=0;j<*col;j++){
printf("Matrice 1: inserisci l'elemento [%d][%d]: ", i, j);
scanf("%f", &z);
mat1[i][j]=z;
}



printf("\nCompila la matrice numero 2\n");
for (int i=0;i<*riga;i++)
for (int j=0;j<*col;j++){
printf("Matrice 2: inserisci l'elemento [%d][%d]: ", i, j);
scanf("%f", &z);
mat2[i][j]=z;
}


}

...



void somma (matrice mat1, matrice mat2, int riga, int col){
// matrice mat1;
// matrice mat2;
int i=0;
int j=0;
float mat_somma[MAX_DIM][MAX_DIM];


printf("\nMatrice somma: \n");
for(i=0; i<= 1; i++)
for(j=0; j<= 1; j++)
mat_somma[i][j] = mat1[i][j] + mat2[i][j];
/*stampa il risultato*/
for(i=0; i<= 1; i++)
{
for(j=0; j<= 1; j++)
printf("%f ",mat_somma[i][j]);
printf("\n");
}


}

CaMpIoN
25-11-2014, 22:28
Non conosco C\C++, ma in generale scrivendo

float mat_somma[MAX_DIM][MAX_DIM]
Non stai definendo una variabile locale che è un array di tipi float vuoto, probabilmente esistente solo nella funzione?
Inoltre se così fosse, provando a cancellare l'inizializzazione, avresti comunque un'errore per lo stesso discorso se però vale quanto detto sopra. Infatti, inizializzi la matrice mat_somma nella funzione somma, e se quanto detto è vero, allora questo array esiste solo nella funzione.
Praticamente l'array mat_somma, nel caso cancelli la definizione in salva_file, allora ti da errore perché non esiste, se non lo cancelli ti da errore perché potrebbe essere vuoto e per questo motivo potrebbe darti l'errore.

Io conosco il Java, però so che in sostanza queste cose sono molto simili se non addirittura uguali.

Nicepose
25-11-2014, 22:35
Non conosco C\C++, ma in generale scrivendo

float mat_somma[MAX_DIM][MAX_DIM]
Non stai inizializzando una variabile locale (probabilmente esistente solo nella funzione) che è una matrice di tipi float vuota?

Sì, però in seguito tramite cicli for la "trasformo" nella matrice che è la somma delle due precedenti

CaMpIoN
25-11-2014, 22:46
Con i cicli for, tu riempi la matrice definita localmente nella funzione somma, oltre il blocco della funzione l'array non può essere utilizzato, perché è come se non esistesse più.
Ad esempio, il garbage collector di Java cancellerebbe dalla memoria quell'array appena uscito dal blocco.

oregon
25-11-2014, 23:43
La matrice somma è locale alla funzione somma. All'esterno di questa non esiste.

CaMpIoN
25-11-2014, 23:52
Per farla breve, con C++ dovresti definire l'array una sola volta in modo globale, in questo modo dovrebbe essere possibile l'accesso dalla funzione salva_file e somma in cui devi solo indirizzarti all'array, togli le definizioni dell'array dalle funzioni.

Loading