Konvertierung von C/C++ nach Pascal/Lazarus?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von pluto »

Boolean ist entweder false (Null) oder true (nicht Null).

Es wird False angezeigt ja, aber das ist kein "echtes" False...Vielleicht war es auch ein Fehl Interpretation.
Ich bin mir aber sehr sicher das Boolean Variablen einen dritten Zustand haben, den man nicht setzten kann.

var
a : integer = 0;

Sowas nutzte ich meistens in C. In Pascal mache ich das immer nach dem begin.

Und schon hat a bei jedem Aufruf einen definierten Anfangswert.

Das mache ich inzwischen, schon seit vielen Jahren. So hat jede Variable, den gewünschten Default wert.
MFG
Michael Springwald

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von mschnell »

Timm Thaler hat geschrieben:Boolean ist entweder false (Null) oder true (nicht Null).

Stimmt. Das wissen aber nicht alle C-Programmierer.
In einem Delphi-Programm, das eine C-DLL aufgerufen hat, gab es ein Peroblem. Der C-Programmierer hat "if (b == TRUE)..." geschrieben. Was C als "if (b == 1) ..." umsetzt, weil "TRUE" als "!FALSE" und demuzufolge "!0" definiert ist und der GBNU C Compiler daraus eine 1 macht. In Delphi ist True aber alle Bits gesetzt. -> Crash.

Korrekt wäre in C gewesen "if (b)..."

-Michael

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von pluto »

Korrekt wäre in C gewesen "if (b)..."

Richtig, ich verwende das auch nur noch bei boolean Variablen an, ist kürzer und übersichtlicher....
MFG
Michael Springwald

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

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von Warf »

mschnell hat geschrieben:In einem Delphi-Programm, das eine C-DLL aufgerufen hat, gab es ein Peroblem. Der C-Programmierer hat "if (b == TRUE)..." geschrieben. Was C als "if (b == 1) ..." umsetzt, weil "TRUE" als "!FALSE" und demuzufolge "!0" definiert ist und der GBNU C Compiler daraus eine 1 macht. In Delphi ist True aber alle Bits gesetzt. -> Crash.

Korrekt wäre in C gewesen "if (b)..."

-Michael


Da ist aber z.B. ein riesen unterschied zwischen C und C++. In C gibt es keinen Boolean typen, Boolean sind zahlen. Das heißt, das true und false (aus stdbool.h) als integer konstanten definiert sind. Daher ist es common practice bei C, wenn man sicher sein will das man einen "bool" hat (also 0 oder 1), z.B. um gegen true zu vergleichen das ganze (logisch nicht bitweise) doppelt zu verneinen. Also

Code: Alles auswählen

if (!!b == true) ...

Nicht schön aber ist wie gesagt recht normal unter C entwicklern.

C++ hingegen hat einen bool typen. Wenn du also einen Int gegen true vergleichst, sieht C++ das es unterschiedliche typen sind, converted den int nach bool (das selbe wie !!) und vergleicht dann zwei bools. In C++ müsste als if (b == true) tatsächlich funktionieren.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von pluto »

if (!!b == true) ...

Das habe ich noch nie gesehen, dabei habe ich schon viel C Code angeschaut.
MFG
Michael Springwald

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von BeniBela »

Timm Thaler hat geschrieben:
Wie bitte schaffst Du es in Pascal, uninitialisierte Variablen zu verwenden?



Zum Beispiel so:

Code: Alles auswählen

procedure test;
var r: TRect;
begin
  r.Top := 10;
  writeln(r.Left);
end;
 

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von mschnell »

Warf hat geschrieben:

Code: Alles auswählen

if (!!b == true) ...


Meiner Ansicht nach Unsinn. (GNU Implementierung mit !0 -> 1 )

Code: Alles auswählen

if (!!b == TRUE) {
  a=2;
 } else {
  a=-2;
}

b = 0 -> !b = 1 -> !!b = 0 -> a=--2
b = 1 -> !b = 0 -> !!b = 1 -> a= 2
b = 2 -> !b = 0 -> !!b = 1 -> a= 2

und einfach

Code: Alles auswählen

if (b) {
  a=2;
 } else {
  a=-2;
}

b = 0 -> a=--2
b = 1 -> a= 2
b = 2 -> a= 2

aber

Code: Alles auswählen

if (b == TRUE) {
  a=2;
 } else {
  a=-2;
}

b = 0 -> a=--2
b = 1 -> a= 2
b = 2 -> a= -2

-Michael

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

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von Warf »

Ja, vergleich mit true ist ein dummes beispiel, das ich nur genommen hab weils hier vorkam.

Aber beispiel du hast eine funktion die 0 oder <> 0 zurückgibt, du dich aber nur für den boolean wert interesierst. z.B. strcmp gibt 0 raus wenn zwei gleich sind, <0 wenn kleiner >0 wenn größer. Wenn du jetzt einen Unit test für eine solche funktion schreibst, und nur an dem bool wert interresiert ist, könntest du das so machen:

Code: Alles auswählen

bool expectedResults[] = {
  TRUE,
  FALSE,
  TRUE,
  ...
};
 
...
void performTest(int testNum) {
  assert(!!testFunc(input[i]) == expectedResults[i]);
}


Die alternativen wären hier:

Code: Alles auswählen

assert((testFunc(input[i]) && expectedResults[i]) || (!testFunc(input[i]) && !expectedResults[i]));
// oder
assert(expectedResults[i] == (testFunc(input[i]) != 0))
// oder
assert(!expectedResults[i] == !testFunc(input[i]))


Und da finde ich die erste variante am schönsten.

Anderes beispiel, du hast eine funktion die einen bool zurückgibt (also 1 oder 0) und eine funktion die einen int <>0 oder 0 zurückgibt und du willst die beiden funktionswerte vergleichen.

Auf den konstanten true oder false macht es natürlich keinen sinn

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von Timm Thaler »

mschnell hat geschrieben:Meiner Ansicht nach Unsinn.


Ja sorry, das ist C. Da gehört Code-Obfuskation zum guten Programmierstil.

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

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von Warf »

Timm Thaler hat geschrieben:Ja sorry, das ist C. Da gehört Code-Obfuskation zum guten Programmierstil.


Deshalb, wenn immer man die wahl zwischen C und C++ hat, sollte man C++ benutzen. Die sprache ist zwar deutlich komplizierter, und schwerer reinzukommen, aber versucht wenigstens alles was in C so richtig unsauber ist, schön und leserlich zu lösen.

Natürlich kann man immernoch scheiße bauen (z.B. !~b als b == -1), aber immerhin muss man in C++ nicht hässlichen Code schreiben wie C es oftmals von einem verlangt

Antworten