Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Salve a tutti!
Io sto scrivendo un programma per lavorare con le matrici usando le classi. Per le operazioni uso gli operatori. Di seguito posto parte del codice, dove mostro come ho implementato gli operatori += e +. In main ho creato due semplici matrici 3 * 3 e ho provato a sommarle.
Codice sorgente - presumibilmente C++
#include <iostream>
#include <iomanip>
usingnamespace std;
class Matrix
{
private:
string name;// matrix's name
int m, n;// dimensions (m - rows, n - cols)
double*data;// data, stored row by row
public:
Matrix(string, int, int, double[]);// constructor
void operator+=(Matrix);// add a matrix to this
Matrix operator+(Matrix);// add two matrix
friend ostream& operator<<(ostream &out, Matrix A);// stream out
};
Matrix::Matrix(string name, int n, int m, double*data)
{
this->name = name, this->n = n, this->m = m, this->data = data;// assignements
double data_out[this->m * this->n];// temporany array with new data
for(int i =0; i < this->m * this->n; i++) data_out[i]= this->data[i];// copy the data
Matrix out = Matrix(this->name +" + "+ rhs.name, this->m, this->n, data_out);// create a copy of this
out += rhs;// add tho the copy of this rhs
return out;// return the copy
}
ostream& operator<<(ostream &out, Matrix A)
{
out << A.name<<" =";
for(int i =0; i < A.m* A.n; i++)
{
out << setw(10);
if(i % A.n) out << setw(10);
else out << endl << endl;
out << A.data[i];
}
out << endl;
return out;
}
int main()
{
// creo le matrici
double a[9]={1, 2, 3, 4, 5, 6, 7, 8 ,9};
Matrix A = Matrix("A", 3, 3, a);
double b[]={10, 11, 12, 13, 14, 15, 16, 17, 18};
Matrix B = Matrix("B", 3, 3, b);
// test
cout<< A << endl << B << endl;
cout<< A + B << endl;// ??????????????????????????
system("pause");
return0;
}
In breve, la classe contiene una stringa per il nome della matrice, le dimensioni di essa e tutti gli elementi salvati in un array di tipo double riga per riga (ho commentato il codice in inglese spero sia comprensibile).
L'operatore += funziona correttamente. Il problema è che l'operazione A + B invece non funziona correttamente, eseguendo il codice viene visualizzata una matrice con valori casuali.
La strategia che ho utilizzato è la seguente:
1. Copia i dati di this in un array temporaneo.
2. Crea una nuova matrice col costruttore a partire dall'array temporaneo.
3. Applica l'operatore += alla nuova matrice con rhs come argmoento
4. Restituisci la matrice.
Premetto che ho già provato una moltitudine di soluzioni alternative senza successo (aggiungendo tutte le combinazioni possibili di "const" e "&" agli argomenti e alle funzioni), e che ho lo stesso problema su tutte le altre funzioni che ho implementato (ad es Matrix * Matrix).
Inoltre anche impementando in maniera diversa l'operatore + (senza usare il += già implementato, per intenderci) ho lo stesso problema.
Sapete dirmi cosa sbaglio? C'entra per caso con il fatto che l'attributo double *data non ha (non può avere) dimensione fissa?
Grazie in anticipo,
Fabio
PS:
1. uso Dev-C++ (che io trovo buono nonostante tutte le critiche che ho letto)
2. #include <iomanip> serve per la funzione setw() in ostream& operator<<(ostream&, Matrix). Se non riuscite a compilare togliete #include <iomanip> e sostituite setw(10) con "\t".
3. system("pause"); --> windows...
Ok problema risolto
Chiaramente dopo un giorno di tentativi vani l'intuizione è arrivata solo dopo aver postato il codice sul forum un ultimo tentativo per scoprire che si era a un passo dalla soluzione!
Bastava inizializzare data_out in Matrix Matrix::operator+(Matrix rhs) come pointer: