Entwickler-Ecke
Sonstiges (Delphi) - Funktion in Unit macht nicht das was ich möchte
Zaubär - Fr 15.11.02 17:02
Titel: Funktion in Unit macht nicht das was ich möchte
Hallo Leute,
ich hab als Test mal eine kleine Unit geschrieben, die schaut so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| unit FCunit;
interface
function Passwordcoding(pass:string):String;
implementation
FUNCTION Passwordcoding; CONST code = 's8wypka0xr6s7ib320tqddyo75zt3h73'; VAR i: INTEGER; password : String[32]; BEGIN FOR i := 1 TO length(pass) DO BEGIN password[i] := Chr(Ord(code[i]) XOR Ord(pass[i])); END; passwordcoding := password; END; end. |
Wenn ich nun im Programm folgenden aufruf mache....
Quelltext
1:
| StringVariable := passwordcoding(edit1.text); |
....bleibt der Inhalt von StringVariable leer.
Wäre toll wenn jemand den Fehler sehen würde :roll:
Delete - Fr 15.11.02 17:42
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| FUNCTION Passwordcoding; CONST code = 's8wypka0xr6s7ib320tqddyo75zt3h73'; VAR i: INTEGER; password : String[32]; BEGIN FOR i := 1 TO length(pass) DO BEGIN password[i] := Chr(Ord(code[i]) XOR Ord(pass[i])); END; result := password; END; |
Versuch es mal so.
Delete - Fr 15.11.02 17:44
Titel: Re: Funktion in Unit macht nicht das was ich möchte
| Zaubär hat folgendes geschrieben: |
| ich hab als Test mal eine kleine Unit geschrieben, die schaut so aus. Wenn ich nun im Programm folgenden aufruf mache, bleibt der Inhalt von StringVariable leer. |
:mrgreen: Die Funktion macht genau was du willst - NICHTS!
| Zitat: |
| Wäre toll wenn jemand den Fehler sehen würde |
Einen sehe ich, und ich hab´s nicht geglaubt! Der Compiler hat nicht gemeckert!
Quelltext
1:
| function Passwordcoding(pass:string):String; |
vs.
Quelltext
1:
| FUNCTION Passwordcoding; |
:idea:
Keldorn - Fr 15.11.02 17:48
hallo,
ich weiß nicht ob du
passwort[i] setzen kanns, die länge des Strings ist ja nicht bekannt.
wäre passwort ein string, gibt es eine Fehlermeldung.
diese variante funktioniert:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| FUNCTION Tform1.Passwordcoding; CONST code = 's8wypka0xr6s7ib320tqddyo75zt3h73'; VAR i: INTEGER; password : String[32]; BEGIN password:=''; FOR i := 1 TO length(pass) DO BEGIN password := password+Chr(Ord(code[i]) XOR Ord(pass[i])); END; passwordcoding := password; END; |
mfg frank
Delete - Fr 15.11.02 17:51
:shock:
Mist, das ist mir ganz entgangen. Der Compiler hätte dir eigentlich ins Gesicht springen müssen.
Aber bei sowas habe ich in den Klausuren auch immer Problme, wenn der Prof einem Code vorlegt mit der Aufgabe die Fehler zu finden - auf dem Papier wohl gemerkt, ohne Debugger.
Zaubär - Fr 15.11.02 17:53
@Luckie: Deine Variante funktioniert leider auch nicht. Trotzdem Danke!!
@MathiasSimmack: Doch das funktioniert.
@Keldorn: Danke!!!!
Delete - Fr 15.11.02 17:54
| Keldorn hat folgendes geschrieben: |
| ich weiß nicht ob du passwort[i] setzen kanns, die länge des Strings ist ja nicht bekannt. |
Klar ist die Länge bekannt. Schau mal in deinen eigenen Code:
Quelltext
1: 2:
| var password : String[32]; // <-- |
Klar macht´s nicht viel Sinn, denn in dem Fall sollte man dafür sorgen, dass der der Funktion übergebene String auch bloß 32 Zeichen lang ist. Insofern ist dein Vorschlag natürlich besser. Aber durch die Festlegung auf 32 Zeichen würden auch in deinem Fall alle Buchstaben > 32 abgeschnitten werden.
Delete - Fr 15.11.02 17:56
| Zaubär hat folgendes geschrieben: |
| @MathiasSimmack: Doch das funktioniert. |
Na ja, funktioniert hat´s ja wohl offensichtlich nicht. Sonst hättest du nicht gepostet. Aber interessant ist´s schon, denn im Normalfall schimpft der Compiler mit den Worten:
| der böse Compiler hat folgendes geschrieben: |
| Funktion benötigt Ergebnistyp |
Keldorn - Fr 15.11.02 18:02
Titel: Re: Funktion in Unit macht nicht das was ich möchte
das mit dem verkürztem Function-aufruf:
thema "forward- und interface-Deklarationen" dort stehts drin. ich finds zwar blöd und total unübersichtlich , aber naja.
Frank
Delete - Fr 15.11.02 18:40
Na ja, in Bezug auf forward macht das schon Sinn. Da habe ich auch wieder was gelernt, denn ich wusste bisher z.B. nicht, dass Funktionsdeklarationen im interface-Teil der Unit wie mit forward deklariert sind.
Aber ich gebe dir recht: das sieht irgendwie komisch aus. Ich deklariere die Funktionen/Prozeduren auch im implementation-Teil nochmals inkl. des Kopfes.
@Zaubär: ich würde mir noch mal Gedanken über die Kodierung machen. Ein paar Versuche ergaben bei mir unschöne Ergebnisse, weil du u.U. in den Bereich der nicht darstellbaren Zeichen gerätst. Sollte durch einen dummen Zufall das erste Zeichen mal #0 sein, bleibt dein String auch leer, obwohl die Funktion an sich funktioniert.
Zaubär - Fr 15.11.02 19:11
@Mathias: Dein Vorschlag hat durchaus Berechtigung und ich hab jetzt die Funktion bereits so abgeändert, dass keine Steuerzeichen mehr vorkommen können.
Das ganze mit der Passwortabfrage funktioniert jetzt übrigens, jetzt kann ich das Passwort in einer Datei ablegen und es kann ohne weiteres nicht von anderen Leuten erfahren werden :wink:
Als Test ob das Passwort richtig sein könnte, führe ich im Programm einfach nochmal die Verschlüsselungsfunktion aus und vergleiche das Passwort im verschlüsselten Zustand.
Keldorn - Fr 15.11.02 21:58
Hallo, ich bins nochmal ! man will ja auch noch was dazulernen
nochmal wegen
string ist dynamisch, mit
string[32] deklarierst du einen string mit max 32 Zeichen statisch. Die deklaration hat aber nichts mit der länge des eigentlichen Strings zu tun
Quelltext
1: 2: 3: 4: 5: 6:
| Var password1,password2:string[32] ... password1:='Test'; password2:=''; len1:=length(password1); len2:=length(password2); |
len1 wird 4 sein, len2 wird 0 sein - aber deswegen nicht 32.
in dem ursprünglichen Code ist am Anfang password='' die länge also auch 0.
anschließend versuchst du in der Schleife die einzelnen Zeichen zu ändern z.B. password[1]:='X' - bewegst dich damit ja schon außerhalb des gültigen bereiches, da die länge des strings ja trotzdem 0 ist. Du bekommst nur deswegen keine fehlermeldung, weil du mit string[32] der Speicher schon da vorhanden ist, wäre passwort
string wäre niemals speicher reserviert wurden und da wird schon einer meckern. Und das z.B. password[33]:='X' nicht funktionert ist ja auch allen klar.
password[1] ist ja vielleicht noch ein wenig unklar, aber wie soll z.B. das funktionieren:
Quelltext
1: 2:
| password:=''; password[20]:='X'; |
wie soll jetzt password aussehen und welche länge soll er besitzen?
eine andere Variante wäre noch auf die variable password voll zu verzichten und wie luckie gleich mit result zu arbeiten:
Quelltext
1: 2: 3: 4: 5:
| Var i:integer; begin result:=pass; //Zuweisung for i:=1 to length(pass) do result[i] := ... //einzelne Zeichen ändern end; |
Wäre nett, wenn ich eine rückmeldung bekomme, ob meine überlegungen so richtig sind
Mfg Frank
Delete - Fr 15.11.02 22:31
Ja, deine Überlegungen sind natürlich richtig.
Ich war in Gedanken bei "sizeof".
Zaubär - Sa 16.11.02 10:02
@Keldorn: Ich würd auch mal sagen, deine Überlegungen stimmen :wink:
So wie's bei mirausschaut werd ich die Funktion eh noch weiterentwickeln wenn die anderen Programmteile auch fertig sind.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!