PDA

Visualizza la versione completa : [C++] Crash in inserimento elementi in matrice


Martina3
28-11-2016, 19:40
Salve, anche io avrei bisogno di un consiglio. Uso dev c++ su windows 10 ma da qualche giorno non mi esegue più i programmi anche se sono corretti... Sapete darmi una soluzione? L'errore è ".exe ha smesso di funzionare"
Per esempio:


#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
int n;
int m;
int mat[n][m];

cout<<"Inserire numero righe ";
cin>>n;
cout<<"Inserire numero colonne ";
cin>>m;
for(int i=0; i<n; i++){
cout<<"Inserire elemento della "<<i+1<<" riga \n";
for(int j=0; j<m; j++){
cin>>mat[i][j];
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cout<<mat[i][j];
}
cout<<"\n";
}


system("pause");
return 0;
}

boots
28-11-2016, 20:12
Dovresti aprire un thread apposito per la tua domanda, non "accodarti" ad un altro che non c'entra poco con la tua domanda.

Cmq, se allochi nello stack devi specificare la dimensione dell'oggetto. Nel tuo caso n e m non sono inizializzate e non si sa quanto valgono.
Di conseguenza mat ha una dimensione ignota. Di conseguenza è possibile che nel tuo ciclo vai fuori dalla dimensione di mat ed il programma va in crash.

Se la dimensione non la sai a priori, devi allocare in modo dinamico, ad esempio:


#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
int n;
int m;
int **mat;

cout<<"Inserire numero righe ";
cin>>n;
cout<<"Inserire numero colonne ";
cin>>m;
mat = new int*[n];
for(int i=0; i<n; i++){
mat[i] = new int[m];
cout<<"Inserire elemento della "<<i+1<<" riga \n";
for(int j=0; j<m; j++){
cin>>mat[i][j];
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cout<<mat[i][j];
}
cout<<"\n";
}


system("pause");
return 0;
}


Se vuoi mantenere la matrice nello stack, devi fare una cosa del genere:




#include<iostream>
#include<stdlib.h>
#define R 100
#define C 100
using namespace std;
int main(){
int n;
int m;
int mat[R][C];

cout<<"Inserire numero righe ";
cin>>n;
cout<<"Inserire numero colonne ";
cin>>m;
// n deve essere <= R e m <= C
for(int i=0; i<n; i++){

cout<<"Inserire elemento della "<<i+1<<" riga \n";
for(int j=0; j<m; j++){
cin>>mat[i][j];
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cout<<mat[i][j];
}
cout<<"\n";
}


system("pause");
return 0;
}

Ovviamente è uno spreco di memoria

Martina3
28-11-2016, 20:42
Ah vabbene, ma perchè se inserisco da tastiera n=2 ed m=3 funziona e con numeri più grandi no?

boots
28-11-2016, 21:58
Come ti ho detto, se non inizializzi n ed m, non sai quanto valgono. Di conseguenza non sai quanta memoria è allocata per mat.
Ad esempio, se n e m valgono 1 (ma non si sa), mat sarà grande 2*sizeof(int). Se tu metti n=2 e m=3 ad un certo punto andrai fuori dalla memoria allocata per mat(es n=0 e m=2 cercherai di scrivere il 3° int, ma mat ne può contenere solo 2).
Il problema è che questo "bug" può non manifestarsi se la memoria a cui accedi non crea problemi. Ovviamente più vai fuori dai limiti dell'array(n e m grandi, ma mat è molto più piccolo o uguale a zero) più è probabile che tenti di accedere a zone della memoria che possono creare problemi (fuori dalla memoria assegnata dal s.o. al processo oppure vai a sovrascrivere altre variabili, che porta ad un comportamento anomalo del programma)

Martina3
28-11-2016, 22:02
Grazie!! Mi hai chiarito un sacco di concetti

MItaly
28-11-2016, 23:23
Ho separato i messaggi dalla discussione a cui ti eri accodato e aggiunto i tag
... ; in futuro ricordati di aprire una discussione separata invece di "deragliarne" di esistenti. :D

:ciauz:

Loading