Von C nach Pascal Portieren

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
michasbaer
Beiträge: 10
Registriert: Do 17. Apr 2008, 16:08

Von C nach Pascal Portieren

Beitrag von michasbaer »

Hallo an alle,
ich stehe vor einem Portierungsproblem,
und brauche Hilfe von jemandem der sich
in C besser auskennt als ich:

In C steht es so:
(byte_1, byte_2 und byte_3 sind als UCHAR definiert)

Code: Alles auswählen

if (byte_& 0x80) byte_2 |=  byte_3;
else
byte_2 &= ~byte_3;


in Pascal (Delphi + Lazarus)
(byte_1,byte_2 und byte_3 sind als byte definiert)

Code: Alles auswählen

if (byte_1 and $80) then byte_2 := (byte_2 or byte_3)
 else
 byte_2 := byte_2 and (not byte_3);

Lehnt Delphi/Lazarus mit "Ausdruckstyp muss BOOLEAN sein" ab.
Kann mir jemand die C-Zeilen richtiger interpretieren ?

Schönen Dank
Fritz
Zuletzt geändert von Lori am Mo 27. Jun 2011, 20:54, insgesamt 1-mal geändert.
Grund: Highlighter

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Von C nach Pascal Portieren

Beitrag von theo »

Ich blicke nicht ganz durch, aber den Ausdruck kannst du Typecasten, dann kompiliert das:

if Boolean(byte_1 and $80) ..

Also <> 0, nehm ich an.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Von C nach Pascal Portieren

Beitrag von Bora4d »

Versuch mal das:
if (byte_1 and $80)<>0 then ...

Bei C ist alles was nicht 0 ist TRUE.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Von C nach Pascal Portieren

Beitrag von Socke »

Bei If-Abfragen, Schleifen und so weiter musst du immer einen boolschen Wahrheitswert als Ausdruck ermitteln. In Pascal kann das nur der Typ Boolean sein (mit den Werten True und False, die den Werten -1 beziehungsweise 0 entsprechen); C ist da ein wenig nachlässiger und wertet den Zahlwert 0 als False und alles andere als True. Daher musst du in Pascal einen Vergleichsoperator verwenden, in C wäre das nur guter Stil gewesen:

Code: Alles auswählen

var
  byte_1, byte_2, byte_3: Byte;
begin
  if (byte_1 and $80) = $80 then
    byte_2 := (byte_2 or byte_3)
  else
    byte_2 := byte_2 and (not byte_3);


theos Vorschlag mit Typecasting wäre auch möglich, wobei dann Bytebool und nicht Boolean der richtigere Typ wäre (Bytebool verhält sich bezüglich der Zahlwert-Repräsentation wie C). Vermutlich wäre diese Variante sogar noch ein bis zwei Rechenoperationen (Vergleich mit $80) schneller.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Von C nach Pascal Portieren

Beitrag von carli »

VORSICHT

"-" ist "-" in Pascal und nicht "not". "not" wäre "~" in C.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Von C nach Pascal Portieren

Beitrag von marcov »

Code: Alles auswählen

if bytebool(byte_1 and $80) then
    ...

Antworten