bool an c dll übergeben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Caliban
Beiträge: 41
Registriert: 08.09.2004 08:46

bool an c dll übergeben

Beitrag von Caliban »

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.
Benutzeravatar
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

Beitrag von NicTheQuick »

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.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: bool an c dll übergeben

Beitrag von DarkDragon »

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.
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.
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.
Caliban
Beiträge: 41
Registriert: 08.09.2004 08:46

Re: bool an c dll übergeben

Beitrag von Caliban »

Danke für euere Antworten, habe es jetzt auf .l umgestellt und jetzt scheint es zu funktionieren.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: bool an c dll übergeben

Beitrag von Danilo »

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.
Das ist richtig, wobei man noch hinzufügen kann, dass BOOL kein Datentyp von C oder C++ ist,
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;
bool dagegen ist ein eingebauter Datentyp in C und ist in VC++ 1 Byte. MSDN erklärt dazu:
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.
Ist eigentlich ganz einfach. Allerdings kommen dazu noch die Aufrufkonventionen (Calling conventions)
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
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: bool an c dll übergeben

Beitrag von mk-soft »

Purebasic #True = +1 (Hex $00000001)
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
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: bool an c dll übergeben

Beitrag von Danilo »

@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:
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.
Das kannst Du mit VC++ auch überprüfen:

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
Und der Vollständigkeit halber noch die WinAPI-Defines aus WinDef.h, aber die haben mit
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
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: bool an c dll übergeben

Beitrag von mk-soft »

Also auf ungleich null prüfen was auch normal ist.

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

:wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: bool an c dll übergeben

Beitrag von Danilo »

mk-soft hat geschrieben:Also auf ungleich null prüfen was auch normal ist.
Ja, das ist das Beste. false = 0 und alles andere ist true.

Code: Alles auswählen

If a
    ; true
Else
    ; false
EndIf
oder

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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: bool an c dll übergeben

Beitrag von DarkDragon »

Danilo hat geschrieben:
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.
Das ist richtig, wobei man noch hinzufügen kann, dass BOOL kein Datentyp von C oder C++ ist,
sondern nur ein typedef in WinDef.h
Hier gibt es eine halbwegs vollständige, aber etwas fehlerhafte Liste: http://msdn.microsoft.com/en-us/library ... s.85).aspx

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.
Antworten