Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem (vieleicht) mit Subroutine


ebs - Fr 01.04.05 12:06
Titel: Problem (vieleicht) mit Subroutine
Hallo!
Ich habe ein kleines Programm geschrieben, dass aus diesem Format

Quelltext
1:
2:
U10,1,1600,  950, 550,
U10,1,1600,  475,

ein zweidimensionalen String macht:

Quelltext
1:
U10[0][1]=1                    

Jetzt möchte ich aber, dass nicht nur das erste 'U10' in einen String kommt, sondern beide(In dem Format können beliebig viele 'U10' drin vorkommen). Jetzt habe ich einfach eine Schleife drum gemacht, aber nicht Delphi streikt, sondern Windows wirft eine Fehlermeldung aus.
Kann mir jemand sagen, wo der Fehler ist?
Vielen Dank für Eure Hilfe!


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:
procedure explode(S: String; C: Char; liste: array of TStringlist);
Var
 I, J: Integer;
begin
 if S = '' then
  exit;
 J := 1;
 for I := 1 to length(S) do
  if S[I] = C then
  begin
   Liste[x].Add(Copy(S, J, I-J));
   J := I+1;
  end;
 Liste[x].Add(Copy(S, J, I-J));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
q:=tstringlist.create;
q.loadfromfile('C:\1\Test.txta');

s22n := TStringList.Create;
for x:=1 to q.count-1 do
begin
w:=copy(q[x-1],1,3);
if w='S22' then S22n.add(q[x-1]);
end;

s22[0] := TStringList.Create;

for x:= 0 to s22n.count-1 do                               //<--------------------Schleife
Explode(s22n[0],',', s22[x]); // String->List

s22[0].savetofile('C:\1\test.txt');
end;


opfer.der.genauigkeit - Fr 01.04.05 12:37
Titel: Re: Problem (vieleicht) mit Subroutine
user profile iconebs hat folgendes geschrieben:


.. ein zweidimensionalen String macht ..

Quelltext
1:
U10[0][1]=1                    


.. sondern Windows wirft eine Fehlermeldung aus ..


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:
procedure explode(S: String; C: Char; liste: array of TStringlist);
Var
 I, J: Integer;
begin
 if S = '' then
  exit;
 J := 1;
 for I := 1 to length(S) do
  if S[I] = C then
  begin
   Liste[x].Add(Copy(S, J, I-J));
   J := I+1;
  end;
 Liste[x].Add(Copy(S, J, I-J));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
q:=tstringlist.create;
q.loadfromfile('C:\1\Test.txta');

s22n := TStringList.Create;
for x:=1 to q.count-1 do
begin
w:=copy(q[x-1],1,3);
if w='S22' then S22n.add(q[x-1]);
end;

s22[0] := TStringList.Create;

for x:= 0 to s22n.count-1 do                               //<--------------------Schleife
Explode(s22n[0],',', s22[x]); // String->List

s22[0].savetofile('C:\1\test.txt');
end;


Hab deinen Code überflogen. Abgesehen davon, daß dir so Kleinigkeiten wie die Deklaratin der Variable x in der Explode- Prozedure fehlt und ein
paar andere Deklarationen auch nicht zu finden sind, weiß ich nicht mal, wo da ein "zweidimensionaler Array" sein soll. :roll:

Soll nicht angreifend wirken..

Die Fehlermeldung würde mich interessieren. :)

//Edit: sowas ähnliches wie "access violation"?


ebs - Fr 01.04.05 13:05

Da sind mir wirklich einige Fehler unterlaufen, da ich schon ein bisschen experimentiert habe. Hier mal der Code der läuft;


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:
var
  Form1: TForm1;
  q:Tstringlist;
  x:integer;
  w:string;
  u10n:tstringlist;
  u10:array[0..500of tstringlist;

implementation

{$R *.DFM}

procedure explode(S: String; C: Char; liste: array of TStringlist);
Var
 I, J: Integer;
begin
 if S = '' then
  exit;
 J := 1;
 for I := 1 to length(S) do
  if S[I] = C then
  begin
   Liste[x].Add(Copy(S, J, I-J));
   J := I+1;
  end;
 Liste[x].Add(Copy(S, J, I-J));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
q:=tstringlist.create;
q.loadfromfile('C:\1\Test.nh');

s22n := TStringList.Create;
for x:=1 to q.count-1 do
begin
w:=copy(q[x-1],1,3);
if w='U10' then U10n.add(q[x-1]);
end;

U10[0] := TStringList.Create;

//for x:= 0 to u10n.count-1 do
Explode(U10[0],',', U10[x]); // String->List
U10[0].savetofile('C:\1\test.txt');
end;



end.


Die Fehlermeldung ist so:
Zugriffsverletzung bei Adresse 00429A26 in Modul 'Projekt1.exe' Lesen von Adresse 0000BD45


opfer.der.genauigkeit - Fr 01.04.05 13:19

Zitat:

Zeile44: Explode(U10[0],',', U10[x]); // String->List


Das mekert der Compiler nicht an? Immerhin ist U10[0] eine StringList und der Explodparameter erwartet nen string. :gruebel:

Die Fehlermeldung ist eine Speicherbereichsverletzung.
D.h. ich würde, wenn ich du wäre mal in aller Ruhe selber debuggen und nach solchen Sachen wie "einhalten der arraybereiche" prüfen.
Einfach mal selber suchen, in welchem Teil des Codes der Fehler auftaucht.