Autor Beitrag
Smartie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Mi 08.06.05 08:00 
Servus!

Ich muß einen Blockcheck machen, und hab mir hierzu eine Kleine Funktion gebastelt. An sich stimmt die Logik, nur mit den Datentypen hab ichs wohl nicht ganz so. Denn, er will den 'xor'-Befehl nicht ausführen, da ihm meine Daten nicht passen. Weiß jemand wie ich das umbasteln muß, damit er es frisst? Der Code sieht folgendermaßen aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function Exor(fu: String): String;
var bit, subbit : String;
    i : Integer;
begin
  bit := #0;
  i := 1;
  repeat
    subbit := copy(fu, i, 1);
    bit := bit xor subbit;     //Hier meldet er den Fehler
  until i = length(fu)+1;
  Exor := bit;
end;


Danke schön und lieben Gruß,

Smartie

Moderiert von user profile iconTino: Titel geändert.
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 08.06.05 08:40 
Titel: Re: BCC
user profile iconSmartie hat folgendes geschrieben:
Servus!

Ich muß einen Blockcheck machen, und hab mir hierzu eine Kleine Funktion gebastelt. An sich stimmt die Logik, nur mit den Datentypen hab ichs wohl nicht ganz so. Denn, er will den 'xor'-Befehl nicht ausführen, da ihm meine Daten nicht passen. Weiß jemand wie ich das umbasteln muß, damit er es frisst? Der Code sieht folgendermaßen aus:
Smartie


So müsste es laufen. Für einzelne Zeichen nimmst du besser Char anstelle von Strings - du kannst auf Strings zugreifen, als wäre es ein array [1..n] of Char.

Der xor-Operator erwartet ein Integer. Mit Ord() konvertierst du Char in Integer, mit Chr() zurück.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function Exor(const fu: String): String;
var bit, subbit : Char;
    i : Integer;
begin
  bit := #0;
  for i := 1 to Length(fu) do  // for-Schleife ist in diesem Fall schneller
  begin                        // weil Length(fu) nur einmal aufgerufen wird
    subbit := fu[i];
    bit := Chr(Ord(bit) xor Ord(subbit));
  end;
  Exor := bit;
end;


Stefan
Smartie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Mi 08.06.05 08:53 
Danke schön, das funktioniert soweit!

Aber, mal was anderes, warum ist die For-Schleife schneller?
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 08.06.05 09:12 
user profile iconSmartie hat folgendes geschrieben:
Danke schön, das funktioniert soweit!

Aber, mal was anderes, warum ist die For-Schleife schneller?


In Pascal ist for immer dann schneller, wenn der Endwert sich aus einem Ausdruck ergibt - dieser wird nämlich nur einmal statt bei jedem Schleifendurchlauf ausgewertet. Was der Compiler daraus erzeugt, ist praktisch dieses:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  n := Length(fu);
  for i := 1 to n do  
  begin                          
    ...
  end;


Length(fu) wird nur einmal aufgerufen. Das ist auch semantisch wichtig: Wenn sich innerhalb der Schleife die Länge von fu ändert, hat das keinen Einfluss auf die Anzahl der Schleifendurchläufe. In dem Fall müsste man eine repeat .. until oder while-Schleife verwenden.

Ist mir ausserdem gerade noch aufgefallen: Die repeat-Schleife an der Stelle war auch ein etwas versteckter Bug: Wenn man die Funktion mit einem Leerstring aufruft, knallt es, weil die Schleife trotzdem mndestens einmal durchlaufen wird und so versucht wird, auf das erste Zeichen eines leeren Strings zuzugreifen.

Stefan
Smartie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 205



BeitragVerfasst: Mi 08.06.05 09:37 
Danke schön!

Genau das woltle ich wissen.

Lieben Gruß

Smartie