Gemeine Falle mit C Boolean

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
PascalDragon
Beiträge: 962
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

Beitrag von PascalDragon »

Mathias 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.
Die klassische Lösung :lol:
FPC Compiler Entwickler

Mathias
Beiträge: 6956
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

Beitrag von Mathias »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
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

Beitrag von af0815 »

Mathias 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,
Nichts besonders, bei SQL musst du immer mit TRUE,FALSE,NIL rechnen :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Warf
Beiträge: 2142
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Gemeine Falle mit C Boolean

Beitrag von Warf »

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

In Projekten die also C99 oder neuer sind kann man einfach stdbool benutzen.

Mathias
Beiträge: 6956
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

Beitrag von Mathias »

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.

Code: Alles auswählen

uses  GL;
begin
  if True then begin
    WriteLn('io');
  end;
  if GL_TRUE then begin
    WriteLn('error');
  end;
end.   
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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6956
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

Beitrag von Mathias »

Ich bin gerade wieder über etwas komisches gestolpert.

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
}
Aber jetzt das komische, verwende ich die Unit ctypes, welches einen C bool abbilden soll, hat dieser cbool 4 Byte !

Code: Alles auswählen

uses
  ctypes;
begin
  WriteLn('Boolean: ', sizeof(boolean)); // -> 1
  WriteLn('cbool:   ', sizeof(cbool));   // -> 4
end. 
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)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1650
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

Beitrag von fliegermichl »

Naja, wenn ich mir die Deklaration von cbool ansehe, dann steht da cbool = longbool

Mathias
Beiträge: 6956
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

Beitrag von Mathias »

fliegermichl hat geschrieben: Do 13. Mär 2025, 18:37 Naja, wenn ich mir die Deklaration von cbool ansehe, dann steht da cbool = longbool
Und genau dieser hat 4 Byte.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 962
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

Beitrag von PascalDragon »

Mathias hat geschrieben: Do 13. Mär 2025, 18:32 Wieso ist dies so ?
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

Antworten