Zeiger auf Struktur->Element funktioniert nicht.
-
Hier die wichtigsten Codefragmente- Es geht darum, die Cursorposition aufzunehmen und auszugeben, aber eigentlich ist es eine Übung zu Strukturen:
#define STRICT #include <windows.h> struct OutputData{ POINT ptCursor; //Position des Mauscursors SIZE size; //Textgröße char szLbtMsg[128]; //Ausgabe linke Maustaste char szRbtMsg[128]; //Ausgabe rechte Maustaste char szMmvMsg[128]; //Ausgabe Mausposition bool ArrowKeys[4]; int x, y; int i; // Zähler }; //Weiter in der WndProc: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static struct OutputData OutData; OutData.i = 0;// Variante 1: Damit funktioniert das Prog einwandfrei. /* struct OutData *pOutData; pOutData->i = 0; // Variante 2 (*pOutData).i = 0; */ // Variante 3-- Hab ich auskommentiert, es produziert eine Fehlermeldung. switch (message) {...unwichtig.Die Fehlermeldung lautet: "i is not a member of OutData".
Versteh ich nicht, denn i ist in der struct OutData deklariert.
Unwichtig zu sagen, daß ich natürlich nur jeweils eine Variante benutze. Die Varianten mit dem Zeiger (2 und 3) ergeben beide die gleiche Fehlermeldung.
-
Hm schreibst du mir nem C++ Compiler ? Wenn ja, lass mal das 'struct' bei der Variablen-Definition weg.
-
Schade, daß gestern abend das Forum wieder down war, sonst hätte ich schon längst geantwortet. Danke für den Tip, werde ich probieren. Hab ja schon gemerkt, daß es bei C- und C++-Kompilern einige Unterschiede gibt.
-
Mit C vs. C++ hat das nichts zu tun. Der Strukturtyp heißt OutputData, nicht OutData.
-
Das spielt doch keine Rolle. Ich versuche, einen Zeiger auf die Instanz OutData einzurichten. Mit dem "struct" vorneweg hätte ich eine neue lokale Struktur mit dem Typ OutData ohne Membervariablen angelegt- oder sehe ich das falsch?. CodeFinders Antwort leuchtet mir da mehr ein.
Aber wenn's nicht funzt, werde ich Deinen Vorschlag natürlich auch ausprobieren.
-
Elektronix schrieb:
Das spielt doch keine Rolle. Ich versuche, einen Zeiger auf die Instanz OutData einzurichten.
Doch, spielt es - egal worauf dein Zeiger verweisen soll, der braucht immer noch den richtigen Typ. Was du machn willst, sieht so aus:
struct OutputData OutData; struct OutputData* pOut = &OutData;Mit dem "struct" vorneweg hätte ich eine neue lokale Struktur mit dem Typ OutData ohne Membervariablen angelegt- oder sehe ich das falsch?
Ja, das hast du richtig erkannt (wobei ein C++ Compiler dir wohl eher eine Fehlermeldung wegen Mehrfachdeklaration um die Ohren geschmissen hätte).
-
Ok
. Danke, wieder was dazugelernt. 
Allerdings: Die Zeile
struct OutData *pOutData;hatte ich auch schon ohne Auskommentierung da stehen, da hat der Kompiler gar nicht gemeckert. Und in einigen Tutorials werden öfters solche Zeiger deklariert. Deine Variante gibt es natürlich auch. Was gilt denn da nun? (Also, ich programmiere mit C++)
[Edit:] Ich glaube, in Punkto Zeiger hab ich da was mißverstanden. Werd mich da nochmal schlau machen. Danke für die Hilfe.
-
Elektronix schrieb:
Allerdings: Die Zeile
struct OutData *pOutData;hatte ich auch schon ohne Auskommentierung da stehen, da hat der Kompiler gar nicht gemeckert. Und in einigen Tutorials werden öfters solche Zeiger deklariert. Deine Variante gibt es natürlich auch.
Also nach meinem Wissen erzeugt diese Zeile einen neuen struct-Typ namens OutData und legt einen Pointer auf diesen Typ an. Da in C++ diese Kennung 'struct' optional ist, war ich der Meinung, daß der Name in Konflikt mit der Variablen OutData geraten könnte (anscheinend schafft dein Compiler es, das zu unterscheiden).
Auf jeden Fall hast du durch diese Zeile keine Verbindung zu deiner vorher angelegten Variablen hergestellt. Das geht nur, indem du deinen Pointer auf deren Adresse umbiegst (siehe oben).
-
Ok, dann ist diese Zeile
struct OutputData *pOutData;offenbar die Kurzform für dies:
struct OutputData OutData; struct OutputData* pOutData = &OutData;Stimmts oder nicht (bitte sag ja!)

-
Der Unterschied ist, dass bei der 2. Variante der Pointer auf einen gültigen Speicherbereich zeigt - was in Fall 1 nicht der Fall ist.
-
Elektronix schrieb:
Ok, dann ist diese Zeile
struct OutputData *pOutData;offenbar die Kurzform für dies:
struct OutputData OutData; struct OutputData* pOutData = &OutData;Stimmts oder nicht (bitte sag ja!)

Nein, ist es nicht - ersteres legt einen Pointer an, der irgendwohin zeigt (womit der gefüllt wird, kann dir niemand vorhersagen), das zweite eine Variable und einen Pointer, der auf diese Variable zeigt.
-
Ok, CStoll, danke für Deine Mühen. Ich glaube, bei aller Verwirrung bin ich wieder etwas schlauer.

-
So, es ist geschafft. CStolls Lösung hat funktioniert. Danke allen Helfern nochmal.
