Keresés

Új hozzászólás Aktív témák

  • vimes

    senior tag

    válasz vimes #3734 üzenetére

    Na, most átnéztem a kódot, és megtaláltam a szegmentálási hiba okát is:
    for(int j = 0; i < oszlopok; j++)
    gj :D volt vagy fél óra mire ezt a pitiáner hibát észrevettem....

    Közben a gyakvezéremtől is kaptam választ, amiből megértettem, hogy mit rontottam el, és hogy miért is nem értettem a fordító hibaüzenetét, most már (azt hiszem :D) világos a szitu, úgyhogy úgy néz ki megoldódott a problémám :)

  • vimes

    senior tag

    Na így már lefordult, viszont el is szállt szegmentálási hibával :D az első mátrix első sorát jól kiírta, aztán kb. beterítette a konzolt a memóriaszemét, meg a sok 0 :D De mivel már a mátrix elemeinek kiíratásánál elszállt, legalább az sanszos, hogy a konstruktorban csesztem el valamit. Majd holnap (ma) délelőtt átnézem alaposan a kódot.

    Hát igen, van egy kis kilométer-hiányom C++-ban :D az látszik. Kb. 2-3 órát programozgattam szemeszter kezdete óta, elvették az időm a többi tárgyak :)

    "A C-s tömbök azért elég rémisztően néznek ki, meg a félig magyar metódus- és változónevek is."

    :D Nem vagyok nagy operator overloading-császár, de gyanús hogy abban sem szoktak vezérlési szerkezeteket használni :) Nyilván nem a legjobb a kód stílusa, most csak az lenne a lényeg, hogy működő legyen a kód, leadhassam, aztán készülhessek a C++ gyakvizsgára. Akkor már lesz is időm leülni rendesen programozni...

    Ja, és köszönöm szépen mindkettőtöknek a segítséget!

  • vimes

    senior tag

    Sziasztok,

    Alább látható az általam írt forráskód (a program két mátrixot ad össze, von ki, szoroz össze). A problémám, hogy a main függvényben, mikor az operator overloading-ot szeretném használni, arra a három sorra error-t kapok a fordítótól, de nem értem miért...
    (Szerintem elég az operator overloading-os részt elolvasni a kódból, de mivel én nem tudom pontosan hol a hiba, ez nem 100%)
    #include <iostream>
    #include <iomanip>
    using namespace std;

    class Matrix{
    private:
    unsigned int sorok;
    unsigned int oszlopok;
    double** elemek;

    public:
    Matrix(unsigned int n, unsigned int m, double szam) : sorok(n), oszlopok(m){
    elemek = new double*[n];
    for(int i = 0; i < n; i++)
    {
    elemek[i] = new double[m];
    }
    for(int i = 0; i < n; i++)
    {
    for(int j = 0; j < m; j++)
    {
    elemek[i][j] = szam;
    }
    }
    }

    Matrix(unsigned int n, unsigned int m) : sorok(n), oszlopok(m){
    elemek = new double*[n];
    for(int i = 0; i < n; i++)
    {
    elemek[i] = new double[m];
    }
    for(int i = 0; i < n; i++)
    {
    for(int j = 0; j < m; j++)
    {
    cout << (i+1) << ". sor " << (j+1) << ". oszlop: ";
    double ertek;
    cin >> ertek;
    elemek[i][j] = ertek;
    }
    }
    cout << endl;
    }

    Matrix(Matrix &masik){
    sorok = masik.sorok;
    oszlopok = masik.oszlopok;
    elemek = new double*[masik.sorok];
    for(int i = 0; i < sorok; i++)
    {
    elemek[i] = new double[oszlopok];
    }
    for(int i = 0; i < sorok; i++)
    {
    for(int j = 0; j < oszlopok; j++)
    {
    elemek[i][j] = masik.elemek[i][j];
    }
    }
    }

    ~Matrix(){
    for(int i = 0; i < sorok; i++){
    delete[] elemek[i];
    }
    delete[] elemek;
    }

    unsigned int getSorok() const {return sorok;}

    unsigned int getOszlopok() const {return oszlopok;}

    double getElem(const unsigned int n, const unsigned int m) const {return elemek[n-1][m-1];}

    void setElem(const unsigned int n, const unsigned int m, const double szam){
    cout << "Mátrix(" << n << "x" << m << ") eleme: " << elemek[n-1][m-1] << endl;
    elemek[n-1][m-1] = szam;
    cout << "(" << n << "x" << m << ") új értéke: " << elemek[n-1][m-1] << endl;
    }

    void dispMatrix(){
    for(int i = 0; i < sorok; i++)
    {
    for(int j = 0; i < oszlopok; j++)
    {
    cout << left << setw(6) << elemek[i][j] << " ";
    }
    cout << endl;
    }
    }

    Matrix operator+(const Matrix &B){
    Matrix C(this->sorok, this->oszlopok, 0);
    if((this->sorok == B.sorok) && (this->oszlopok == B.oszlopok)){
    for(int i = 0; i < this->sorok; i++){
    for(int j = 0; j < this->oszlopok; j++){
    C.elemek[i][j] = this->elemek[i][j] + B.elemek[i][j];
    }
    }
    return C;
    }
    else{
    cout << "A mátrixokon a '+' művelet nincs értelmezeve!" << endl;
    return C;
    }
    }

    Matrix operator-(const Matrix &B){
    Matrix C(this->sorok, this->oszlopok, 0);
    if((this->sorok == B.sorok) && (this->oszlopok == B.oszlopok)){
    for(int i = 0; i < this->sorok; i++){
    for(int j = 0; j < this->oszlopok; j++){
    C.elemek[i][j] = this->elemek[i][j] - B.elemek[i][j];
    }
    }
    return C;
    }
    else{
    cout << "A mátrixokon a '-' művelet nincs értelmezeve!" << endl;
    return C;
    }
    }

    Matrix operator*(const Matrix &B){
    Matrix C(this->sorok, B.oszlopok, 0);
    if(this->oszlopok == B.sorok){
    for(int i = 0; i < this->sorok; i++){
    for(int j = 0; j < B.oszlopok; j++){
    int szum = 0;
    for(int k = 0; k < this->oszlopok; k++){ // lehetne akár k < B.getSorok() is, hiszen ez a feltétele a mátrixszorzásnak...
    szum += this->elemek[i][k] * B.elemek[k][j];
    }
    C.elemek[i][j] = szum;
    }
    }
    return C;
    }
    else{
    cout << "A mátrixokon a '*' művelet nincs értelmezeve!" << endl;
    return C;
    }
    }
    };

    int main(){
    //konstruktor kipróbálása
    Matrix A(3,3);
    Matrix B(3,3);

    //operator overloading kipróbálása
    Matrix C = A + B; //hibás elvileg...
    Matrix D = A * B; //hibás elvileg...
    Matrix E = A - B; //hibás elvileg...

    //dispMatrix(), getSorok(), getOszlopok()...
    cout << "C mátrix: A + B" << endl;
    C.dispMatrix();
    cout << "C mátrix dimenziója: " << C.getSorok() << "x" << C.getOszlopok() << "." << endl;

    cout << "D mátrix: A * B" << endl;
    D.dispMatrix();
    cout << "D mátrix dimenziója: " << D.getSorok() << "x" << D.getOszlopok() << "." << endl;

    cout << "E mátrix: A - B" << endl;
    E.dispMatrix();
    cout << "E mátrix dimenziója: " << E.getSorok() << "x" << E.getOszlopok() << "." << endl;

    //getElem(), setElem()...
    //válasszuk ki 'A' mártix egy tetszőleges elemét, és módosítsuk egy általunk választott értékre...
    int n, m;
    double v;
    cout << "'A' melyik elemét?" << endl;
    cout << "Oszlop: ";
    cin >> n;
    cout << "Sor: ";
    cin >> m;
    cout << "Erre az értékre: ";
    cin >> v;
    A.setElem(n, m, v);
    //kérjük le a módosított elem értékét még egyszer...
    cout << A.getElem(n, m) << endl;

    return 0;
    }

    Ezt kapom a g++ -tól:

    matrix2.cpp: In function ‘int main()’:
    matrix2.cpp:154:15: error: invalid initialization of non-const reference of type ‘Matrix&’ from an rvalue of type ‘Matrix’
    Matrix C = A + B;
    ^
    matrix2.cpp:46:3: note: initializing argument 1 of ‘Matrix::Matrix(Matrix&)’
    Matrix(Matrix &masik){
    ^
    matrix2.cpp:155:15: error: invalid initialization of non-const reference of type ‘Matrix&’ from an rvalue of type ‘Matrix’
    Matrix D = A * B;
    ^
    matrix2.cpp:46:3: note: initializing argument 1 of ‘Matrix::Matrix(Matrix&)’
    Matrix(Matrix &masik){
    ^
    matrix2.cpp:156:15: error: invalid initialization of non-const reference of type ‘Matrix&’ from an rvalue of type ‘Matrix’
    Matrix E = A - B;
    ^
    matrix2.cpp:46:3: note: initializing argument 1 of ‘Matrix::Matrix(Matrix&)’
    Matrix(Matrix &masik){
    ^

    Egyszerűen nem látom, hogy hol van a hiba a kódban, ami a fenti errort okozza... :W :(

    Előre is köszönöm a segítséget!

Új hozzászólás Aktív témák

Hirdetés