Matrix – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Matrix – C / C++ – Fórum – Programujte.comMatrix – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Gadael0
Návštěvník
31. 12. 2007   #1
-
0
-

zdravim, mam problem s objektama - snazim se vytvorit si komplexni vypocetni knihovnu pro veskerou praci s maticema a vektorama - nejprve jsem udelal tridu vektor, ktera by mela byt sobestacna a plne funkcni - je v priloze. Pak jsem zacal delat tridu matice, kterou mam udelanou jako pole objektu tridy vektor (radky matice), tady ale nastaly problemy pri spousteni programu. Patrne to souvisi s nejakou alokaci tech poli nebo dealokaci, nevim. Normalne to jde zkompilovat ale kdyz to spustim, tak to vyhazuje vyjimku:

Vektor.h - v priloze

Matrix.h:

#ifndef _MATRIX_H_

#define _MATRIX_H_
#include <iostream>
using namespace std;



class Matrix {
int rows;
int cols;
Vector * space;

public:
Matrix(): rows(0), cols(0) {}
Matrix(int m, int n);
Matrix(int m, int n, float x);
virtual ~Matrix();
Vector & operator [](int i);
friend ostream& operator<<(ostream& o, Matrix& m) {

for (int i = 0; i < m.rows; i++) {
o << m.space[i] << endl;
}
o << endl;
return o;
}
Matrix & operator+(const Matrix& m) const;
Matrix operator-(const Matrix& m);
};

Matrix::Matrix(int m, int n) {
rows = m;
cols = n;
space = new Vector[rows*cols];
Vector Zero(cols);
for(int i=0; i<rows; i++) space[i]=Zero;
}

Matrix::Matrix(int m, int n, float x) {
rows = m;
cols = n;
space = new Vector[rows*cols];
Vector X(cols,x);
for(int i=0; i<rows; i++) space[i]=X;
}

Matrix::~Matrix() {
if(space!=0) delete [] space;
}

Vector & Matrix::operator [] (int i) {
return space[i];
}

Matrix & Matrix::operator+(const Matrix& m) const {

Matrix temp(*this);
for(int i=0; i<rows; i++) temp.space[i]=space[i]+m.space[i];
return temp;
}

Matrix Matrix::operator-(const Matrix& m) {

Matrix temp(*this);
for(int i=0; i<rows; i++) temp.space[i]=space[i]-m.space[i];
return temp;
}

#endif


Main.cpp - tady si jenom testuju funkcnost jednotlivych funkci a operatoru:
#include <iostream>

#include <cstdlib>
#include "vector.h"
#include "matrix.h"

using namespace std;


int main(int argc, char *argv[])
{
Vector x(3,1);
cout << x << endl << endl;
Matrix A(5,4,5);
A[1]=Vector(4,0);
A[1][1]=1;
cout << A;
Matrix B(5,4,2);
cout << B;
Vector a(4);
a=A[0]+B[1];
cout << a << endl << endl;
Matrix C(5,4);
C=A+B;
cout << C;
system("PAUSE");
return EXIT_SUCCESS;
}


Po spusteni by to melo vypsat:

(1,1,1)

(5,5,5,5)
(0,1,0,0)
(5,5,5,5)
(5,5,5,5)
(5,5,5,5)

(2,2,2,2)
(2,2,2,2)
(2,2,2,2)
(2,2,2,2)
(2,2,2,2)

(7,7,7,7)

(7,7,7,7)
(2,3,2,2)
(7,7,7,7)
(7,7,7,7)
(7,7,7,7)

Patrne jde o nejakou jednoduchou chybu, ale nevim si s tim uz dlouho rady. Ta trida Matrix je samozrejme teprve rozdelana, zatim jsem si pretizil operatory + a -. Testuju na VS2005.
Predem diky moc. Honza

Nahlásit jako SPAM
IP: 193.165.2.–
Nejhorsi, co se Vam v zivote muze prihodit je, ze narazite na blbce...
Reklama
Reklama
Jura
~ Anonymní uživatel
634 příspěvků
31. 12. 2007   #2
-
0
-

Zdravím,

neprohlížel jsem to, ale jediné, co mi doslova bije do očí, je že nikde nevidím vlastní kopírovací konstruktor a operátor přiřazení. Tzn. že vytvářís pouze mělké kopie.
Takže zbývá ti implementovat, jak operátor=, tak kopy konstuktor.
A dále toto je akože čo?;-)



Matrix & Matrix::operator+(const Matrix& m) const { // co ta refernece na lokalní objekt??

Matrix temp(*this);
for(int i=0; i<rows; i++) temp.space[i]=space[i]+m.space[i];
return temp;
}


A dále pokud z té třídy nechceš dědit, tak je ten virtuální destruktor zbytečný. No, snad je to všechno, ještě si aspoň pohlídej meze u polí(zpočátku asserty stačí, ale jinak bych tam hodil výjímky).
Každopádně hodně zdaru.

Přeju pěkný nový rok

Nahlásit jako SPAM
IP: 85.207.192.–
Gadael0
Návštěvník
31. 12. 2007   #3
-
0
-

parada, diky moc - vubec jsem si neuvedomil absenci kopirovaciho konstr. ani op. prirazeni... ted to bezi jak ma, ale jsem si jistej, ze jeste narazim na spoustu problemu, takze tohle vlakno zatim nebudu uzavirat :-)

Nahlásit jako SPAM
IP: 193.165.2.–
Nejhorsi, co se Vam v zivote muze prihodit je, ze narazite na blbce...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 108 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý