Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    12

    [C++] Crash in inserimento elementi in matrice

    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:

    codice:
    #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;
    }
    Ultima modifica di MItaly; 28-11-2016 a 23:21 Motivo: Tag CODE, split da discussione irrelata

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,521
    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:
    codice:
    #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:

    codice:
    #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
    Ultima modifica di boots; 28-11-2016 a 20:18

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    12
    Ah vabbene, ma perchè se inserisco da tastiera n=2 ed m=3 funziona e con numeri più grandi no?

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,521
    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)
    Ultima modifica di boots; 28-11-2016 a 22:04

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    12
    Grazie!! Mi hai chiarito un sacco di concetti

  6. #6

    Moderazione

    Ho separato i messaggi dalla discussione a cui ti eri accodato e aggiunto i tag [CODE] ... [/CODE]; in futuro ricordati di aprire una discussione separata invece di "deragliarne" di esistenti.

    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.