Ich lese eine TXT Datei in eine Stringlist und übergebe diese an meine Funktion. In der Datei gibt es am Ende den Bereich [Data] wo mehrere Werte Kommaseperiert angegeben sind. Die Anzahl der Werte in einer Zeile kann dabei von 2 bis 7 variieren und die Anzahl der Zeilen ebenfalls.
Beispiel:
Code: Alles auswählen
[Data]
1099.97049364,1099.96941205
1099.97049364,1099.96838455
1099.97049364,1099.97343712
859.94872536,859.94240791
859.94872536,859.95336941
859.94872536,859.95046989
Nun möchte ich diese Werte aufgesplittet in einem 2 dimensionalen Array (Teil eines Record) haben.
Dazu durchlaufe ich die Stringlist von der Zeile in der die Daten anfangen bis zum Ende und weiße dem HIlfsarray 'a' durch meine Funktion explode(), die anhand eines Trennzeichen den String zerlegt, die einzelnen Werte zu.
Nun durchlaufe ich das Hilfsarray 'a' vom Low() bis zum High() Wert und möchte dem mehrdimensionalen Array 'Data' diese Werte dynamisch zuweisen.
Soweit ich das bis jetzt sehe, wird bei Result.Data[j][k] := a[k]; eine Exeption "External: SIGSEGV" ausgelöst.
Ich stehe total auf dem Schlauch und hoffe jemand blickt durch was ich da machen will.
Wenn mehr Infos/Code gebraucht wird, einfach sagen was.
Vielen Dank
Code: Alles auswählen
function TClassZeissERG.Analyse(StrList: TStringList): TERGValues;
var
i, j, k, m, n: integer; //Zählvariablen
a: array of string; //Zwischenarray
begin
Result.Error := False;
Result.ErrorNum := 0;
Result.ErrorText := '';
Result.Text := StrList[0];
// In der ersten Zeile muss '[Header]' stehen sonst ist es keine gültige ERG Datei
if Result.Text <> '[Header]' then
begin
Result.Error := True; // Fehlermeldung bei falschem
Result.ErrorNum := 1000; // Datenformat
Result.ErrorText := 'Keine passenden Daten gefunden';
end
else
begin
Result.cmmnr := explode('=', StrList[1], 1); // Aufsplitten der Datei in
Result.cmmType := explode('=', StrList[2], 1); // den vorgesehenen Record
Result.aufgabe := explode('=', StrList[3], 1); // Nochmal überarbeiten
Result.modus := explode('=', StrList[4], 1); // Auswertung eingekürzt
if StrList[25] = '[Data]' then // In Zeile 26 MUSS [Data] stehen.
begin
i := 26; // Auswertung ab Zeile 27
j := 0; // Zähler nullen
k := 0;
m := 0;
n := 0;
while i <= StrList.Count - 1 do //Durchlauf ab Zeile 27 bis Listenende
begin
if (Result.aufgabe[1] = 'DIST') or
(Result.aufgabe[1] = 'KUGELST') then // Voraussetzung für die Auswertung
begin // Zuweisung in ein Zwischenspeicherarray
a := explode(',', StrList[i], 5); // Messwerte aufplitten
setlength(Result.Data, j + 1, high(a)); // 2D Array Dimensionieren
m := Low(a);
n := High(a);
for k := m to n do
// Alle Einträge im Zwischenspeicherarray durchlaufen und im 2D Array ablegen
begin
Result.Data[j][k] := a[k];
end;
Inc(j); // Zähler 1. Dimension erhöhen
k := 0; // Zähler Zwischenarray zurücksetzen
end
else
begin // Fehlermeldung bei falscher "aufgabe"
Result.Error := True;
Result.ErrorNum := 1001;
Result.ErrorText := 'Nur Daten im Modus DIST oder KUGELST implementiert';
end;
end;
end;
end;
end;