Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Übersetzen von 3 Zeilen C Code nach Delphi (https://www.delphipraxis.net/167414-uebersetzen-von-3-zeilen-c-code-nach-delphi.html)

eric_draven 28. Mär 2012 16:16

Delphi-Version: 5

Übersetzen von 3 Zeilen C Code nach Delphi
 
Hi,

kann mir jemand bitte diesen (für mich) kryptischen C Code nach Delphi oder Pseudocode übersetzen ? :roll:
Code:
void get_crc( unsigned char d )
{
  int i;

  crc ^= d;
  for( i = 8; i; i-- ){
    crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
  }
}

implementation 28. Mär 2012 16:19

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
Zitat:

Zitat von eric_draven (Beitrag 1159103)
Code:
void get_crc( unsigned char d )
{
  int i;

  crc ^= d;
  for( i = 8; i; i-- ){
    crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
  }
}

Wenn ich mich nicht irre:
Delphi-Quellcode:
procedure get_crc(d: char);
var i: integer;
begin
  crc := crc xor d;
  for i := 8 downto 1 do
    if (crc and 1)<>0 then
      crc := (crc shr 1) xor $A001
    else crc := crc shr 1;
end;
//Edit: Peinlicher Fehler korrigiert

//Edit2: Erklärung
Delphi-Quellcode:
crc ^= d
ist Kurzform für
Delphi-Quellcode:
crc = crc ^ d
, also XOR.
Delphi-Quellcode:
for( i = 8; i; i-- )
Teil 1+3 dürften klar sein, der mittlere Teil ist impliziter Cast in bool, ergo 0=false, sonst true.
Delphi-Quellcode:
crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
Der Pfeil steht für ein Bitshift, das & für ein AND und die ?:-Schreibweise ist eine Inline-Bedingung. Auch hier wieder impliziter bool-Cast.

//Edit3: Man hätte den Code aber auch kürzer kriegen können:
Code:
void get_crc( unsigned char d )
{
  crc ^= d;
  for(int i = 8; i; i--)
    crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
}
Klammern und Int-Zeile gespart.

Aphton 28. Mär 2012 16:21

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
Code:
void get_crc( unsigned char d )
{
  int i;

  crc ^= d;
  for( i = 8; i; i-- ){
    crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
  }
}
Delphi-Quellcode:
procedure get_crc(d: DWord);
var
  i: Integer;
const
  v: Array[Boolean] of Word = (0; $A001);
begin
  crc := crc xor d;
  for i := 8 downto 1 do
    crc := (crc shr 1) xor v[(crc and 1)];
end;

eric_draven 28. Mär 2012 19:14

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
Klasse !
Danke für Eure Blitzantworten :thumb:
Nun brauche ich das Ganze noch in asm für Atmel's, aber das bekomme ich hin. C ist leider nicht meine Stärke :cry:

isilive 29. Mär 2012 01:45

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
Delphi-Quellcode:
const
  v: Array[Boolean] of Word = (0; $A001);
begin
  ...
  crc := (crc shr 1) xor v[(crc and 1)];
end;
Abgefahren :cyclops::twisted:

himitsu 29. Mär 2012 08:07

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
Delphi-Quellcode:
const
  v: Array[Boolean] of Word = (0, $A001); // mit Komma, nicht daß sich wer beschwert es funktioniere nicht.
begin
  ...
  crc := (crc shr 1) xor v[crc and 1 <> 0]; // <>0 , denn Delphi gibt es keine automatische Ordinal-Boolean-Konvertierung
  crc := (crc shr 1) xor IfThen(crc and 1 <> 0, 0xA001, 0);
  crc := (crc shr 1) xor IfThen(Odd(crc), 0xA001, 0);
end;
Eine syntaktisch korrekte Übersetzung gibt es leider nicht. (schade eigentlich), aber am Nächsten würde doch wohl Delphi-Referenz durchsuchenIfThen kommen.
Leider ist IfThen nur eine billige Funktion und keine so schöne native Operation, was einige Nachteile mit sich bringt.
- Funktionsaufrufe (Codesprünge)
- alle Parameter werden erst ausgewertet (in C wird nur der verwendete "Parameter" ausgewertet)

Also hier wäre, von der Ausführungsgeschwindigkeit her, das BoolArray natürlich besser.

Neutral General 29. Mär 2012 08:13

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
*Unsinn*

Aphton 29. Mär 2012 14:47

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
@Himitsu
Danke schön. Habe auf Schönheitsfehler nicht geachtet und einfach darauf losgetippt ^_^

Aber so in etwas sollte das gehen.
Btw ein einfaches casten auf Boolean hätte ja auch geholfen, denn alles was <> 0 ist, ist true!
Delphi-Quellcode:
  crc := (crc shr 1) xor v[Boolean(crc and 1)];
(oder nicht?)

DeddyH 29. Mär 2012 15:00

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
Delphi-Quellcode:
crc := (crc shr 1) xor v[Odd(crc)];

himitsu 29. Mär 2012 15:17

AW: Übersetzen von 3 Zeilen C Code nach Delphi
 
Zitat:

Zitat von Aphton (Beitrag 1159263)
Btw ein einfaches casten auf Boolean hätte ja auch geholfen, denn alles was <> 0 ist, ist true!

Da mußt du immer etwas aufpassen.

crc ist 32 Bit und Boolean nur 8 Bit.
Falls Delphi hier keine Compilermagic versteckt hat, welche das Boolean logisch castet, anstatt es binär zu casten,
dann könnte es eventuell Probleme mit sowas geben, denn
Delphi-Quellcode:
LongBool($FFFFFF00) <> Boolean($FFFFFF00)
.
Aber zum Glück gibt es hier noch das
Delphi-Quellcode:
and 1
, so daß in diesem Fall am Ende die oberen Bytes eh wegfallen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz