Forum: PC-Programmierung C/CPP void* in array speichern


von Marvin K. (m_marvin)


Angehängte Dateien:

Lesenswert?

Ich versuche eine dll für den COM Port zugriff zu schreiben.
Die funktion CreateFile() öffnet den COM Port und gibt eine HANDLE 
zurück.
HANDLE ist definiert als void*.
Meine Frage ist, wie speichere ich den void* in einem Array, so das ich 
mehrere geöffnete Ports besser organisieren kann (sie mit einer id (int 
wert) aufrufen kann).

Ich habe bisher folgendes versucht.
Für die Initialisierung des Arrays:
1
static void* openPorts[25] = { 0 };
2
static HANDLE openPorts[25] = { 0 };
3
static HANDLE* openPorts[25] = { 0 };
Zum speichern eines HANDELs hab ich versucht:
1
openPorts[i] = CreateFile(...);
2
openPorts[i] = (void*) CreateFile(...);
3
openPorts[i] = (HANDLE*) CreateFile(...);
4
openPorts[i] = &CreateFile(...);

Ich weis sehr wohl das einige dieser Versuche absolut keinen sinn 
machen, aber mir sind irgendwann die Ideen ausgegangen ...

Kann mir jemand sagen, wie ich diese HANDLEs/void* in einem Array 
speichern kann (Egal ob als Pointer, oder als das reale struct hinter 
dem Pointer).

Der Fehler der kommt (wenn es nicht schon einen erwartbaren 
compile-error gab) ist auf dem angehängten Bild zu sehen.
Ich verstehe das so, das er den Inhalt des structs zu dem der pointer 
zeigt schreiben will, und das Array dafür zu klein ist weil es nur für 
den Pointer ausgelegt ist.
Wobei ich nur vermute das das ein struct ist zu dem der pointer zeigt, 
weil die restlichen Befehle alle mit structs als input arbeiten
Aber es ist nirgends definiert was ein HANDLE wirklich ist.

Ich hab noch nicht so viel Erfahrung mit C, bisher hab ich damit 
hauptsächlich Microcontroller programmiert wo ich eher selten mit 
structs und void* arbeite.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Manchmal ist die offensichtliche Lösung die richtige:
1
static HANDLE openPorts[25];
2
3
openPorts[i] = CreateFile(...);

Du musst natürlich sicher stellen dass i echt kleiner als 25 ist!

Ob HANDLE als void* oder was auch immer definiert ist, ist egal. Einfach 
immer HANDLE verwenden. Mit structs hat das ganze übrigens nichts zu 
tun, hier ist nirgendwo einer. Ob HANDLE überhaupt eine Adresse enthält 
oder irgendwelche anderen Zahlen kann dir völlig egal sein, damit 
hantiert der Windows Kernel intern herum.

von Marvin K. (m_marvin)


Angehängte Dateien:

Lesenswert?

Das war mein erster versuch, aber es ergibt die Fehlermeldung von oben, 
und i ist immer kleiner als 25 da vorher
1
if (i >= 25) return 0;
 geprüft wird.
Wenn ich das Programm trotzdem ausführen kommt es sobald die 
entsprechende Funktion aufgerufen wird zu diesem Fehler.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Marvin K. schrieb:
> Wenn ich das Programm trotzdem ausführen kommt es sobald die
> entsprechende Funktion aufgerufen wird zu diesem Fehler.

Dann ist da noch ein anderer Fehler. Lasse es im Debugger laufen und 
schau dir an wo es knallt, gehe Step-by-Step durch etc.

von Marvin K. (m_marvin)


Lesenswert?

Ich versuche aktuell das HANDLE in poition 3 zu speichern, also weite 
unter 25 ...

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Welche ist denn die Zeile 277?

von DerEinzigeBernd (Gast)


Lesenswert?

Die einzige sinnvolle Variante ist die hier:
1
static HANDLE openPorts[25] = { 0 };
2
3
openPorts[i] = CreateFile(...);

Die Initialisierung des Arrays mit { 0 } kannst Du auch weglassen, das 
erfolgt bei statischen Variablen implizit.

i darf bei der Zuweisung nicht kleiner als 0 und nicht größer als 24 
sein.

Wenn Du trotzdem irgendeine Fehlermeldung bekommst -- zeig' Deinen Code.

von Nop (Gast)


Lesenswert?

DerEinzigeBernd schrieb:

> Ich habe bisher folgendes versucht.
> openPorts[i] = (void*) CreateFile(...);
> openPorts[i] = (HANDLE*) CreateFile(...);
> openPorts[i] = &CreateFile(...);

Nein, das hast Du nicht versucht. Du schreibst nach claimedPorts, nicht 
nach openPorts, und auch nicht mit i als Index, sondern mit comPorts. 
Siehe erster Screenshot.

Zeig einfach Deinen Code, und zwar den ganzen Code. Ausschnitte reichen 
nicht, denn wenn Dir schon klar wäre, welcher der wesentliche ist, dann 
hättest Du das Problem ja schon selber gelöst.

von Marvin K. (m_marvin)


Lesenswert?

Hab den Fehler gefunden, es funktioniert jetzt.
Es war eine Befehlszeile direkt über dem CreateFile Aufruf.
Da ich die kompilierte dll nicht debuggen konnte sah es so aus als ob es 
von dem Array kam.

von Marvin K. (m_marvin)


Lesenswert?

Nop schrieb:
> Nein, das hast Du nicht versucht. Du schreibst nach claimedPorts, nicht
> nach openPorts, und auch nicht mit i als Index, sondern mit comPorts.
> Siehe erster Screenshot.
>
> Zeig einfach Deinen Code, und zwar den ganzen Code. Ausschnitte reichen
> nicht, denn wenn Dir schon klar wäre, welcher der wesentliche ist, dann
> hättest Du das Problem ja schon selber gelöst.

Ich habe diesen Thread eröffnet um eine einfache Frage zu Arrays 
beantworten zu lassen, da reicht es ja den Code vom Array zu zeigen ...
Jetzt wo ich weis das es nicht von dem Array kommt, hab ich nochmal 
gesucht und den Fehler an einer anderen stelle gefunden.

von Marvin K. (m_marvin)


Lesenswert?

Niklas G. schrieb:
> Welche ist denn die Zeile 277?

Das frage ich mich auch, mein Code hat nur 158 ...
Ich bin davon ausgegangen das das irgend eine interner Code vom Debugger 
oder irgend einer api ist.

Aber ich habe das Problem jetzt durch aus kommentieren von Codeblöcken 
lösen können, es war ein einfacher Fehler wo ich versehentlich ein 
wchar_t string in einen char string schreiben wollte.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.