![]() |
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 ); } } |
AW: Übersetzen von 3 Zeilen C Code nach Delphi
Zitat:
Delphi-Quellcode:
//Edit: Peinlicher Fehler korrigiert
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; //Edit2: Erklärung
Delphi-Quellcode:
ist Kurzform für
crc ^= d
Delphi-Quellcode:
, also XOR.
crc = crc ^ d
Delphi-Quellcode:
Teil 1+3 dürften klar sein, der mittlere Teil ist impliziter Cast in bool, ergo 0=false, sonst true.
for( i = 8; i; i-- )
Delphi-Quellcode:
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.
crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 );
//Edit3: Man hätte den Code aber auch kürzer kriegen können:
Code:
Klammern und Int-Zeile gespart.
void get_crc( unsigned char d )
{ crc ^= d; for(int i = 8; i; i--) crc = (crc >> 1) ^ ((crc & 1) ? 0xA001 : 0 ); } |
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; |
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: |
AW: Übersetzen von 3 Zeilen C Code nach Delphi
Delphi-Quellcode:
Abgefahren :cyclops::twisted:
const
v: Array[Boolean] of Word = (0; $A001); begin ... crc := (crc shr 1) xor v[(crc and 1)]; end; |
AW: Übersetzen von 3 Zeilen C Code nach Delphi
Delphi-Quellcode:
Eine syntaktisch korrekte Übersetzung gibt es leider nicht. (schade eigentlich), aber am Nächsten würde doch wohl
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; ![]() 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. |
AW: Übersetzen von 3 Zeilen C Code nach Delphi
*Unsinn*
|
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:
(oder nicht?)
crc := (crc shr 1) xor v[Boolean(crc and 1)];
|
AW: Übersetzen von 3 Zeilen C Code nach Delphi
Delphi-Quellcode:
crc := (crc shr 1) xor v[Odd(crc)];
|
AW: Übersetzen von 3 Zeilen C Code nach Delphi
Zitat:
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:
, so daß in diesem Fall am Ende die oberen Bytes eh wegfallen.
and 1
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz