Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++] Aiuto non riesco a vedere gli errori!

    Ringrazio anticipatamente chi volesse cimentarsi nel darmi una mano, martedì ho un esame di informatica! :P
    Ho implementato la classe Matrice, che riporto qui di seguito (veramente l'ho scopiazzata dal prof), ma mentre io non riesco a vedere alcun errore ecco cosa mi esce dopo la compilazione in Visual C++:

    Compiling...
    matrice.cpp
    matrice.cpp(32) : error C2556: 'int __thiscall Matrice::trasposta(void)' : overloaded function differs only by return type from 'void __thiscall Matrice::trasposta(void)'
    matrice.h(24) : see declaration of 'trasposta'
    matrice.cpp(32) : error C2371: 'trasposta' : redefinition; different basic types
    matrice.h(24) : see declaration of 'trasposta'
    matrice.cpp(39) : error C2374: 'i' : redefinition; multiple initialization
    matrice.cpp(34) : see declaration of 'i'
    matrice.cpp(48) : error C2556: 'int __thiscall Matrice::diagonale(void)' : overloaded function differs only by return type from 'void __thiscall Matrice::diagonale(void)'
    matrice.h(26) : see declaration of 'diagonale'
    matrice.cpp(48) : error C2371: 'diagonale' : redefinition; different basic types
    matrice.h(26) : see declaration of 'diagonale'
    matrice.cpp(67) : error C2556: 'int __thiscall Matrice::stampa(void)' : overloaded function differs only by return type from 'void __thiscall Matrice::stampa(void)'
    matrice.h(28) : see declaration of 'stampa'
    matrice.cpp(67) : error C2371: 'stampa' : redefinition; different basic types
    matrice.h(28) : see declaration of 'stampa'
    Error executing cl.exe.

    Matrici.exe - 7 error(s), 0 warning(s)


    Il codice è il seguente:

    // matrice.h
    #ifndef MATRICE_H
    #define MATRICE_H
    #include <iostream>
    using namespace std;
    class Matrice {
    private:
    int numRighe;
    int numColonne;
    int **p; //puntatore ad un array di puntatori
    public:
    //costruttore di default
    Matrice ();
    //costruttore
    Matrice (int nr, int nc);
    //distruttore
    ~Matrice ();
    //inverte la matrice
    void inversa();
    //restituisce l'elemento (i,j)
    int getElemento (int i, int j);
    //set dell'elemento (i,j)
    int setElemento (int i, int j, int valore);
    //calcola la trasposta
    void trasposta();
    //verifica che sia diagonale
    void diagonale();
    //stampa della matrice
    void stampa();
    };
    #endif

    //matrice.cpp
    #include "Matrice.h"
    //costruttore di default
    Matrice::Matrice(){
    numRighe=0;
    numColonne=0;
    p=0;
    }
    //costruttore
    Matrice::Matrice(int nr, int nc){
    numRighe=nr;
    numColonne=nc;
    p= new int* [numRighe]; //array di puntatori
    for (int i=0; i<numRighe; i++)
    p[i] =new int [numColonne]; //array di valori
    }
    //distruttore
    Matrice::~Matrice(){
    cout << "Distruzione della matrice..." << endl;
    for (int i=0; i<numRighe; i++)
    delete [] p[i];
    delete [] p;
    }
    //restituisce l'elemento (i,j)
    Matrice::getElemento (int i, int j) {
    return p[i][j];
    }
    //set dell'elemento (i,j)
    Matrice::setElemento (int i, int j, int valore){
    p[i][j]=valore;
    }
    //calcola la trasposta
    Matrice::trasposta (void){
    int **q= new int *[numColonne];
    for (int i=0; i<numRighe; i++)
    q[i]= new int [numRighe];
    for (i=0; i<numRighe; i++)
    for (int j=0; j < numColonne; j++)
    q[i][j]=p[j][i];
    for (int i=0; i<numRighe; i++)
    delete [] p[i];
    delete [] p;
    int temp=numRighe;
    numRighe=numColonne;
    numColonne=temp;
    p=q;
    }
    //verifica che sia diagonale
    Matrice::diagonale(){
    bool check=true;
    if (numRighe!=numColonne)
    check=false;
    else {
    for (int i=0; i<numRighe && check==true; i++) {
    for (int j=0; j<numRighe && check==true; j++) {
    if (i!=j && p[i][j]!=0)
    check=false;
    }
    }
    }
    if (check==true)
    cout << "La matrice è diagonale" << endl;
    if (check==false)
    cout << "La matrice non è diagonale" << endl;

    }
    //stampa della matrice
    Matrice::stampa(){
    for (int i=0; i<numRighe; i++){
    for (int j=0; j<numColonne; j++)
    cout << p[i][j] << " ";
    cout << endl;
    }
    }

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    il problema potrebbe dipendere dal fatto che non metti il tipo di ritorno "void" nel file .cpp quando implementi le funzioni e quindi assume per default il tipo int generando l'errore.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Grazie! Il problema era proprio questo!
    Se adesso volessi creare una funzione PRODOTTO che riceva due Matrici e me ne ritorni una terza, risultato del prodotto della prima prima per la seconda, come dovrei fare?
    Ho provato con
    Matrice prodotto (Matrice A, Matrice B);
    ma poi non riesco a chiamarla nel main. Mi spiego:
    Se ho le matrici M1 e M2 e voglio trovare la Matrice M3 prodotto tra le due cosa scrivo nel main?
    M3.prodotto (M1, M2);???
    Non me l'accetta!
    Grazie per l'ulteriore aiuto!

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Il modo piu semplice è di allocare dinamicamente la matrice e di restituire il puntatore alla matrice allocata:

    Codice PHP:
    Matrice *prodotto(Matrice &m1Matrice &m2){
         
    Matrice *= new Matrice(...)
        
    //effettui le operazioni per il prodotto
        //restituici m
        
    return m;

    poi nel main la devi invocare come

    Matrice *m = M1.prodotto(&M1, &M2);

    per eseguire il prodotto tra M1 e M2. Nota che se passi entrambe le matrici da moltiplicare come argomento la funzione puo essere dichiarata static ed invocata così:

    Matrice *m = Matrice:rodotto(&M1, &M2);

    Se non vuoi ritornare il puntatore ad una matrice, ma un oggetto matrice credo che tu debba implementare un costruttore di copia per la classe Matrice: quando ritorni un oggetto in fatti quello che succedde è la creazione di un nuovo oggetto attraverso il costruttore di copia che riceve come argomento l'oggetto ritornato. Ad esempio:

    Codice PHP:
    Matrice prodotto(matrice &m1Matrice &m2){
        
    Matrice m(..., ...);
        
    //efettui il prodotto
        //ritorni m
        
    return m;

    Quando poi esegui:

    Matrice mprod = M1.prodotto(&M1, &M2);

    quello che accade è che l'oggetto m viene ritornato dalla funzione e poichè esso viene assegnato ad un nuovo oggetto viene eseguito il costruttore di copia su m per ottenere l'oggetto mprod.

    Nel tuo caso il costruttore di copia deve fare in modo di settare i campi che rappresentano il numero di colonne e di righe come quello della amtrice originaria e poi allocare gli array e ricopiare i loro valori.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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 © 2024 vBulletin Solutions, Inc. All rights reserved.