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

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

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

Beitragvon pluto » 19. Mai 2019, 20:42 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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
Aktuelles Projekt: PlutoArduino
pluto
Lazarusforum e. V.
 
Beiträge: 7006
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon mschnell » 20. Mai 2019, 12:46 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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
mschnell
 
Beiträge: 3366
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon pluto » 20. Mai 2019, 13:05 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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
Aktuelles Projekt: PlutoArduino
pluto
Lazarusforum e. V.
 
Beiträge: 7006
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon Warf » 20. Mai 2019, 17:51 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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.
Warf
 
Beiträge: 1128
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon pluto » 20. Mai 2019, 18:50 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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

Das habe ich noch nie gesehen, dabei habe ich schon viel C Code angeschaut.
MFG
Michael Springwald
Aktuelles Projekt: PlutoArduino
pluto
Lazarusforum e. V.
 
Beiträge: 7006
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon BeniBela » 20. Mai 2019, 23:51 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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;
 
BeniBela
 
Beiträge: 263
Registriert: 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4) | 
CPU-Target: 64 Bit
Nach oben

Beitragvon mschnell » 21. Mai 2019, 11:38 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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
mschnell
 
Beiträge: 3366
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Warf » 21. Mai 2019, 13:44 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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
Warf
 
Beiträge: 1128
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Timm Thaler » 21. Mai 2019, 13:45 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

mschnell hat geschrieben:Meiner Ansicht nach Unsinn.


Ja sorry, das ist C. Da gehört Code-Obfuskation zum guten Programmierstil.
Timm Thaler
 
Beiträge: 941
Registriert: 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
Nach oben

Beitragvon Warf » 21. Mai 2019, 15:32 Re: Konvertierung von C/C++ nach Pascal/Lazarus?

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
Warf
 
Beiträge: 1128
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

• Themenende •
Vorherige

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried