Autor Beitrag
Zaubär
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Fr 15.11.02 17:02 
Hallo Leute,

ich hab als Test mal eine kleine Unit geschrieben, die schaut so aus:
ausblenden 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....
ausblenden Quelltext
1:
StringVariable := passwordcoding(edit1.text);					

....bleibt der Inhalt von StringVariable leer.

Wäre toll wenn jemand den Fehler sehen würde :roll:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 15.11.02 17:42 
ausblenden 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.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 15.11.02 17:44 
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!
ausblenden Quelltext
1:
function Passwordcoding(pass:string):String;					

vs.
ausblenden Quelltext
1:
FUNCTION Passwordcoding;					

:idea:
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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:
ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Fr 15.11.02 17:53 
@Luckie: Deine Variante funktioniert leider auch nicht. Trotzdem Danke!!

@MathiasSimmack: Doch das funktioniert.

@Keldorn: Danke!!!!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 15.11.02 18:02 
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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 15.11.02 21:58 
Hallo, ich bins nochmal ! man will ja auch noch was dazulernen

nochmal wegen
ausblenden Quelltext
1:
password:string[32]					


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

ausblenden 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:
ausblenden 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:
ausblenden 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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 15.11.02 22:31 
Ja, deine Überlegungen sind natürlich richtig.
Ich war in Gedanken bei "sizeof".
Zaubär Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: 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.