Frage zum Handling von Zeigern
-
Hallo zusammen, ich bin gerade dabei C++ zu lernen und bin momentan bei Zeigern etwas hilflos. Ich möchte mithilfe einer Funktion eine 2D Array Instanz einer Struktur manipulieren (mithilfe von Zeigern). In einer Dimension klappt das! Ich bin mir auch nicht sicher ob man bei mehreren Dimensionen die Adresse mit allen 0 Indizes dem Zeiger übergibt. Was mache ich falsch?
struct Field { bool besetzt; }; void SetField(Field *pPlayfield) { pPlayfield[0][0].besetzt = true; } int main() { Field Playfield[5][5]; SetField(&Playfield[0][0]); }Dazu die Fehlermeldung:
------ Erstellen gestartet: Projekt: fds, Konfiguration: Debug Win32 ------ Kompilieren... fds.cpp .\fds.cpp(15) : error C2676: Binärer Operator '[': 'Field' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht .\fds.cpp(15) : error C2228: Links von ".besetzt" muss sich eine Klasse/Struktur/Union befinden. Das Buildprotokoll wurde unter "file://d:\Schule und Informatik\Programmierung\C++Projekte08\fds\Debug\BuildLog.htm" gespeichert. fds - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Ich hoffe ihr könnt mir auf die Sprünge helfen

MFG > Thomjay
-
damit würde deine fkt so aussehen:
void SetField(Field *pPlayfield) { (**pPlayfield).besetzt = true; }und uns fällt auf, dass einmal zu oft dereferenziert wird:
void SetField(Field** playfield) { playfield[0][0].x = 0; }Der Aufruf würde natürlich auch entsprechend anders aussehen:
int main() { Field gamefield[42][23]; SetField(&&gamefild[0][0]); }oder (in meinen augen hübscher - weil
&&**gamefielddoch sinnlos erscheint):int main() { Field gamefield[42][23]; SetField(gamefild); }wieso ein array immer als pointer übergeben wird, kannst du nachgucken, wenn du nach "array to pointer decay" oder so googelst.
die ungarische notation ist übrigens in c++-kreisen relativ verpöhnt...
bb
-
Mein Tutorial ist sehr kurzgefasst, so etwas wurde nichtmals angeschnitten. Aber danke es funktioniert und ich werde nach ausführlicheren Informationen suchen.
-
Hey Thomjay.
Für mich sieht die Zeile
pPlayfield[0][0].besetzt = true;ein wenig komisch aus.
Du hast als Parameter schon die Adresse des Elementes übergeben, daher ist das [0][0] aus meiner Sicht unnötig und falsch. Außerdem übergibst du nur einen Zeiger, den du vor der Verwendung erst dereferenzieren musst. Also -> anstatt . oder ein *.