Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ungültige Zweigeroperation


Andreas_Sans - Mi 06.08.03 20:00
Titel: Ungültige Zweigeroperation
Wenn ich auf einen Button auf dem ersten Formblatt drücke, meint Delphi es hätte eine Ungültige Zeigeroperation stattgefunden.

Hier der Quellcode :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
hin[1] := 'Aa';
hin[2] := 'Bb';
hin[3] := 'Cc';
hin[4] := 'Dd';
hin[5] := 'Ee';
hin[6] := 'Ff';
hin[7] := 'Gg';
hin[8] := 'Hh';
hin[9] := 'Ii';
hin[10] := 'Jj';
hin[11] := 'Kk';
hin[12] := 'Ll';
hin[13] := 'Mm';
hin[14] := 'Nn';
hin[15] := 'Oo';
hin[16] := 'Pp';
hin[17] := 'Qq';
hin[18] := 'Rr';
hin[19] := 'Ss';
hin[20] := 'Tt';
hin[21] := 'Uu';
hin[22] := 'Vv';
hin[23] := 'Ww';
hin[24] := 'Xx';
hin[25] := 'Yy';
hin[26] := 'Zz';
hin[27] := '1';
hin[28] := '2';
hin[29] := '3';
hin[30] := '4';
hin[31] := '5';
hin[32] := '6';
hin[33] := '7';
hin[34] := '8';
hin[35] := '9';
hin[36] := '0';

zurck[1] := 'Jj';
zurck[2] := 'Ff';
zurck[3] := 'Hh';
zurck[4] := 'Nn';
zurck[5] := 'Aa';
zurck[6] := 'Rr';
zurck[7] := 'Gg';
zurck[8] := 'Kk';
zurck[9] := 'Xx';
zurck[10] :='Pp';
zurck[11] :='Ee';
zurck[12] :='Yy';
zurck[13] :='Qq';
zurck[14] :='Uu';
zurck[15] :='Tt';
zurck[16] :='Dd';
zurck[17] :='Oo';
zurck[18] :='Ll';
zurck[19] :='Bb';
zurck[20] :='Ww';
zurck[21] :='Ss';
zurck[22] :='Ii';
zurck[23] :='Mm';
zurck[24] :='Zz';
zurck[25] :='Vv';
zurck[26] :='Cc';
zurck[27] :='5';
zurck[28] :='9';
zurck[29] :='2';
zurck[30] :='7';
zurck[31] :='6';
zurck[32] :='1';
zurck[33] :='4';
zurck[34] :='0';
zurck[35] :='3';
zurck[36] :='8';

decoder := '';
bester := '';
beste := '';
filename := 'C:\Eigene Dateien\anfang.doc';
LoadStringFromFile(filename,loadstring);
decoder := loadstring;
decodierung(decoder,hin,zurck,bester,beste);
// hier meint delphi es hätte ein ungültige zeigeroperation stattgefunden
form4.label4.caption := beste + ' Sekunde(n)'
form4.label6.caption := bester;

decoder := '';
bester := '';
beste := '';
filename := 'C:\Eigene Dateien\fortgeschritt.doc';
LoadStringFromFile(filename,loadstring);
decoder := loadstring;
decodierung(decoder,hin,zurck,bester,beste);
form4.label5.caption := beste + ' Sekunde(n)';
form4.label7.caption := bester;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
procedure LoadStringFromFile(Filename: stringvar LoadString: string);
var fs:TFileStream;
begin
fs:=TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
SetLength(LoadString, fs.Size);
if fs.size>0 then
fs.Read(LoadString[1], fs.Size);
fs.Free;
end;

procedure decodierung(decoder : string; hin : array of string; zurck : array of string
  var bester : stringvar beste : string);
var i,j,o       : integer;
    uber,uber2  : string;
    zahl : boolean;
begin
zahl := false;
i := length(decoder);
for j := 1 to i do begin

if zahl = false then begin

  for o := 0 to 36 do begin
  uber  := hin[o];
  uber2 := zurck[o];

  if decoder[j] = uber2[2then begin
      bester := bester + uber[2];
                               end;
  if decoder[j] = uber2[1then begin
      bester := bester + uber[1];
                               end
                     end;
  if decoder[j] = ' ' then begin
      bester := bester + ' ';
                           end;
  if decoder[j] = #13 then begin
      zahl := true;
                           end;
                     end;

if zahl = true then begin
 for o := 26 to 36 do begin
  if decoder[j] = zurck[o] then begin
      beste := beste + hin[o];
                              end
                      end;
                    end;
                   end;
end;


kann mir jemand helfen ?


Keldorn - Mi 06.08.03 21:53

Hallo

hin sind dynamische array , poste mal bitte wo du setlenght aufgerfufen hast
ich vermute mal: setlength(hin,36);

richtig in deinem falle wäre so

Delphi-Quelltext
1:
2:
setlength(hin,37);
setlength(zurck,37);

dynamische array beginnen bei 0, nicht bei 1, somit sind es 37 Einträge, nicht 36.
mit hin[36] wärst du bei setlength(hin,36) beim 37. Eintrag und damit außerhalb vom reserviertem speicher, der gurnd für die ungültige Zeigerop. beim setzen kommt sie evtl nicht, aber beim auslesen.

von der sache ist
Zitat:

hin[1] := 'Aa';

ein verschenkter platz, und hier wird es weiter krachen

Zitat:

procedure decodierung(decoder : string; hin : array of string; zurck : array of string; var bester : string; var beste : string);
var i,j,o : integer;
uber,uber2 : string;
zahl : boolean;
begin
zahl := false;
i := length(decoder);
for j := 1 to i do begin

if zahl = false then begin

for o := 0 to 36 do begin //// ********* 1 )
uber := hin[o]; // 2)
uber2 := zurck[o]; // 2)

if decoder[j] = uber2[2] then begin

1) du willst bestimmt von 1 beginnen nicht von 0,
hin[0] ist '' belegt und wenn du noch im Shcleifendurchlauf o:=0 drin hast kracht es selbst bei uber[2] und uber2[1], weil gar kein 1. oder 2. Zeichen im string ist

Mfg Frank


Terra23 - Mi 06.08.03 22:22

Andreas_Sans hat folgendes geschrieben:


Delphi-Quelltext
1:
form4.label4.caption := beste + ' Sekunde(n)';                    



... muß das nicht


Delphi-Quelltext
1:
Form4.Label4.Caption:=<span style="font-weight: bold">Bester</span>+' Sekunde(n)';                    


heißen??? :roll:


Andreas_Sans - Mi 06.08.03 23:24

danke

@Keldorn : das mit der Länge des arrays war dran schuld