Problem mit Array in Konstruktor



  • Hi,

    ich habe eine Programmieraufgabe bekommen, die mit Automaten zu tun hat. Man gibt eine Zeile ein, die 3 Zahlen enthält. Sind diese ungleich 0 0 0, so wird ein neues Objekt vom Typ Automat angelegt, welches diese 3 Zahlen enthält, und dann noch ein einfaches, und ein 2dimesionales Array. In dieses will ich nun Werte einfügen, und genau daran scheitere ich. Hier mein Code soweit:

    Main.cpp:

    #include <ctime>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include "Automat.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {   
        char buffy[100];
        cin.get (buffy,80);
    
        int  k=0, m=0, n=0;
        sscanf(buffy," %d %d %d ", &k, &m, &n);
    
        Automat *automat = new Automat(k,m,n);
    
        automat->insertQa(automat, 1, 0);
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Automat.h:

    #ifndef _AUTOMAT_H
    #define _AUTOMAT_H
    
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    class Automat 
    {    
    public:
                 Automat(const int k1, const int m1, const int n1);
    
                 void Automat::insertQa(Automat *automat, int QaZeile, int Qa);
    
    /*
    private:  int k,m,n;
              int Qa[m];
              int Delta[n][2];
    */
    };
    
    #endif
    

    Automat.cpp:

    #include <iostream>
    #include <vector>
    
    #include "Automat.h"
    
    using namespace std;
    
    Automat::Automat(const int k1, const int m1, const int n1) {
        int k=k1;
        int m=m1;
        int n=n1;                                                 
        int Qa[m];
        int Delta[n][2];
    };
    
    void Automat::insertQa(Automat *automat, int QaZeile, int QaEintrag) {
         automat->Qa[QaZeile]=QaEintrag;
    };
    

    Wenn die Eingabe fertig ist (es fehlen noch die Eingabeaufforderungen), geht es wieder von vorne los, bis irgendwann die erste Zeile 0 0 0 lautet. Es können also mehrere Objekte vom Typ Automat erzeugt werden.
    Aber wie kann ich nun etwas in die Array einfügen? Mein Compiler sagt mir immer:

    17 Automat.cpp 'class Automat' has no member named 'Qa'

    Wie muss das in der Automat.h im privat Bereich aussehen, damit er das kennt, und ich dann endlich Zugriff auf die Elemente habe? Ist das überhaupt soweit richtig?

    Bitte helft mir, ich komme einfach nicht weiter, und ich habe nicht mehr allzuviel Zeit für das Projekt!

    Vielen Dank im Voraus!!!!!

    MfG, Ozzy



  • Ähm warum hast Du das auskommentiert ? *sich-wunder*



  • Hi,

    weil mir dann der Compiler immer einen Fehler gibt:

    28 Automat.h invalid use of non-static data member Automat::m' 29 Automat.h from this location 28 Automat.h invalid use of non-static data memberAutomat::n'
    30 Automat.h from this location
    Automat.cpp In member function `void Automat::insertQa(Automat*, int, int)':

    Er meint damit das m und das n, was in den beiden Array's vorkommt. Wie bekomme ich das denn in den Griff?

    MfG, Ozzy



  • Die lokalen Variablen, die du im Konstruktor anlegst, verdecken deine Member. Ist vermutlich nicht beabsichtig.

    Und warum bekommt deine insertQa-Methode einen Zeiger auf Automat mit? Wäre es nicht sinnvoller, wenn sie das, was sie tut, mit dem Objekt tun würde, zu dem sie gehört?



  • Ozzy schrieb:

    Aber wie kann ich nun etwas in die Array einfügen? Mein Compiler sagt mir immer:
    [...]

    Hm. Ich frage mich grad ob das ein Fortschritt oder Rückschritt gegenüber den Leuten die keine Fehlermeldungen liefern ist.

    // Automat.hpp
    
    class Automat
    {
      //...
      std::vector<int>  Qa;
      std::vector<std::vector<int> >  Delta;
    };
    
    // Automat.cpp
    
    using std::vector;
    
    Automat::Automat(const int k1, const int m1, const int n1)
      : k(k1)
      , m(m1)
      , n(n1)
      , Qa(m1)
      , Delta(n1, vector<int>(2))
    {
    /* Das sind lokale Variablen, nicht deine Member!
        int k=k1;
        int m=m1;
        int n=n1;                                                
        int Qa[m];
        int Delta[n][2];
    */
    };
    


  • Die Anzahl der Array-Elemente muss ein konstanter Ausdruck sein.
    Für eine dynamische Speicherverwaltung benutze lieber vektoren oder halt Pointer auf Arrays.



  • Also kein Array sondern lieber Verktoren; sehe ich das richtig?
    Schade, dabei wäre es mit Array's so schön gewesen...

    Noch eine Frage: wie schreibe ich denn in einen Vektor in einem Vektor? So etwas habe ich noch nie gemacht...

    MfG, Ozzy



  • Hallo

    std::vector<std::vector<int> > myarray; // Leerzeichen zwischen den > > beachten!
    myarray.push_back(std::vector<int>());
    

    bis bald
    akari



  • Dann muss ich mir also einen "Hilfsvektor" bauen, den vollmachen, und dann den ganzen Vektor in den "äußeren" Vektor schieben?

    MfG, Ozzy



  • typedef std::vector<int> Int1D;
    typedef std::vector<Int1D> Int2D;
    
    Int2D nullmatrix(10, Int1D(10,0));
    
    // bzw.
    
    for (int i = 0; i < nullmatrix.size(); i++) {
        for (int j = 0; j < nullmatrix[i].size(); j++)
            nullmatrix[i][j] = 1;
    }
    


  • Automat::Automat(const int k1, const int m1, const int n1)
      : k(k1)
      , m(m1)
      , n(n1)
      , Qa(m1)
      , Delta(n1, vector<int>(2)) // <--- erstellt ein n1*2 Array
    {
    };
    


  • Hi,

    kann mir jemand von Euch sagen, warum das (anscheinend) nicht funktioniert:

    void Automat::Automat::insertDelta(Automat *automat, vector<int> Zustand) {
         automat->Delta.push_back(Zustand);
    };
    

    Zumindest hatte ich probiert, mit:

    void Automat::ausgeben(Automat *automat) {
         cout << automat->Delta[0][0] << " " << automat->Delta[0][1] << " " << automat->Delta[0][2] << endl << endl;
    };
    

    mir etwas ausgeben zu lassen, aber ich bekomme immer nur 0 0 0 raus. Der Vector Zustand wir der insertDelta aber richtig übergeben, das hatte ich schon ausprobiert.

    MfG, Ozzy



  • Kannst du sagen, warum du innerhalb von Automat offenbar noch einen Typ Automat hast? Und warum offenbar alle deine Memberfunktionen auf dem übergebenen Automat-Zeiger arbeiten statt auf this?



  • Nein, das kann ich Dir leider nicht sagen 😉

    Aber ist das eine Erklärung für die Frage?
    MfG, Ozzy



  • Wie sieht denn dein tatsächlicher Code jetzt aus? Und warum weißt du nicht was du machst?



  • Hi,

    Scherz beiseite, ich hatte einfach nicht dran gedacht. Nun habe ich this-> statt automat-> genommen, aber das löst nicht mein Problem. Hast Du vielleicht noch eine Idee?

    MfG, Ozzy



  • Hi,

    ich habe es jetzt selbst herausgefunden; ich dachte, ich müsse ein push_back auf dem Vektor ausführen, deshalb wurden meine Elemente immer nur hinten dran gehängt, und somit kam natürlich bei der Abfrage der ersten Elemente immer nur 0 0 0 raus.
    Mit der Zuweisung aber funktioniert es jetzt.

    Trotzdem vielen Dank, Ozzy


Anmelden zum Antworten