[C] Struct übergabe mit LPVOID - pointer

posi90

Erfahrenes Mitglied
Hallo,

Ich schreibe gerade an einem multithreading Programm in C++/WinApi und schaff es nicht mehrere Daten bzw. eine Struktur über einen LPVOID-Pointer zu übergeben.

Hier habe ich mein Problem etwas vereinfacht:

main.cpp:
Code:
void up1(LPVOID);								//Prototyp für Unterprogramm

struct struktur									//Struktur mit meinen Daten
{
	int val0;
	int val1;
};


void main()
{
	struct struktur a;

	LPVOID * global_pointer;					//LPVOID - Pointer
	global_pointer=(LPVOID*)&a;

	a.val0=-1;									//Struktur mit Werten befüllen
	a.val1=-2;

	printf("main: %d %d\n",a.val0,a.val1);		//Ausgabe: -1 -2 (soll auch in up1 ausgegeben werden!)
	up1(*global_pointer);

	getchar();
}

thread.cpp
Code:
void up1(LPVOID);

void up1(LPVOID data)
{
	printf("Thread: %d",data);				//gibt den Wert -1 aus (wie komm ich auf val1 der Struktur?)
}

Kann mir hier jemand helfen?

mfg. Poseidon
 
Hi

1) Im main ist der Aufruf von up1 falsch.
Der * muss weg, sonst ist es ja kein Pointer :)

2) Es erscheint bei dem Miniprogramm vielleicht übertrieben, aber bei mehreren Quellcodedateien solltest du dir angewöhnen, Includes zu verwenden.
Das ist auch der sinnvollste Weg, zu val1 zu kommen.

3a) Solange du 1 beachtet hast, müsstest du so an val0 und val1 kommen:
C++:
int *asd=(int *)data;
printf("val0:%d\n",data[0]);
printf("val1:%d\n",data[1]);
Das ist aber alles andere als schön bzw. sicher programmiert.
Damit ekommst du mehr Probleme, als du löst, vor allem bei größeren Projekten.

3b) würde ich das so machen:

thread.h
C++:
#ifndef myinc_thread
#define myinc_thread

void up1(LPVOID);

#endif

struktur.h
C++:
#ifndef myinc_struktur
#define myinc_struktur


struct struktur                                 //Struktur mit meinen Daten
{
    int val0;
    int val1;
};

#endif

Und jetzt in den cpp-Dateien beide Dateien includen, statt up1 bzw. die Strukt jedes Mal neu reinschreiben.

Dann kannst du auch den LPVOID-Pointer in up1 so
struktur *s=(struktur *)data;
casten und so auf val0 und val1 zugreifen:
(*s).val0
(*s).val1
bzw.
s->val0
s->val1

PS: Warum redest du eigentlich von Thread? Der fehlt irgendwie
 
Danke für die ausführliche Antwort =)

Zu PS: Dies ist nur ein Mini-Programm, wollte nicht Seiten von Quellcode hier posten.

mfg. Poseidon
 
Zurück