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.