Die klassische LösungMathias hat geschrieben: Mo 15. Apr 2024, 19:15 Die haben ein Doppel not gemacht.Code: Alles auswählen
enabled = !!enabled; // make sure this is definitely either SDL_TRUE or SDL_FALSE.
Gemeine Falle mit C Boolean
-
PascalDragon
- Beiträge: 997
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Gemeine Falle mit C Boolean
FPC Compiler Entwickler
-
Mathias
- Beiträge: 7071
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Gemeine Falle mit C Boolean
Es ist schon krass, der einfachste Daten Typ welcher nur True oder False haben kann, hat es voll in sich,
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- af0815
- Lazarusforum e. V.
- Beiträge: 6980
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Gemeine Falle mit C Boolean
Nichts besonders, bei SQL musst du immer mit TRUE,FALSE,NIL rechnenMathias hat geschrieben: Mi 17. Apr 2024, 08:28 Es ist schon krass, der einfachste Daten Typ welcher nur True oder False haben kann, hat es voll in sich,
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
Warf
- Beiträge: 2217
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Gemeine Falle mit C Boolean
Als mit C99 Boolean als Datentyp eingeführt wurde konnten sie den Typen nicht bool nennen, weil ganz viele Bibliotheken ihren eigenen bool Typen definiert haben, sondern haben _bool eingeführt und dann stdbool.h enthält ein alias auf bool.BeniBela hat geschrieben: Di 16. Apr 2024, 14:49 Manchmal muss ich in C programmieren. Da habe vor Jahren ein C-Programm geschrieben und mir ein bool definiert. Nun musste ich das updaten, und eine Library verwenden, und dann stürzt es ab.
Da habe ich stundenlang untersucht, und dann gemerkt, dass mein bool, das bool aus dem Libraryheader überschreibt. Da hatte die struct dann die falsche Größe
In Projekten die also C99 oder neuer sind kann man einfach stdbool benutzen.
-
Mathias
- Beiträge: 7071
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Gemeine Falle mit C Boolean
Ich habe gerade noch etwas festgestellt. Wen man Integer-Typen von einem C-Header übernimmt, gibt es beim "if" auch noch Probleme.
Die Unit GL von fpc verwenden einen Byte als Boolean, daher geht unteres Beispiel nicht. Daher würde ich bei übersetzen liebe einen Boolean8 nehmen.
Aber einen Bug-Report würde ich bei der Unit GL nicht machen, wen man das ändern würde, das würde einen riessen Rattenschwanz bei bestehenden OpenGL Programmen auslösen.
Die Unit GL von fpc verwenden einen Byte als Boolean, daher geht unteres Beispiel nicht. Daher würde ich bei übersetzen liebe einen Boolean8 nehmen.
Code: Alles auswählen
uses GL;
begin
if True then begin
WriteLn('io');
end;
if GL_TRUE then begin
WriteLn('error');
end;
end. Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
Mathias
- Beiträge: 7071
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Gemeine Falle mit C Boolean
Ich bin gerade wieder über etwas komisches gestolpert.
Bei folgendem C-Programm ist der bool 1 Byte gross, genau wie der Boolean in FPC.
Aber jetzt das komische, verwende ich die Unit ctypes, welches einen C bool abbilden soll, hat dieser cbool 4 Byte !
Dieser Effekt ist unter Linux und Windows 64bit feststellbar.
Wieso ist dies so ?
Dies macht sich besonders in einer "array of cbool" bemerkbar.
Intern ist ein cbool = longbool (ctypes.inc)
Bei folgendem C-Programm ist der bool 1 Byte gross, genau wie der Boolean in FPC.
Code: Alles auswählen
// gcc main.c -o main
#include <stdio.h>
#include <stdbool.h>
int main(int argc, char **argv)
{
printf("bool: %ld\n", sizeof(bool)); // -> 1
}Code: Alles auswählen
uses
ctypes;
begin
WriteLn('Boolean: ', sizeof(boolean)); // -> 1
WriteLn('cbool: ', sizeof(cbool)); // -> 4
end. Wieso ist dies so ?
Dies macht sich besonders in einer "array of cbool" bemerkbar.
Intern ist ein cbool = longbool (ctypes.inc)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1698
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Gemeine Falle mit C Boolean
Naja, wenn ich mir die Deklaration von cbool ansehe, dann steht da cbool = longbool
-
Mathias
- Beiträge: 7071
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Gemeine Falle mit C Boolean
Und genau dieser hat 4 Byte.fliegermichl hat geschrieben: Do 13. Mär 2025, 18:37 Naja, wenn ich mir die Deklaration von cbool ansehe, dann steht da cbool = longbool
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
PascalDragon
- Beiträge: 997
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Gemeine Falle mit C Boolean
Ganz einfach: der meiste C Code nutzt typedef int bool oder analoges um einen Boolean-Wert dazustellen. Dass mehr auf einen standardisierten Booleantyp gegangen wird, ist erst seit vergleichsweise Kurzem der Fall. Demnach deckt cbool auch den häufigeren Fall für C-Code ab und wird aus Gründen der Rückwärtskompatibilität auch so bleiben.
Wenn du Kompatibilität zu C's _Bool (bis C23) bzw. bool (seit C23) möchtest, dann nimm Boolean bzw. Boolean8 her, da diese die gleiche Semantik haben.
FPC Compiler Entwickler