bool an c dll übergeben
bool an c dll übergeben
Hallo,
muss man beim übergeben eines bool Wertes an eine C dll etwas spezielles beachten.
Bei meinenen Wraper kommte es nämlich zu fehlern wenn ich #False übergebe.
muss man beim übergeben eines bool Wertes an eine C dll etwas spezielles beachten.
Bei meinenen Wraper kommte es nämlich zu fehlern wenn ich #False übergebe.
- NicTheQuick
- Ein Admin
- Beiträge: 8808
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: bool an c dll übergeben
Welchen PB-Datentyp hast du den für bool genommen? Wenn ich mich nicht irre sind bools in C nichts anderes wie Integer in PB.
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: bool an c dll übergeben
Hierbei ist aber zwischen BOOL und bool zu unterscheiden. Ersteres ist glaube ich ein long in PB (sofern Windows Header verwendet werden), zweiteres ein byte.NicTheQuick hat geschrieben:Welchen PB-Datentyp hast du den für bool genommen? Wenn ich mich nicht irre sind bools in C nichts anderes wie Integer in PB.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Re: bool an c dll übergeben
Danke für euere Antworten, habe es jetzt auf .l umgestellt und jetzt scheint es zu funktionieren.
Re: bool an c dll übergeben
Das ist richtig, wobei man noch hinzufügen kann, dass BOOL kein Datentyp von C oder C++ ist,DarkDragon hat geschrieben:Hierbei ist aber zwischen BOOL und bool zu unterscheiden. Ersteres ist glaube ich ein long in PB (sofern Windows Header verwendet werden), zweiteres ein byte.
sondern nur ein typedef in WinDef.h:
Code: Alles auswählen
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;
typedef int INT;
typedef unsigned int UINT;
Ist eigentlich ganz einfach. Allerdings kommen dazu noch die Aufrufkonventionen (Calling conventions)bool (C++) hat geschrieben:Microsoft Specific
In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1.
von Windows, und die sagen aus das Datentypen kleiner 32bit (also z.b. Bytes und Words) bei der
Übergabe an eine Funktion auf 32bit erweitert werden. Es wird also kein Byte oder Word auf den
Stack gelegt, sondern ein 32bit-Wert.
Wenn PB nun ein Byte in ein 8-bit-Register legt und dann das entsprechende 32bit-Register auf
den Stack pusht, löscht es dabei scheinbar nicht die oberen Bits des 32bit-Registers, so dass
diese undefiniert sind. Ich habe mir das jetzt nicht im ASM angeschaut, aber ich denke das ist
die Erklärung warum Du ein #False übergibst aber trotzdem ein true (also alles andere als 0)
herauskommen kann.
In dem Falle ist es also richtig dann in PureBasic .l für die Funktionsdeklaration zu nehmen.
Ansonsten bleibt das bool aber ein Byte, z.b. in Strukturen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: bool an c dll übergeben
Purebasic #True = +1 (Hex $00000001)
C oder C++ True = -1 (Hex $FFFFFFFF)
Variant True = (word) -1 (Hex $FFFF)
C oder C++ True = -1 (Hex $FFFFFFFF)
Variant True = (word) -1 (Hex $FFFF)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: bool an c dll übergeben
@mk-soft:
Diese Werte können von Compiler zu Compiler auf unterschiedlichen Platformen anders sein.
Auf Windows mit Visual C++ sind Deine Informationen falsch. (Caliban macht einen Import oder Wrapper für eine VC++ DLL)
Wieder aus MSDN und dem selben Topic:
Und der Vollständigkeit halber noch die WinAPI-Defines aus WinDef.h, aber die haben mit
dem Datentyp bool nichts zu tun:
Diese Werte können von Compiler zu Compiler auf unterschiedlichen Platformen anders sein.
Auf Windows mit Visual C++ sind Deine Informationen falsch. (Caliban macht einen Import oder Wrapper für eine VC++ DLL)
Wieder aus MSDN und dem selben Topic:
Das kannst Du mit VC++ auch überprüfen:bool (c++) hat geschrieben:An r-value of type bool can be converted to an r-value of type int, with false becoming zero and true becoming one.
Code: Alles auswählen
bool x = true;
std::cout << (int)x << std::endl; // ausgabe: 1
std::cout << x << std::endl; // ausgabe: 1
x = false;
std::cout << (int)x << std::endl; // ausgabe: 0
std::cout << x << std::endl; // ausgabe: 0
dem Datentyp bool nichts zu tun:
Code: Alles auswählen
#define FALSE 0
#define TRUE 1
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: bool an c dll übergeben
Also auf ungleich null prüfen was auch normal ist.
Die bis jetzt von mir verwendeten dll´s hatten mir mir immer '-1' geliefert...

Die bis jetzt von mir verwendeten dll´s hatten mir mir immer '-1' geliefert...

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: bool an c dll übergeben
Ja, das ist das Beste. false = 0 und alles andere ist true.mk-soft hat geschrieben:Also auf ungleich null prüfen was auch normal ist.
Code: Alles auswählen
If a
; true
Else
; false
EndIf
Code: Alles auswählen
If Not a
; false
Else
; true
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: bool an c dll übergeben
Hier gibt es eine halbwegs vollständige, aber etwas fehlerhafte Liste: http://msdn.microsoft.com/en-us/library ... s.85).aspxDanilo hat geschrieben:Das ist richtig, wobei man noch hinzufügen kann, dass BOOL kein Datentyp von C oder C++ ist,DarkDragon hat geschrieben:Hierbei ist aber zwischen BOOL und bool zu unterscheiden. Ersteres ist glaube ich ein long in PB (sofern Windows Header verwendet werden), zweiteres ein byte.
sondern nur ein typedef in WinDef.h
Besonders die Tatsache, dass HRESULT auch auf 64bit nur 32bit groß ist hat mich anfangs verwundert, weil das H bekanntlich für HANDLE steht und HANDLE eben ein Pointer Datentyp ist. Aber HRESULT ist garkein HANDLE.
In den Kommentaren im Link oben fand ich auch noch diese Liste:
https://docs.google.com/spreadsheet/ccc ... jQmc#gid=0
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.