PDA

Visualizza la versione completa : [C++] Aiuto non riesco a vedere gli errori!


enricokr
16-07-2005, 20:30
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;
}
}

anx721
17-07-2005, 02:38
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.

enricokr
17-07-2005, 11:42
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!

anx721
17-07-2005, 15:19
Il modo piu semplice č di allocare dinamicamente la matrice e di restituire il puntatore alla matrice allocata:



Matrice *prodotto(Matrice &m1, Matrice &m2){
Matrice *m = 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::prodotto(&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:



Matrice prodotto(matrice &m1, Matrice &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.

Loading