Zugriff auf Arrays



  • Ich bin absoluter Neuling und versuche das Spiel Snake nachzuvollziehen.

    Als erstes baue ich im Konstruktor ein Array das je nach Eingabegrößen die feldanzahl festlegt:

    (...)
    FELDELEMENT* m_pSpielfeld = new FELDELEMENT[m_iBreitem_iHoehe];
    for(i=0; i<(n_iBreite
    n_iHoehe); i++)
    {
    m_pSpielfeld[i]=LEER;
    }

    in einer Methode möchte ich dann die art eines bestimmten Feldes auslesen (LEER,SCHLANGE, MAUS oder FEHLER)

    dafür:
    FELDELEMENT CSpielfeld::getFeld(int n_iX, int n_iY)
    {
    if((n_iX<=m_iBreite)&&(n_iY<=m_iHoehe))
    return m_pSpielfeld[m_iBreite*n_iY+n_iX]; //!!!
    else
    return FEHLER;
    }

    Wundersamerweise klappt es nicht, der debugger meldet an markierter stelle:
    Unbehandelte Ausnahme bei 0x0041499a in CSpielfeld.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000000.

    kann jemand mir weiterhelfen?



  • FELDELEMENT* m_pSpielfeld = new FELDELEMENT[m_iBreite*m_iHoehe];
    

    Da ich davon ausgehe, dass m_pSpielfeld eigentlich eine Membervariable ist, liegt wohl da der Fehler. Du weist einem lokalen Pointer das neu erzeugte Array zu, eigentlich sollte wohl die Membervariable die Adresse erhalten.

    Übrigens, Code-Tags helfen dabei, das ganze lesbar zu halten.



  • Ja, es soll eine Membervariable sein, zumindest habe ich sie als solche in der headerdatei deklariert.
    Warum erhält sie nicht die Adresse?
    anders gefragt: wie mache ich es korrekt?



  • du legst ein Feld an von der Grösse m_iBreite*m_iHoehe.
    D.h. von 0 bis

    m_iBreite*m_iHoehe-1
    

    in den Ausdrücken in der if-Abfrage musst du daher schreiben:

    if((n_iX < m_iBreite)&&(n_iY < m_iHoehe))
    

    und nicht <= , da du sonst über die Feldgrenzen hinausschießen könntest



  • und damit ich auch die Adresse der Membervariable erreiche schreibe ich:
    [cpp]
    m_pSpielfeld = new FELDELEMENT[m_iBreite*m_iHoehe];

    Korrekt?



  • milian84 schrieb:

    und damit ich auch die Adresse der Membervariable erreiche schreibe ich:

    m_pSpielfeld = new FELDELEMENT[m_iBreite*m_iHoehe];
    

    Korrekt?

    Korrekt.



  • danke für die schnellen und hilfreichen antworten.

    ich habe nun ein weiteres problem:

    wie übergebe ich die adresse von m_pSpielfeld an eine andere klasse und zwar mittels des konstruktor, also über main()?



  • milian84 schrieb:

    danke für die schnellen und hilfreichen antworten.

    ich habe nun ein weiteres problem:

    wie übergebe ich die adresse von m_pSpielfeld an eine andere klasse und zwar mittels des konstruktor, also über main()?

    Du übergibst das Element einer Funktion mit func(m_pSpielfeld).
    Funktionen kannst du eigentlich überall aufrufen, aber main() kann kein Konstruktur einer Klasse sein...



  • sorry, hatte mich nicht genau ausgedrückt.
    Ich rufe in main() einen konstruktor auf, der einen Zeiger übergeben soll. Dieser Zeiger soll eben auf das aktuelle Spielfeld, also m_pSpielfeld. Wie bekomme ich jetzt aus der Klasse CSpielfeld raus, wo m_pSpielfeld steht?



  • konkret:

    Ich habe eine Klasse A in der ich über eine Membervariabele m_pZeiger ein Array definiert habe. Dies habe mit einem neuen Datentypen gefüllt.
    Ich habe eine weitere Klasse B definiert in der ich einzelne Daten des Array aus Klasse A ändern möchte. Dazu möchte ich mit dem Konstruktor für Klasse B einen Zeiger auf die Klasse A und damit auf den Anfang des Arrays übergeben.
    Wie stelle ich das an?



  • Bei "guter" objektorientierter Programmierung sollte eigentlich keine Klasse B die Memberdaten von Klasse A ändern dürfen!

    Aber mir fallen konkret 2 Möglichkeiten ein:
    - Du übergibst der Klasse B einen Pointer auf die Klasse A. Klasse B ruft Memberfunktionen der Klasse A auf, welche die Daten verändert.
    - Du baust die Funktionalität der Klasse B (k.A. wie komplex die ist und ob das sinnvoll ist) in Memberfunktionen der Klasse A ein, da die Klasse B ja Daten der Klasse A verändern soll...



  • ich will möglichkeit 1 machen.
    die klasse die verändert werden soll heißt zb CSpielfeld. Mit CMaus möchte ich das verändern. Jetzt habe ich in main den konstruktor so geschrieben:
    CMaus NeueMaus(CSpielfeld* n_pSpielfeld)
    ich komme aber einfach nicht drauf welchen Wert ich für CSpielfeld* (...) übergeben soll. Es muss ja ein Zeiger auf den Anfang des Arrays aus CSpielfeld sein. Also muss es ja die Adresse vom ersten Element sein, oder?
    Und wie krieg ich die aus CSpielfeld raus?



  • nein du willst nicht das array sondern die klasse übergeben.
    außerdem würde ich eine referenz statt einem zeiger nehmen, das ist einfacher.

    mfg.



  • Wie asdasdasd (^^) schon sagt, du übergibst einen Verweis (egal ob Referenz oder Zeiger) auf die Klasse an CMaus. CMaus kann jetzt mit der Klasse CSpielfeld interagieren, allerdings sollte das wirklich nur über Member-Funktionen passieren.
    Du könntest in deine CSpielfeld-Klasse doch ne Funktion SetField( x, y, Wert ) einbauen. Darin prüfst du dann x und y auf die Grenzwerte vom Spielfeld und Wert auf Validität.
    Dann kannst du bequem und sicher mit der CMaus-Klasse das Spielfeld modifizieren.


Anmelden zum Antworten