Oggetto creato scorrettamente

di il
9 risposte

Oggetto creato scorrettamente

Ciao a tutti!
Qualcuno può aiutarmi a capire perchè non funziona questo codice ?
Sembra che i metodi Getmat e stampaMatrice funzionino bene ma l'oggetto non venga creato correttamente.
La stampaMatrice mi restituisce numeri a caso cosi come il Getmat , consigli ?

#include <iostream>
using namespace std;
#include "Matrice.h"
# define N 3
#define M 5
main()
{
    int mat_1[N][M]={{2,15,44,56,77},{3,55,66,77,88},{22,54,66,87,89}};
    Matrice matrice_1(mat_1);
    cout<<matrice_1.Getmat(0,4);
    cout<<endl;
    matrice_1.stampaMatrice();
}

#define N 3
#define M 5
class Matrice
{
    public:
        Matrice(int mat[N][M])
        {
            this->mat[N][M]=mat[N][M];
        }
        int Getmat(int a,int b){return mat[a][b];}
        void stampaMatrice()
        {
            for(int i=0;i<N;i++){
                for(int j=0;j<M;j++){
                    cout<<mat[i][j]<<" ";
                }
                cout<<endl;
            }
        }
    private:
        int mat[N][M];

};

9 Risposte

  • Re: Oggetto creato scorrettamente

    Il consiglio è studiare bene cosa fa questo costruttore
    
            Matrice(int mat[N][M])
            {
                this->mat[N][M]=mat[N][M];
            }
    
    Di sicuro non ti fa i due cicli per riempirti la matrice
  • Re: Oggetto creato scorrettamente

    Ok grazie ho capito
    Ma non riempendo la matrice nel costruttore , i valori casuali che escono dalla stampa a cosa si riferiscono ?
  • Re: Oggetto creato scorrettamente

    Da quando la funzione main si scrive main() (senza tipo di ritorno esplicito)?!
  • Re: Oggetto creato scorrettamente

    CarlCarl ha scritto:


    Ok grazie ho capito
    Ma non riempendo la matrice nel costruttore , i valori casuali che escono dalla stampa a cosa si riferiscono ?
    Un array non inizializzato che valori ha?
  • Re: Oggetto creato scorrettamente

    C'e' anche un'altro problema. Il codice
    
            {
                this->mat[N][M]=mat[N][M];
            }
     
    NON FA quello che pensi!. Quello che volevi fare si scrive cosi':
    
            {
                this->mat=mat;
            }
     
    Questo, invece
    
    	mat[N][M]
    
    vuol dire: accedo alla riga CON INDICE N ed alla colonna CON INDICE M della matrice "mat".

    PICCOLO problema: gli INDICI della matrice sono validi SOLO nei range [0,N-1] e [0, M-1].

    QUINDI, con la riga di codice suddetta, stai accedendo ad un'area di memoria CHE NON E' TUA/NON HAI ALLOCATO TU!!

    Se non e' successo nulla (il classico "segmentation fault") e' SOLO per la solita fortuna del principiante
    (In realta' il motivo e' perche sei sullo stack, ma questa e' un'altra storia )
  • Re: Oggetto creato scorrettamente

    _Achille ha scritto:


    Da quando la funzione main si scrive main() (senza tipo di ritorno esplicito)?!
    Si hai ragione , dovrei scrivere int main() e return 0 , ma come mai funziona ugualmente ?
    Forse il compilatore esegue questo codice(int main e return 0) dietro le quinte ?

    Weierstrass ha scritto:


    CarlCarl ha scritto:


    Ok grazie ho capito
    Ma non riempendo la matrice nel costruttore , i valori casuali che escono dalla stampa a cosa si riferiscono ?
    Un array non inizializzato che valori ha?
    Da quanto ho capito se arr fosse una variabile globale sarebbe subito inizializzato con tutti 0 , altrimenti se non lo è come in questo caso le sue celle prendono i valori che sono nelle celle di memoria nel momento in cui quelle celle di memoria vengono utilizzate per creare arr.

    migliorabile ha scritto:


    C'e' anche un'altro problema. Il codice
    
            {
                this->mat[N][M]=mat[N][M];
            }
     
    NON FA quello che pensi!. Quello che volevi fare si scrive cosi':
    
            {
                this->mat=mat;
            }
     
    Questo, invece
    
    	mat[N][M]
    
    vuol dire: accedo alla riga CON INDICE N ed alla colonna CON INDICE M della matrice "mat".

    PICCOLO problema: gli INDICI della matrice sono validi SOLO nei range [0,N-1] e [0, M-1].

    QUINDI, con la riga di codice suddetta, stai accedendo ad un'area di memoria CHE NON E' TUA/NON HAI ALLOCATO TU!!

    Se non e' successo nulla (il classico "segmentation fault") e' SOLO per la solita fortuna del principiante
    (In realta' il motivo e' perche sei sullo stack, ma questa e' un'altra storia )
    Se scrivo
    
            {
                this->mat=mat;
            }
     
    mi da comunque errore , ho risolto scrivendo cosi :
    
    Cartella(int mat[N][M])
            {
                for(int i=0;i<N;i++)
                    for(int j=0;j<M;j++)
                        this->mat[i][j]=mat[i][j];
            }
    
    Intendi che devo sincerarmi prima che la memoria che verrà allocata per l'array sia vuota o comunque di nessuna utilità e quindi trascrivibile ?
    Avrei forse risolto creando l'oggetto dinamicamente con il "new" ?
  • Re: Oggetto creato scorrettamente

    CarlCarl ha scritto:


    _Achille ha scritto:


    Da quando la funzione main si scrive main() (senza tipo di ritorno esplicito)?!
    Si hai ragione , dovrei scrivere int main() e return 0 , ma come mai funziona ugualmente ?
    Forse il compilatore esegue questo codice(int main e return 0) dietro le quinte ?
    Il compilatore assume void main(void). Viene tollerato perché in progetto embedded non ha senso il return value del main, ma su pc è un errore
  • Re: Oggetto creato scorrettamente

    Se scrivo
    
            {
                this->mat=mat;
            }
     
    mi da comunque errore
    GIusto, corretto. Svista mia.
  • Re: Oggetto creato scorrettamente

    CarlCarl ha scritto:


    _Achille ha scritto:


    Da quando la funzione main si scrive main() (senza tipo di ritorno esplicito)?!
    Si hai ragione , dovrei scrivere int main() e return 0 , ma come mai funziona ugualmente ?
    Forse il compilatore esegue questo codice(int main e return 0) dietro le quinte ?
    return 0 non è obbligatorio, mentre il tipo di ritorno sì. La possibilità di omettere il tipo di ritorno viene dal C89. Attualmente sia lo standard C che lo standard C++ non supportano più. Il fatto che il tuo compilatore non dia errore è indicazione del fatto che è meglio cambiarlo/aggiornarlo. Procurati il più recente GNU C++ Compiler da MinGW.
Devi accedere o registrarti per scrivere nel forum
9 risposte