Exit code

di il
15 risposte

Exit code

Salve, sto scrivendo un programma che mandando in run si interrompe con il seguente errore "exit code -1073741819 (0xC0000005)". In particolare dopo aver inserito la dimensione della base della figura. Le stesse righe di codice inserite in un'altra finestra non danno problemi.Di seguito copio il main.cpp Monitor.cpp Monitor.h
#include <iostream>
#include "Monitor.h"
using namespace std;


int main() {
    Monitor Monitor1;
    int row_number=0,col_number=0,n=0,X=0,Y=0;
    char c = '0';

    do {
        cout << "Inserire il numero di righe della matrice:";
        cin >> row_number;

        if ((row_number <= 0))
            cerr << "Il numero inserito (" << row_number <<  ") deve essere > 0" << endl;
    }
    while ((row_number <= 0)||(row_number > 30));
    Monitor1.setRows(row_number);

    do {
        cout << "Inserire il numero di colonne della matrice:";
        cin >> col_number;

        if ( (col_number <= 0))
            cerr << "Il numero inserito (" << col_number << ") deve essere > 0" << endl;
    }
    while ((col_number <= 0)||(col_number > 30));
    Monitor1.setCols(col_number);

    Monitor1.print();

    do{
        cout << "\nInserisci una figura nel monitor q per quadrato t per triangolo e r per rombo, 0 per uscire:";
        cin >> c;
        cout << "\nInserisci dimensione della base della figura:";
        cin >> n;
        cout << "\nInserisci coordinate X e Y dove collocare la figura:";
        cin >> X >> Y;

        if (c=='q'){
            Monitor1.addSquare(n, X , Y );
        }

        if (c=='r'){
            Monitor1.addRhombus(n, X, Y);
        }

        if (c=='t'){
            Monitor1.addTriangle(n, X, Y);
        }

        else if (c != '0')
            cerr << "\nInserire un valore valido q,r,t o 0";

        if(c == 't'||c =='r'||c =='q')
            Monitor1.print();

    }while(c!= '0');
    return 0;
}
#include "Monitor.h"
#include <iostream>

#define OK		0
#define NO_MEM	-1

using namespace std;
int **screen = nullptr;

Monitor::Monitor(){
    _row_number=0 ; // number of row of the monitor
    _col_number=0 ; // number of column of the monitor
    _screen[ MAX_R ][ MAX_C ] = {};
    _n=0; // figure dimension
    _coordinateX=0; // X coordinate
    _coordinateY=0 ; // Y coordinate
};


void Monitor::setRows( int row_number ){
    _row_number = row_number;
    screen = (int **) new (nothrow) int[_row_number];

    if (screen == NULL) {
        cerr << "Non è stato possibile allocare " << _row_number << " elementi" << endl;
        exit(NO_MEM);
    }
}

void Monitor::setCols( int col_number){
    _col_number=col_number;

    for (int i = 0; i < _row_number; i++) {
        screen[i] = (int *) new (nothrow) int (_col_number);
        if (screen[i] == NULL) {
            cerr << "Non è stato possibile allocare " << _col_number << " elementi" << endl;
            exit(NO_MEM);
        }
    }
}

void Monitor::print (){
    cout << endl;
    for (int i = 0; i < _row_number; i++) {
        for (int j = 0; j < _col_number; j++) {
            // i => riga, j => colonna
            // 0, _col_number - 1 				=> riga 0
            // _col_number,	_col_number + _col_number-1			=> riga 1
            screen[i][j] =_screen[i][j];
            cout << screen[i][j] << " ";
        }
        cout << endl;
    }
   /* for (int i = 0; i < _row_number; i++) {
        for (int j = 0; j < _col_number; j++) {
            cout << screen[i][j];
            if (j < _col_number - 1) cout << " ";
            else cout << endl;
        }
    }*/
}

Monitor::~Monitor() {
    delete screen;
}

void Monitor::addRhombus(int n, int coordinateX, int coordinateY) {
    _n = n;
    _coordinateX = coordinateX;
    _coordinateY = coordinateY;

    for (int i = 0;_coordinateY+i < _coordinateY+_n;i++){
        for(int j = 0;_coordinateX+j < _coordinateX+_n;j++){
            _screen[_coordinateY+i][_coordinateX+j]=1;
        }
    }
}


void Monitor::addTriangle(int n, int coordinateX, int coordinateY) {
    _n = n;
    _coordinateX = coordinateX;
    _coordinateY = coordinateY;

    for (int i = 0;_coordinateY+i < _coordinateY+_n;i++){
        for(int j = 0;_coordinateX+j < _coordinateX+_n;j++){
            _screen[_coordinateY+i][_coordinateX+j]=1;
        }
    }
}


void Monitor::addSquare(int n, int coordinateX, int coordinateY) {
    _n = n;
    _coordinateX = coordinateX;
    _coordinateY = coordinateY;

    for (int i = 0;_coordinateY+i < _coordinateY+_n;i++){
        for(int j = 0;_coordinateX+j < _coordinateX+_n;j++){
            _screen[_coordinateY+i][_coordinateX+j]=1;
        }
    }
}
#define MAX_R 30
#define MAX_C 30

class Monitor {

 public :
    Monitor (); // Constructor
    ~ Monitor (); // Destructor

    // set the number of row of the monitor
    void setRows ( int _row_number );
    // set the number of column of the monitor
    void setCols ( int col_number );

    // add a square
    void addSquare ( int n, int coordinateX , int coordinateY );
    // add a triangle
    void addTriangle (int n, int coordinateX , int coordinateY );
    // add a rhombus
    void addRhombus ( int n, int coordinateX , int coordinateY );

    void print (); // print the Monitor on the terminal

 private :
    int _screen [ MAX_R ][ MAX_C ]={}; // Pixel matrix of the monitor
    int _row_number ; // number of row of the monitor
    int _col_number ; // number of column of the monitor
    int _n; // figure dimension
    int _coordinateX ; // X coordinate
    int _coordinateY ; // Y coordinate
};

# endif //ALGORITMI_MONITOR_H
Il terminale scrive questo:
C:\Users\Giuse\CLionProjects\Algoritmi\cmake-build-debug\Es3_03.exe
Inserire il numero di righe della matrice:15
Inserire il numero di colonne della matrice:20

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Inserisci una figura nel monitor q per quadrato t per triangolo e r per rombo, 0 per uscire:q

Inserisci dimensione della base della figura:4

Process finished with exit code -1073741819 (0xC0000005)
Vi ringrazio qualora riusciste a risolvermi il problema. Non so davvero cosa possa essere.

15 Risposte

  • Re: Exit code

    E' il segmentation fault.

    Rifletti su come si alloca una matrice

    p.s.: se programmi ad oggetti, è meglio usare le variabili static dentro la classe stessa invece di quelle globali
  • Re: Exit code

    Ma non ho capito in che modo la variabile n incide sulla matrice
  • Re: Exit code

    Infatti non incide. Risovi il problema che sta prima, poi cosa succede dopo non è rilevante e dipende da tante cose visto che hai degli stream di mezzo
  • Re: Exit code

    Cioè ti crasha quando inserisci n?
  • Re: Exit code

    Si esce exit code -1073741819 (0xC0000005). Ora ho risolto non usando più il doppio puntatore per definire la matrice, ma con qualche combinazione delle coordinate X e Y mi è capitato lo stesso exit code. Per adesso non so ancora interpretarlo bene
  • Re: Exit code

    Qui stai già allocando un sacco di byte
    
        int _screen [ MAX_R ][ MAX_C ]={}; // Pixel matrix of the monitor
        int _row_number ; // number of row of the monitor
        int _col_number ; // number of column of the monitor
    
    Lo schermo deve essere unico per tutti gli oggetti? allora
    
        static int _screen [ MAX_R ][ MAX_C ]={}; // Pixel matrix of the monitor
        static int _row_number ; // number of row of the monitor
        static int _col_number ; // number of column of the monitor
    
    e _screen, _row_number e _col_number sono unici per tutte le istanze della classe. L'allocazione dinamica non ti serve a niente, perché hai già allocato memoria sufficiente per il worst case
  • Re: Exit code

    La classe la definisce così l'esercizio.
    Cattura.PNG
    Cattura.PNG

    Si ora non definisco più dinamicamente la matrice
  • Re: Exit code

    Quindi l'esercizio ti sta dicendo chiaramente di non utilizzare l'allocazione dinamica.
    Consiglio non vuol dire obbligo. In ogni caso puoi lasciare anche le variabili così come sono senza l'attributo static, basta che non fai troppe istanze
  • Re: Exit code

    Comunque a me non dava problemi. Certo, se dai coordinate troppo grandi può fallire, in quanto vai a disegnare la figura fuori dalla matrice. Però per come ho capito non ci arrivavi proprio a inserire le coordinate.
  • Re: Exit code

    Alexv ha scritto:


    Comunque a me non dava problemi.
    E che vuol dire? A me dà segmentation fault come a lui nella print alla linea screen[ i ][j] =_screen[ i ][j];
    e il motivo è evidente. Che poi riesca ad andare avanti è perché non usa il debugger
  • Re: Exit code

    Ho risolto il codice e l'ho cambiato in questo modo
    main.cpp
    #include <iostream>
    #include "Monitor.h"
    using namespace std;
    
    
    int main() {
        Monitor Monitor1;
        int row_number=0,col_number=0,n=0,X=0,Y=0;
        char c = '0';
    
        do {
            cout << "Inserire il numero di righe della matrice:";
            cin >> row_number;
    
            if ((row_number <= 0))
                cerr << "Il numero inserito (" << row_number <<  ") deve essere > 0" << endl;
        }
        while ((row_number <= 0)||(row_number > 30));
        Monitor1.setRows(row_number);
    
        do {
            cout << "Inserire il numero di colonne della matrice:";
            cin >> col_number;
    
            if ( (col_number <= 0))
                cerr << "Il numero inserito (" << col_number << ") deve essere > 0" << endl;
        }
        while ((col_number <= 0)||(col_number > 30));
        Monitor1.setCols(col_number);
    
        Monitor1.print();
    
        do{
            cout << "\nInserisci una figura nel monitor q per quadrato t per triangolo e r per rombo,c per pulire il monitor, 0 per uscire:";
            cin >> c;
    
            if( c=='t'|| c=='r' || c=='q'){
                cout << "\nInserisci dimensione della base della figura:";
                cin >> n;
                cout << "\nInserisci coordinate X e Y dove collocare la figura:";
                cin >> X >> Y;
            }
    
            if (c=='q'){
                Monitor1.addSquare(n, X , Y );
            }
    
            if (c=='r'){
                Monitor1.addRhombus(n, X, Y);
            }
    
            if (c=='t'){
                Monitor1.addTriangle(n, X, Y);
            }
    
            if(c=='c')
                Monitor1.cleanMonitor();
    
            if (c!='0'&& c!='t'&& c!='r'&& c!='q'&& c!='c')
                cerr << "\nInserire un valore valido q,r,t,c o 0\n";
    
            if(c == 't'||c =='r'||c =='q'||c =='c')
                Monitor1.print();
    
        }while(c!= '0');
        return 0;
    }
    
    Monitor.cpp
    //
    // Created by Giuse on 02/11/2021.
    //
    
    #include "Monitor.h"
    #include <iostream>
    
    #define OK		0
    #define NO_MEM	-1
    
    using namespace std;
    //int **screen = nullptr;
    
    Monitor::Monitor(){
        _row_number=0 ; // number of row of the monitor
        _col_number=0 ; // number of column of the monitor
        //_screen[MAX_R][MAX_C]= {};
        _n=0; // figure dimension
        _coordinateX=0; // X coordinate
        _coordinateY=0 ; // Y coordinate
    };
    
    
    void Monitor::setRows( int row_number ){
        _row_number = row_number;
        /*screen = (int **) new (nothrow) int[_row_number];
    
        if (screen == NULL) {
            cerr << "Non è stato possibile allocare " << _row_number << " elementi" << endl;
            exit(NO_MEM);
        }*/
    }
    
    void Monitor::setCols( int col_number){
        _col_number=col_number;
    
       /* for (int i = 0; i < _row_number; i++) {
            screen[i] = (int *) new (nothrow) int (_col_number);
            if (screen[i] == NULL) {
                cerr << "Non è stato possibile allocare " << _col_number << " elementi" << endl;
                exit(NO_MEM);
            }
        }*/
    }
    
    void Monitor::print (){
        cout << endl;
        for (int i = 0; i < _row_number; i++) {
            for (int j = 0; j < _col_number; j++) {
    
                cout << _screen[i][j]<<" ";
            }
            cout << endl;
        }
    }
    Monitor.h
    #ifndef ALGORITMI_MONITOR_H
    #define ALGORITMI_MONITOR_H
    
    #define MAX_R 30
    #define MAX_C 30
    
    class Monitor {
    
     public :
        Monitor (); // Constructor
        ~ Monitor (); // Destructor
    
        // set the number of row of the monitor
        void setRows ( int _row_number );
        // set the number of column of the monitor
        void setCols ( int col_number );
        //Restart monitor to zero
        void cleanMonitor();
    
        // add a square
        void addSquare ( int n, int coordinateX , int coordinateY );
        // add a triangle
        void addTriangle (int n, int coordinateX , int coordinateY );
        // add a rhombus
        void addRhombus ( int n, int coordinateX , int coordinateY );
    
        void print (); // print the Monitor on the terminal
    
     private :
        int _screen [ MAX_R ][ MAX_C ]={}; // Pixel matrix of the monitor
        int _row_number ; // number of row of the monitor
        int _col_number ; // number of column of the monitor
        int _n; // figure dimension
        int _coordinateX ; // X coordinate
        int _coordinateY ; // Y coordinate
    };
    
    # endif //ALGORITMI_MONITOR_H
    
    Qualcuno ora potrebbe spiegarmi questi errori voluti da terminale?
    C:\Users\Giuse\CLionProjects\Algoritmi\cmake-build-debug\Es3_03.exe
    Inserire il numero di righe della matrice:15
    Inserire il numero di colonne della matrice:20

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    Inserisci una figura nel monitor q per quadrato t per triangolo e r per rombo,c per pulire il monitor, 0 per uscire:r

    Inserisci dimensione della base della figura:88

    Inserisci coordinate X e Y dove collocare la figura:7
    10

    0

    Inserisci una figura nel monitor q per quadrato t per triangolo e r per rombo,c per pulire il monitor, 0 per uscire:q

    Inserisci dimensione della base della figura:32

    Inserisci coordinate X e Y dove collocare la figura:7
    10

    Process finished with exit code -1073741819 (0xC0000005)
  • Re: Exit code

    E' ovvio che sei uscito dai limiti della matrice in memoria, hai sporcato lo stack e i risultati sono imprevedibili.
  • Re: Exit code

    oregon ha scritto:


    E' ovvio che sei uscito dai limiti della matrice in memoria, hai sporcato lo stack e i risultati sono imprevedibili.
    La prima domanda invece? di solito quando usciva dai limiti mi esce l'exit code ora perchè zero?
  • Re: Exit code

    Ti ho detto che le conseguenze non sono prevedibili... dipende da tante cose e dallo stato della memoria in quel momento.
Devi accedere o registrarti per scrivere nel forum
15 risposte