Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi vb function zu delphi konvertieren (https://www.delphipraxis.net/25039-vbulletin-function-zu-delphi-konvertieren.html)

endeffects 30. Jun 2004 09:52


vb function zu delphi konvertieren
 
hallo =),

ich möchte gerne eine vb funktion zu delphi konvertieren
und bekomm nun allerdings ständig fehlermeldungen
vom compiler mit denen ich nichts anfangen kann

Code:
function calccrc(strng: string; lenstr: integer): integer;
var
  crc, ch, i, j: integer;
begin
  for i:= 0 to lenstr -1 do
    ch:= Ord(Copy(strng, i +1, 1));
    for j:= 0 to 7 do
      if ((crc Xor ch) And 1) Then
        crc:= (int((crc /2)) Xor 40961)
      else
        crc:= Int(crc / 2);
      end;
        ch:= Int(ch / 2);
    end;
  end;
  result:= crc;
end;
in der zeile: "ch:= Ord(Copy(strng, i +1, 1));" heißt
es z.b. inkompatible typen

in "if ((crc Xor ch) And 1) Then"
Ausdruck muss Boolean sein

crc:= (int((crc /2)) Xor 40961)
Operation ist auf Operantentyp nicht anwendbar

crc:= Int(crc / 2);
inkompatible typen Integer und extented

usw. hat jemand beim überfliegen meines versuches in
delphi vielleicht ein paar gundsetzliche fehler gefunden?

die orginal funktion:

Code:
Function CALCCRC(strng$, lenstr)
Dim crc As Long
Dim ch As Long
Dim i As Long
Dim j As Long

For i = 0 To lenstr - 1
  ch = Asc(Mid(strng$, i + 1, 1))
    For j = 0 To 7
      If ((crc Xor ch) And 1) Then
        crc = (Int((crc / 2)) Xor 40961)
      Else
        crc = Int(crc / 2)
      End If
      ch = Int(ch / 2)
    Next j
   Next i
CALCCRC = crc
End Function

sakura 30. Jun 2004 09:57

Re: vb function zu delphi konvertieren
 
Code:
function calccrc(strng: string[color=#ff0009][s]; lenstr: integer[/s][/color]): integer;
var
  crc, ch, i, j: integer;
begin
  [color=#ff0009]CRC := 0;[/color]
  for i := [color=#ff0009]1 to Length(Strng)[/color] do
    ch := [color=#ff0009]Ord(strng[I]);[/color]
    for j := 0 to 7 do
      if ((crc Xor ch) And 1)[color=#ff0009] <> 0[/color] Then
        crc:= ([color=#ff0009]Trunc(crc /2)[/color] Xor 40961)
      else
        crc:= [color=#ff0009]Trunc(crc /2)[/color];
      end;
        ch:= [color=#ff0009]Trunc(crc /2)[/color];
    end;
  end;
  result:= crc;
end;
Das sollte es sein ;)

...:cat:...

endeffects 30. Jun 2004 10:06

Re: vb function zu delphi konvertieren
 
oh das ging aber schnell, dankeschön =)

und es scheint auch schon fast zu funktionieren *gg*
aber in der zeile "ch:= Trunc(crc /2);"
meckert der compiler noch einmal:
"Dekleration erwartet, aber Bezeichner 'ch' gefunden"

Ich denke mal das das end if auf der vb funktion
noch nicht richtig umgesetzt ist

sakura 30. Jun 2004 10:17

Re: vb function zu delphi konvertieren
 
Ich sehe gerade, daß Dir die Pascal-Syntax noch gar nicht liegt, da fehlen ein paar begins

Code:
function calccrc(strng: string): integer;
var
  crc, ch, i, j: integer;
begin
  CRC := 0;
  for i := 1 to Length(Strng) do
  [color=#ff0000]begin[/color]
    ch := Ord(strng[I]);
    for j := 0 to 7 do
    [color=#ff0000]begin[/color]
      if ((crc Xor ch) And 1) <> 0 Then
        crc:= (Trunc(crc /2) Xor 40961)
      else
        crc:= Trunc(crc /2)[s][color=#ff0000];[/color][/s]
      end;
      ch:= Trunc(crc /2);
    end;
  end;
  result:= crc;
end;
:!: Beachte das durchgestrichene Semikolon nach der Else-Anweisung ;)

...:cat:...

endeffects 30. Jun 2004 10:31

Re: vb function zu delphi konvertieren
 
nun meckert er nur noch an der Stelle
"result:= crc;" und meint "Deklaration
erwartet, aber Bezeichner 'result' gefunden" :gruebel:

sakura 30. Jun 2004 10:35

Re: vb function zu delphi konvertieren
 
Args, die VBler :wall:

Okay, kurzer Exkurs in die If-Then-Else Welt von Pascal ;)

In der Regeln geht mit jedem END ein BEGIN (es gibt wenige Ausnahmen). Du hast getippt:
Delphi-Quellcode:
if ..... then
   Anweisung
else
   Anweisung
end;
Hier hast Du ein END ohne BEGIN. Es gibt zwei Möglichkeiten. Da Du nur eine Anweisung je Zweig hast, lasse die BEGIN-END Blöcke weg (heutzutage manchmal abwertend beurteilt)
Delphi-Quellcode:
if .... then
  Anweisung
else
  Anweisung;
oder Du schreibst schöne Blöcke. Ist imho besser zu lesen.
Delphi-Quellcode:
if .... then
BEGIN
  Anweisung(en);
END
else
BEGIN
  Anweisung(en);
END;
...:cat:...

Smokey 30. Jun 2004 10:37

Re: vb function zu delphi konvertieren
 
dann hast du vor dem result := crc ein end; zuviel.

vermutlich genau an der stelle wo sakura dein ; durchgestrichen hat und nen end hingeklemmt hat :wink:

<edit> oh das end war ja schon da. Also dein fehler, aber mit Sakuras if-then lektion bekommste das schon hin 8) <edit>

Generalissimo 30. Jun 2004 10:39

Re: vb function zu delphi konvertieren
 
Zitat:

Zitat von sakura
Ich sehe gerade, daß Dir die Pascal-Syntax noch gar nicht liegt, da fehlen ein paar begins

Code:
function calccrc(strng: string): integer;
var
  crc, ch, i, j: integer;
begin
  CRC := 0;
  for i := 1 to Length(Strng) do
  begin
    ch := Ord(strng[I]);
    for j := 0 to 7 do
    begin
      if ((crc Xor ch) And 1) <> 0 Then
        crc:= (Trunc(crc /2) Xor 40961)
      else
        crc:= Trunc(crc /2)[color=#ff0000];[/color]
      [s][color=#ff0000]end;[/color][/s]
      ch:= Trunc(crc /2);
    end;
  end;
  result:= crc;
end;

ein end; zuviel

Generalissimo 30. Jun 2004 10:40

Re: vb function zu delphi konvertieren
 
verdammt, zulangsam gewesen :stupid:

sakura 30. Jun 2004 10:41

Re: vb function zu delphi konvertieren
 
Man seid ihr alle fix :roll: :mrgreen:

...:cat:...

endeffects 30. Jun 2004 10:42

Re: vb function zu delphi konvertieren
 
also ich hab die schleifen nu schon mehrmals durchgezählt
da ist meines dafürhaltens kein end; zu viel *gg

ich hab vorher halt überwiegend mit php gearbeitet,
da mußte man auf solche dinge keine rücksicht nehmen

tut mir leid sakura *gg*, das ist erst mein 5ter Tag mit Delphi

sakura 30. Jun 2004 10:44

Re: vb function zu delphi konvertieren
 
Zitat:

Zitat von endeffects
also ich hab die schleifen nu schon mehrmals durchgezählt
da ist meines dafürhaltens kein end; zu viel *gg

Es sind nicht die Schleifen, es ist Dein if-then-else-end; ;) Siehe Generalissimos Code ;)

Zitat:

Zitat von endeffects
tut mir leid sakura *gg*, das ist erst mein 5ter Tag mit Delphi

Herzlich willkommen im Mekka der Programmierer :dp:

...:cat:...

shmia 30. Jun 2004 10:45

Re: vb function zu delphi konvertieren
 
Zitat:

Zitat von sakura
Delphi-Quellcode:
crc:= Trunc(crc /2);

Noch eine kleine Optimierung (statt die FPU zu bemühen, kann man auch Integerarithmetik verwenden): :zwinker:
Delphi-Quellcode:
crc:= crc div 2;
// alternativ kann man auch um ein Bit nach rechts schieben
crc := crc shr 1;
PS: FPU = floating processing unit = Flieskomma-Prozessor, könnte man auch zu den Akronymen aufnehmen

sakura 30. Jun 2004 10:47

Re: vb function zu delphi konvertieren
 
Zitat:

Zitat von shmia
Noch eine kleine Optimierung (statt die FPU zu bemühen, kann man auch Integerarithmetik verwenden): :zwinker:

Stimmt, aber zu meiner Verteidigung muss ich sagen, daß der VB-Code auch auf Real-Division (/) und nicht auf Integer-Division (\) basierte :mrgreen: Und wir wollten den Code ja korrekt übersetzen und keine Vermutungen starten :zwinker:

...:cat:...

endeffects 30. Jun 2004 10:55

Re: vb function zu delphi konvertieren
 
ihr seid einfach viel zu schnell *gg*,
also ersteinmal danke euch allen für die
rasche hilfe, an der funktion selbst meckert
der compiler nun auf jeden fall nicht mehr *gg*

wenn ich allerdings mit showmessage(calccrc('123456)');
über ein onclick verfahren die funktion aufrufe
dann heißt es an dieser stelle inkompatible typen:
'string' und 'integer', aber: calccrc(strng: string):integer;
übergeben wird doch strng als string und ausgegeben
werden soll eine integer zahl (crc die als solche definiert ist)

Smokey 30. Jun 2004 11:07

Re: vb function zu delphi konvertieren
 
eben.
Deine funktion liefert nen Integer zurück und Showmessage erwartet nen String.
Also musst du dein Resultat von integer nach String konvertieren (mit intToStr() )

Die gemütlichen php Zeiten bei denen Datentypen relativ egal waren sind nun vorbei :twisted:

endeffects 30. Jun 2004 11:13

Re: vb function zu delphi konvertieren
 
du bist soooo fies *gg*

also nocheinmal sehr vielen lieben Dank für die Hilfe =))

sakura 30. Jun 2004 11:31

Re: vb function zu delphi konvertieren
 
Zitat:

Zitat von Smokey
Die gemütlichen php Zeiten bei denen Datentypen relativ egal waren sind nun vorbei :twisted:

Warte noch ein bisschen, und Du wirst Dich aufregen, daß andere Sprache so schlampig (nicht flexibel :!:) sind, was es die Datentypenbehandlung betrifft.

...:cat:...

endeffects 30. Jun 2004 12:12

Re: vb function zu delphi konvertieren
 
na hoffentlich dauert das nicht zu lange *gg

irgendwo steckt allerdings noch der wurm drin,
die funktion schaut bei mir nun so aus:

Code:
function calccrc(strng: string): integer;
var
  crc, ch, i, j: integer;
begin
  CRC := 0;
  for i := 1 to Length(Strng)-1 do
  begin
    ch := Ord(strng[i]);
//hier hab ich geprüft ob ch und crc die richtigen werte haben
//für ch ist das der fall, crc liefert allerdings andere werte
    for j := 0 to 7 do
    begin
      if ((crc Xor ch) And 1) <> 0 Then
        crc:= (Trunc(crc /2) Xor 40961)
      else
        crc:= Trunc(crc /2);
      ch:= Trunc(crc /2);
    end;
  end;
  result:= crc;
end;
showmessage(intToStr(calccrc('123'))); müßte eigentlich
den wert 17812 liefern, erhalten tu ich aber 47105
meine funktionierende php lösung sah damals so aus:

Code:
   $packetlen = strlen($packet)-1;
   for ($i=$packetlen; $i > 0; $i--) {
      $ch = ord(substr($packet, $h++, 1));
      for($j=0; $j <= 7; $j++) {
         if (($crc ^ $ch) & 1) {
            $crc = ($crc / 2) ^ 40961;
         } else {
            $crc = $crc / 2;
         } 
         $ch = $ch / 2;
      }
   }
   
   return $crc;
allerdings hatte ich auch hier ewig mit der
inneren for schleife gekämpft bis ich letztendlich
den richtigen wert zurückgegeben bekommen habe

sakura 30. Jun 2004 12:17

Re: vb function zu delphi konvertieren
 
Der Unterschied:

Code:
function calccrc(strng: string): integer;
var
  crc, ch, i, j: integer;
begin
  CRC := 0;
  for i := 1 to Length(Strng)-1 do
  begin
    ch := Ord(strng[i]);
//hier hab ich geprüft ob ch und crc die richtigen werte haben
//für ch ist das der fall, crc liefert allerdings andere werte
    for j := 0 to 7 do
    begin
      if ((crc Xor ch) And 1) <> 0 Then
        crc:= (Trunc(crc /2) Xor 40961)
      else
        crc:= Trunc(crc /2);
      ch:= Trunc([color=#ff0000]crc[/color] /2);
    end;
  end;
  result:= crc;
end;
Code:
   $packetlen = strlen($packet)-1;
   for ($i=$packetlen; $i > 0; $i--) {
      $ch = ord(substr($packet, $h++, 1));
      for($j=0; $j <= 7; $j++) {
         if (($crc ^ $ch) & 1) {
            $crc = ($crc / 2) ^ 40961;
         } else {
            $crc = $crc / 2;
         } 
         $ch = [color=#ff0000]$ch[/color] / 2;
      }
   }
   
   return $crc;
...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.

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