Umgang mit 'vector' in 3D



  • Guten Morgen, ihr Cracks! 🙂

    Ich hab ein Problem, dass ich trotz intensiven Recherchierens und Rumprobierens nicht lösen konnte. 😞

    Ich hätte gern eine 3-dimensionale Matrix, die mit 'vector' aufgebaut wird.
    Diese Matrix soll aus Zellen bestehen, in denen verschiedene Werte abgespeichert werden und über verschiedene Methoden manipuliert werden können.

    Was ich bis jetzt habe:
    So hab ich die Zellen der Matrix definiert.
    zelle.h

    #ifndef ZELLE_H
    #define ZELLE_H
    
    class zelle {
    public:
        zelle();
        void setze_varA(double temp);
        void setze_varB(int temp);
        void setze_varC(double temp);
    
        double bekomme_varA();
        int bekomme_varB();
        double bekomme_varC();
        ~zelle();
    private:
        double varA;
        int varB;
        double varC;
    
    };
    
    #endif  // ZELLE_H
    

    zelle.cpp

    #include "zelle.h"
    
    zelle::zelle()
    
    void zelle::setze_varA(double temp)
    {
    varA = temp;
    }
    
    void zelle::setze_varB(int temp)
    {
    varB = temp;
    }
    
    void zelle::setze_varC(double temp)
    {
    varC = temp;
    }
    
    double zelle::bekomme_varA()
    {
    return varA;
    }
    
    int zelle::bekomme_varB()
    {
    return varB;
    }
    
    double zelle::bekomme_varC()
    {
    return varC;
    }
    
    zelle::~zelle()
    {
    }
    

    Das Gitter sieht bei mir folgendermaßen aus:
    gitter.h

    #ifndef GITTER_H
    #define GITTER_H
    
    #include <vector>
    #include "zelle.h"
    
    using namespace std;
    
    class gitter {
    public:
        gitter();
        gitter(int i, int j, int k);
        void initialisiere(int i, int j, int k);
    
        void set_var(double wert1, int wert2, double wert3);
    
        void ausgeben();
    
        ~gitter();
    private:
        int imax,jmax,kmax;
    
    // Deklariere 3D Matrix
        vector< vector< vector<zelle> > > matrix;
    
    };
    
    #endif
    

    gitter.cpp

    #include "gitter.h"
    #include "zelle.h"
    
    #include <cmath>
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    gitter::gitter()
    {
    }
    
    gitter::gitter(int i, int j, int k)
    {
      initialisiere(i,j,k);
    }
    
    void gitter::initialisiere(int i, int j, int k)
    {
      imax = i;
      jmax = j;
      kmax = k;
    // Initialisiere 3D Matrix
      matrix.assign(i, vector< vector<zelle> >(j,vector<zelle>(k))); //DANKE an Fellhuhn
    }
    
    void gitter::set_var(double wert1, int wert2, double wert3)
    {
      for(int k=0;k<kmax;k++)
        {
      for(int j=0;j<jmax;j++)
        {
      for(int i=0;i<imax;i++)
            {
            matrix[i][j][k].setze_varA(wert1);
            matrix[i][j][k].setze_varB(wert2);
            matrix[i][j][k].setze_varC(wert3);
            }
        }
      }
    }
    
    void gitter::ausgeben()
    {
      for(int k=0;k<kmax;k++)
        {
      for(int j=0;j<jmax;j++)
        {
      for(int i=0;i<imax;i++)
            {
    
             cout << matrix[i][j][k].bekomme_varA() << "|" << matrix[i][j][k].bekomme_varB() << "|" << matrix[i][j][k].bekomme_varC() << "\t" ;
            }
         cout << endl;   
        }
        cout << endl;
        cout << endl;
      }
    }
    
    gitter::~gitter()
    {
    }
    

    und meine 'main' ist angelegt als:
    matrix.cpp

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include "gitter.h"
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    gitter dummy;
    int a,b,c,e;
    double d,f;
    
      cout << "Erste Dimension: ";
      cin >> a;
      cout << "Zweite Dimension: ";
      cin >> b;
      cout << "Dritte Dimension: ";
      cin >> c;
      cout  << endl;
    
      cout << "Wähle varA(double): ";
      cin >> d;
      cout << "Wähle varB(int): ";
      cin >> e;
      cout << "Wähle varC(double): ";
      cin >> f;
      cout  << endl;
    
    dummy.initialisiere(a,b,c);
    dummy.set_var(d,e,f);
    dummy.ausgeben();
    
      return EXIT_SUCCESS;
    }
    

    Wo habe ich denn da denn Denkfehler?

    Was mich auch noch beschäftigt ist:
    Wie sieht die Implementierung aus, wenn die Werte in den Zellen Zeiger sind?
    Geht das so einfach mit vector oder gibts da Probleme?!

    ⚠ Vielen Dank schonmal für Eure Hilfe!!!!

    💡 EDIT: Fehler beseitigt! Läuft jetzt (auch ohne Beine)! 😃



  • Und was ist dein Problem? Zu hohe Steuern? Leihfrist deiner Bücher überzogen? Tomaten vergessen?



  • 1, es läuft nicht!
    und
    2, ich weiß nicht, ob das so richtig ist (da es ja nicht läuft...) oder ob der generelle gedankengang richtig ist und nur was anderes faul ist, was ich nicht gefunden hab.

    das ist mein Problem...



  • "läuft nicht". Beine ran und anschupsen.

    Nein, mal im ernst, was ist die Ausgabe des Compilers? Wirft der überhaupt Fehler?
    Oder macht das Programm nicht was du willst? Was willst du, was macht es? An welcher Stelle tritt der Fehler auf?

    Das wäre schon hilfreich...



  • also der grund warum es "nicht läuft" ist, dass es keine beine hat 😉

    jetzt spaß beiseite: es kompiliert nicht vollständig.

    gcc schmeißt mir folgende fehlermeldung aus:

    /.../matrix/src/gitter.cpp:25: instantiated from here
    /usr/include/c++/4.1.0/bits/stl_construct.h:81: error: no matching function for call to 'zelle::zelle(const int&)'
    /.../matrix/src/zelle.h:6: note: candidates are: zelle::zelle()
    /.../matrix/src/zelle.h:4: note: zelle::zelle(const zelle&)
    make: *** [/.../matrix/src/gitter.o] Error 1



  • Mit dieser Zeile:
    matrix.assign(i, vector< vector<zelle> >(j,vector<zelle>(k,0)));

    füllst du den Vektor mit Zellen deren Konstruktor eine 0 übergeben wird. Da es aber keinen Konstruktor gibt, der einen int als Parameter übernimmt, geht das nicht.

    Mach folgendes draus:

    matrix.assign(i, vector< vector<zelle> >(j,vector<zelle>(k)));



  • Nimm statt std::vector mal std::valarray, ist für solche Zwecke gemacht.

    MfG Kimmmi



  • matrix.assign(i, vector< vector<zelle> >(j,vector<zelle>(k)));

    ah super, damit gehts! DANKE!
    ich hatte statt der '0' auch mal ne andere integer-zahl probiert, aber damit gings auch net.

    jetzt gehe ich mal die sache an, wenn varA, varB und varC Zeiger sind.



  • kimmi schrieb:

    Nimm statt std::vector mal std::valarray, ist für solche Zwecke gemacht.

    MfG Kimmmi

    😮
    Also ich bin hier ja schon eine zeitlang unterwegs und habe auch schon ein paar Bücher zum Thema gelesen, aber das ist mir noch nie untergekommen .... unglaublich, was man alles NICHT weiß. Ich kann meine Signatur wohl noch lange behalten... 😉

    Danke für den Tipp,

    Simon2.



  • kimmi schrieb:

    Nimm statt std::vector mal std::valarray, ist für solche Zwecke gemacht.

    Das ist richtig. Hier bei Apache ist es relativ gut erklärt (im Vergleich zu anderen Stellen).

    Das was cfd.lfa sucht/braucht, ist wahrscheinlich ein valarray in Verbindung mit einem gslice - siehe Kapitel "22.4.2.2 The gslice Operation" hinter obigen Link.

    Dieses valarray ist irgendwie eine 'vergessene Bibliothek'. Ich meine das benutzt kein Mensch - oder weiß jemand von einer konkreten Anwendung?

    Gruß
    Werner


Anmelden zum Antworten