Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Matrizen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
20.11.2008, 11:43 Uhr
KFC Embryo
Ein Huhn


Hallo,

ich habe folgendes Problem:

Ich kann nicht auf einen Public Member zugreifen um diesen zu übergebenm hier der Quellcode:

Die Main:

Code:

#include <iostream>
#include "matrix.h"

using namespace std;

int main(){
    
    Matrix M1;
    Matrix M2;

    M1.init();
    M2.init();

    cout << M1.matrix << endl;
    cout << M2.matrix << endl;
    M1.multiplikation(M1.matrix,M2.matrix); // <----- Funktioniert nicht
    
    return 0;
}



Hier die matrix.cpp

Code:

#include <iostream>
#include "matrix.h"


using namespace std;

Matrix::Matrix(){
    
    cout << "Bitte Anzahl der Zeilen angeben: ";
    cin >> zeilen;
    cout << endl;
    
    cout << "Bitte Anzahl der Spalten angeben: ";
    cin >> spalten;
    cout << endl;
    
    long c = spalten*zeilen;

    
    matrix = new long*[spalten*zeilen];
    
    for(int i=0; i<c; i++){
        matrix[i] = new long[spalten*zeilen];
    }

    matrix3 = new long*[spalten*zeilen];
    
    for(int i=0; i<c; i++){
        matrix3[i] = new long[spalten*zeilen];
    }
}


void Matrix::init(){

    int zaehler = 0;
    
    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            matrix[i][j] = zaehler++;
        }
    }

    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            cout << matrix[i][j];
        }
    cout << endl;
    }
    cout << endl;
}


void Matrix::multiplikation(long **matrix1, long **matrix2){
    
    
    for(int i=0; i < zeilen; i++){
        for(int j = 0; j < spalten; j++){
           matrix3[i][j] += matrix1[i][j] * matrix2[i][j];
        }
    }

    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            cout << matrix3[i][j];
        }
    cout << endl;
    }
    cout << endl;
}






Hier die matrix.h

Code:

#ifndef _Matrix_
#define _Matrix_

class Matrix{
    
    private:
        long zeilen;
        long spalten;
        long **matrix3;
    public:
        long **matrix;
        void multiplikation(long **, long**);
        void init();
        Matrix();
};

#endif




Ich habe den Member long **matrix absichtlich auf public stehen.
Werde den Zugriff später über eine Methode regeln.

Ich bekomme zwar eine Ausgabe allerdings nur "Gulasch".

Hoffe hier könnt mir weiter helfen.

Danke.
Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.11.2008, 12:54 Uhr
~wh00t
Gast


Die Matrizenmultiplikation ist mathematisch falsch...außerdem hast Du vergessen zu überprüfen, ob die Spaltenzahl der ersten Matrix gleich der Zeilenzahl der zweiten ist...sonst kannst Du nämlich keinen Martrizenmultiplikation machen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.11.2008, 13:11 Uhr
~wh00t
Gast


Hab's nicht überprüft...müßte aber so sein:

long zeilen1, spalten1; //für erste Matrix
long zeilen2, spalten2; //für zweite Matrix

.
.
.

if (spalten1 == zeilen2)
{
for (long i = 0; i < zeilen1; i++)
{
for (long j = 0; j < spalten2; j++)
{
matrix3[i][j] = 0;
for (long k = 0; k < spalten1; k++)
{
matrix3[i][j] += matrix1[i][k] * matrix2[k][j];
}
}
}
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.11.2008, 13:28 Uhr
KFC Embryo
Ein Huhn


Ja ich weiß.
Denke aber nicht das, dass mein Problem ist.
Die Implementierung der Matrizen Arithmetiken ist noch nicht fertig.

Vielleicht um das Problem etwas deutlicher zu machen:


Code:

cout << M1.matrix;



Matrix ist puplic und vom Typ **long.
Ausgeben könnte ich sie jetzt in dem ich sie in eine For-Schleife packe, denke ich ungefähr so:


Code:

for(int i=0; i<M1.zeilen; i++){
    for(int j=0;j<M1.spalten;j++){
         cout << M1.matrix[i][j]
     }
}



Aber wie kann ich matrix einer Funktion in der main übergeben?
z.B.:


Code:

MachWasMitEinerMatrize(M1.matrix)




Danke.
gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.11.2008, 22:30 Uhr
KFC Embryo
Ein Huhn


Weiß keiner weiter?
Oder soll ich noch irgend etwas genauer erklären?

Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.11.2008, 00:17 Uhr
Lensflare



Die Übergabe der Matrix an die Funktion ist eigentlich syntaktisch korrekt.
Hab den Code eben erfolgreich bei mir kompiliert.

Gibt es bei dir compilerfehler oder meinst du was anderes?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.11.2008, 09:24 Uhr
KFC Embryo
Ein Huhn


Nein compilerfehler gibt es bei mir auch nicht.
Ich bekomme nur merkwürdige Werte heraus:

Adressen glaube ich.
Wenn du das Programm startest siehst du es.

Muss ich da eventuell noch was dereferenzieren?

Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.11.2008, 10:56 Uhr
~wh00t
Gast


Natürlich bekommst Du bei cout << M1.matrix << endl; die Adresse....aber dann hättest Du entgegen Deiner Aussage schon vor der Multiplikation "Gulasch"?!?!?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.11.2008, 12:51 Uhr
~wh00t
Gast


Sorry...jetzt habe ich verstanden, was Deine Frage war:

matrix3[i][j] werden vor Deiner Rechnung nicht intialisiert mit 0! Da steht also beim Start irgendetwas drin!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.11.2008, 13:33 Uhr
KFC Embryo
Ein Huhn


Hi,

genau das war mein Problem. Schon ein wenig komisch dass die "Werte" aussahen wie Adressen.

Nun ja ich habe noch ein kleines Probleme. Ich versuche es einmal zu erläutern.
Um die Methoden in der main() aufrufen zu können ist es notwendig ein Objekt zu erstellen.

Objekt erstellen: Matrix M1
Methode aufrufen: M1.Methode

Ich hab jetzt das Problem, dass ich im Konstruktor die Größe der Matrize generiere bzw. den Speicherplatz dafür frei mache, dynamisch versteht sich.

Das möchte ich allerdings dahingehend ändern, dass der Speicherplatz immer erst bei dem Aufruf einer Methode freigegeben wird. Damit man die Größe bei jeder Option die man wählt neu generieren kann sonst könnte man ja immer nur mit einer bestimmt großen Matrize arbeiten, in allen 3 Fällen.

Allerdings fragt er mich nach der Anzahl der Zeilen und Spalten immer auch dann wenn ich den Konstruktor aufrufe, ist dort ja so vereinbart.
Das möchte ich nicht.

@whoo: Das bei einer Multiplikation die zu multiplizierende Matrizen nur gleich groß sind will ich damit sicher stellen das man genau die Größe einer Matrize eingibt diese aber 2mal initialisiert damit ist sicher gestellt das der Anwender gar nicht erst die Möglichkeit hat eine nicht berechenbare Matrize einzugeben.

So hier dann mal der Code:


Die matrix.h

Code:

#ifndef _Matrix_
#define _Matrix_

class Matrix{
    
    private:
        long zeilen;
        long spalten;
        long **matrix3;
        long **matrix;
    public:
        void transponieren();
        void skalar();
        void multiplikation();
        void init();
        Matrix();
        ~Matrix();
};

#endif






Die matrix.cpp

Code:
#include <iostream>
#include "matrix.h"


using namespace std;

Matrix::Matrix(){
    
    cout << "Bitte Anzahl der Zeilen angeben: ";
    cin >> zeilen;
    cout << endl;
    
    cout << "Bitte Anzahl der Spalten angeben: ";
    cin >> spalten;
    cout << endl;
    
    long c = spalten*zeilen;
    
    matrix = new long*[spalten*zeilen];
    
    for(int i=0; i<c; i++){
        matrix[i] = new long[spalten*zeilen];
    }

    matrix3 = new long*[spalten*zeilen];
    
    for(int i=0; i<c; i++){
        matrix3[i] = new long[spalten*zeilen];
    }

    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            matrix3[i][j] = 0;
    }
}
}



void Matrix::init(){

    int k;
    
    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            cout << "Bitte den Wert an der stelle " << i <<"." << j << " angeben: ";
            cin >> k;
            cout << endl;
            matrix[i][j] = k;
        }
    }

    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            cout << matrix[i][j];
        }
    cout << endl;
    }
    cout << endl;
}


void Matrix::multiplikation(){
    
    
    Matrix M1;
    Matrix M2;

    M1.init();
    M2.init();
    
    for(int i=0; i < zeilen; i++){
        for(int j = 0; j < spalten; j++){
            for (long k = 0; k < spalten; k++){
                matrix3[i][j] += M1.matrix[i][k] * M1.matrix[k][j];
            }
        }
    }

    cout << "Die Multiplikation 2er Matrizen: " << endl;
    
    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            cout << matrix3[i][j];
        }
    cout << endl;
    }
    cout << endl;

for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            matrix3[i][j] = 0;
    }
}
}



void Matrix::skalar(){

    long n;
    long c = spalten*zeilen;
    
    cout << "Bitte Anzahl der Zeilen angeben: ";
    cin >> zeilen;
    cout << endl;
    
    cout << "Bitte Anzahl der Spalten angeben: ";
    cin >> spalten;
    cout << endl;
    
    matrix = new long*[spalten*zeilen];
    
    for(int i=0; i<c; i++){
        matrix[i] = new long[spalten*zeilen];
    }
    
    
    init();
    
    cout << "Bitte den Skalar Wert angeben: ";
    cin >> n;
    cout << endl;
    
    
    for(int i=0; i < zeilen; i++){
        for(int j = 0; j < spalten; j++){
            matrix3[i][j] += matrix[i][j] * n;
            
        }
    }
    
    cout << "Die Multiplikation der Matrix mit einem Skalar: " << n << endl;
    
    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            cout << matrix3[i][j];
        }
    cout << endl;
    }
    cout << endl;

    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            matrix3[i][j] = 0;
    }
}
}

void Matrix::transponieren(){
    
    long c = spalten*zeilen;
    
    cout << "Bitte Anzahl der Zeilen angeben: ";
    cin >> zeilen;
    cout << endl;
    
    cout << "Bitte Anzahl der Spalten angeben: ";
    cin >> spalten;
    cout << endl;
    
    matrix = new long*[spalten*zeilen];
    
    for(int i=0; i<c; i++){
        matrix[i] = new long[spalten*zeilen];
    }
    
    init();

    for(int i=0; i < zeilen; i++){
        for(int j = 0; j < spalten; j++){
            matrix3[i][j] += matrix[i][j] * (-1);
            
        }
    }

    cout << "Die Matrix Transponieren: " << endl;
    
    for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            cout << matrix3[i][j];
        }
    cout << endl;
    }
    cout << endl;

for(int i=0; i<zeilen;i++){
        for(int j=0; j<spalten;j++){
            matrix3[i][j] = 0;
    }
}
}

Matrix::~Matrix(){

    delete []matrix;
    delete []matrix3;
}




Die main.cpp

Code:
#include <iostream>
#include "matrix.h"

using namespace std;

int main(){
    
    Matrix M1;
    
    int e=0;
    
start:
    cout << "Bitte wählen: " << endl;
    cout << "1. Matrizen Multiplikation " << endl;
    cout << "2. Matrix mit Skalar multiplizieren" << endl;
    cout << "3. Matrix Transponieren" << endl;
    cout << "4. Ende" << endl;
    cout << "Bitte Auswahl eingeben: ";
    cin >> e;
    cout << endl;
    
    if(e==1){
        M1.multiplikation();
        goto start;
    }else if(e==2){
        M1.skalar();
        goto start;
    }else if(e==3){
        M1.transponieren();
        goto start;
    }else if(e==4){
        cout << "Programm wird beendet...." << endl;
        goto END;
    }else{
        cout << "Falsche Eingabe" << endl;
    }
END:
    

    
    
    return 0;
}


Sorry für die Aufsätze die ich immer schreibe ;-)

Danke.
Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: