Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - string aufspalten anhand eines zeichens


wic_zocker - So 13.06.10 18:26
Titel: string aufspalten anhand eines zeichens
Hi,

nach dem String splitten kommt folgender Fehler:
... raised exception class ... with message 'Access violation at adress ....' .... in line 1

Ich erwarte das durch die Prozedure Split mir der String anhand des Delimiters auf ein String Array verteilt wird. Jedoch ist nur string[0] ansprechbar, bei string[2] ist schon nichts mehr hinterlegt. Dennoch ist Count = 9. Ausserdem wie es scheint ist doch das 'for i := 0 to FilesList.Count do begin' nicht mit 'end' abgeschlossen, wenn ich es setze meckert aber der compiler.


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:
type
  Tp_point = record
    datetime : string;
    ...
end;

// max tp = 50
ar_tppoints : array[1..2,0..MAX_TP] of Tp_point;

procedure Split (const Delimiter: Char;
    Input: string;
    const Strings: TStrings) ;
begin
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;

procedure TMain.GetUpdateData();
var
  n, i,x: integer;
  myfile : TextFile;
  SR: TSearchRec;
  IsFound: Boolean;
  FilesList, strListVal :TStringList;
  StartDir, strHz, strLine: string;
begin
  FilesList := TStringList.Create;
  strListVal := TStringList.Create;
  // file find and access
  StartDir := 'c:\system1';
  if StartDir[length(StartDir)] <> '\' then
    StartDir := StartDir + '\';
  IsFound :=
    FindFirst(StartDir+'*.log', faAnyFile-faDirectory, SR) = 0;
  while IsFound do begin
    FilesList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;
  FindClose(SR);
  for i := 0 to FilesList.Count do begin
    AssignFile(myFile, FilesList.Strings[i]);
    Reset(myFile);
    // Display the file contents
    while not Eof(myFile) do begin
      ReadLn(myFile, strLine);
      // ''101'#9'1'#9'12.03.10'#9'12.43.23'#9'5'#9'6'#9'7'#9'8'#9'9''
      Split(#9,strLine,strListVal);
      if strListVal.Count = 9 then begin
        n := StrToInt(strListVal.Strings[0]) - 100;  // n ist 1
        if (n > 0and (n <= MAX_TP) then begin
          // save date time
{1}       ar_tppoints[1][n].datetime := strListVal.Strings[2] + ' ' +  
           strListVal.Strings[3];
          ...
        end;
    end;
    CloseFile(myFile);
  end;
  strListVal.Clear;
  FilesList.Free;
end;


Vielleicht versteht ja jemand den Fehler.
Vielen Danke fuer eure Hilfe im voraus

Gruss in die weite Welt!

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hi,
ausserdem beim debuggen gibt es in der Zeile 'Strings.DelimitedText := Input;' den Infotext 'Strings.DelimitedText = Function to be called TStrings.GetDelimetedText was elimated by linker'

Heisst das die entsprechende Funktion konnte vom Linker nicht aufgeloest werden?

Gruss


jaenicke - So 13.06.10 19:07

user profile iconwic_zocker hat folgendes geschrieben Zum zitierten Posting springen:
Heisst das die entsprechende Funktion konnte vom Linker nicht aufgeloest werden?
Die Funktion wurde gar nicht in die Exe kompiliert, wozu auch? Schließlich wird DelimitedText nur zugewiesen, aber nicht ausgelesen. Dementsprechend wird der Getter auch nicht gebraucht.

// EDIT:
Mit dem angegebenen Stringinhalt kann ich das Problem nicht reproduzieren. Du hast da ein Speicherleck drin und die Ressourcenschutzblöcke fehlen, aber sonst sehe ich erst einmal nichts.


wic_zocker - So 13.06.10 19:19

Hallo,

danke fuer die schnelle Antwort. Ist es den notwendig einen aufgeteilten String mit GetDelimeted auszulesen um seine einzelnen Abschnitte zu erhalten. Also sie werden gar nicht an die Stringliste zugewiesen?! Ist das sowas wie strspn und man muss es in einer Schleife aufrufen?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Mit dem angegebenen Stringinhalt kann ich das Problem nicht reproduzieren. Du hast da ein Speicherleck drin und die Ressourcenschutzblöcke fehlen, aber sonst sehe ich erst einmal nichts.
Der string sieht so aus wie dargestellt aber im debug ist es statt #9 ein #$D#$A ?!
Das wird aus Readln gelesen. mach dir ne file in c:\system1\xxx.log mit so einer Zeile, ich habe Tabs zwischen den einzelnen elementen gemacht.
ja das ist das problem, da ist irgenwo ein Speicherleck?!

Danke fuer die antwort


Gruss

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.


wic_zocker - Do 17.06.10 00:15

Hi,

ja ist mal wieder ne access violation und zwar hier:

Delphi-Quelltext
1:
2:
3:
4:
{ FALSCH    for i := 0 to FilesList.Count do begin }
{RICHTIG}
    for i := 0 to FilesList.Count-1 do begin
    AssignFile(myFile, FilesList.Strings[i]);


und das der String nicht gesplittet werden konnte lag an einem Array - ueberlauf bei der Initialisierung, der den Speicher zerschossen hat. (nicht mit im Example code)

Gruss in de weite Welt