![]() |
Fehler: Unkontrollierter Übertrag von Daten in ein Array
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Zusammen,
etwas amüsiert, hänge ich an einem Fehler in meiner Software fest und hoffe, dass mir jemand helfen kann. So etwas habe ich noch nicht erlebt... In einer Function erstelle ich aus einem zweidimensionalen Array eine csv-Datei. Das klappt auch wunderbar und ist nicht die erste Function dieser Art in meiner Software. Um zu ermitteln, wo die Datei gespeichert werden soll, wird der Pfad ermittelt, in dem die Software liegt - auch kein Problem. Witzigerweise wird aber genau in diesem Moment in die dirtte Spalte meines Arrays und immer in der Zeile "223" der Pfad abgelegt... Ich habe zwei Screenshots mit angehängt, aus denen alles ersichtlich sein sollte... Hier noch die ganze Function:
Delphi-Quellcode:
function SaveToCSVLiefer(var Cols: TCols; var Rows: TRows):Boolean;
var SD : TSaveDialog; I : Integer; CSV : TStrings; query, FileName : String; Pfad: string; begin Pfad:=ExtractFilePath(Application.ExeName)+'Daten\'; FileName:=Pfad+'Lieferupload.csv'; //Stringliste erzeugen CSV := TStringList.Create; //Stringliste füllen For I := 0 To Length(Rows[0]) - 1 Do begin CSV.Add(Rows[0,I]+','+ '"'+Rows[1,I]+'"'+','+ '"'+Rows[2,I]+'"'+','+ Rows[3,I]+','+ Rows[4,I]+','+ '"'+Rows[5,I]+'"'+','+ Rows[6,I]+','+ Rows[7,I]+','+ Rows[8,I]+','+ Rows[9,I]+','+ '"'+Rows[10,I]+'"'+','+ Rows[11,I]+','+ '"'+Rows[12,I]+'"'+','); end; //CSV speichern CSV.SaveToFile(FileName); Result := True; CSV.Free; end; Hat jemand eine Idee? Vielen Dank Ykcim |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Wieso sind das eigentlich Var-Parameter? Und Deine Schleife verstehe ich nicht, wenn ich ehrlich bin.
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
HalloDeddyH,
vielen Dank für Deine Antwort. Was meinst Du mit VAR-Parametern? Das sind Variablen, die deklariert werden...:?: In der Schleife wird aus dem zweidimensionalen Array eine TStringList befüllt, aus welche ich dann als CSV-Datei abspeichere. Der Witz ist, dass der Fehler passiert, bevor eigentlich irgendetwas mit der TStringList oder dem Array gemacht wird... Ich habe die Anweisung zur Ermittlung des Pfads jetzt unterhalb der Schleife positioniert, da wo er auch gebraucht wird. (Ich mag es lieber, wenn ich Pfade zu ANfang einer Function ermittel), dann bleibt der Fehler aus. Jedenfalls wirkt er sich nicht mehr so stark aus, denn jetzt wird das "Feld" 223 in der "zweiten Spalte" leer und nicht mit dem Pfad bestückt. Vorher stand in dem Feld eine Information, die mir dadurch verloren geht, aber ich bekomme bei meinem loadinfile (kommt in der nächsten Procedure) keinen Fehler mehr... Warum wird an dieser Stelle mein Array verändert??? Vielen Dank Ykcim |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Du übergibst durch die Var-Deklaration Deine Arrays by Reference. Laut Code ist das aber unnötig, da Du die Originalwerte ja nicht innerhalb der Routine ändern willst. Du könntest einmal das Var durch Const ersetzen, das erscheint mir sinnvoller. Und wie sind TCols bzw. TRows deklariert? Irgendwie habe ich das Gefühl, dass Deine Indizes nicht stimmen.
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Zitat:
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Moin
Ich kenn solche Fehler auch, in dem Delphi was in Speicherstellen reinschreibt, was da nicht hingehört... Dies ist sie Stelle wo das entstandene Problem nach oben poppt... nicht der eigendliche auslöser... Möglich, ist das ein früherer Fehler in deinem Programm (ohne eine Exception zu werfen) zu diesem komischen Verhalten führt. oder es ein speicherverwaltungs problem in Delphi ist .... Hmm...:gruebel: Wenn der Wert OK ist, direkt befor es in die Procedure geht, spricht einiges dafür das Delphi daran beteiligt ist... Ich hab das verhalten bei einigen Dynamischen Array´s beobachtet... und mir dardurch geholfen , Objekte anstant Datentypen oder Record´s zuverwenden. |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Zitat:
und wenn sich Variablen gegenseitig überschreiben, dann sind meist Pointer (dyn.arrays) beteiligt, die in die Botanik zeigen. Jetzt solltest Du z.B. die Bereichsprüfung und Konsorten aktivieren. Ich wette da ist irgendetwas faul. Gruß K-H |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Außerdem wird das übergebene "Cols" innerhalb Deiner Routine gar nicht verwendet.... :roll:
Gruß blauweiss |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Zitat:
Grüße, Messie |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
So wie ich das verstehe ist Rows ein 2-dimensionales Array in der Art [Zeile, Spalte]. Wenn dem so ist, dann ist die Schleife definitiv falsch, da ja damit "diagonal" gelesen wird. IMO müsste das stattdessen ungefähr so aussehen:
Delphi-Quellcode:
for i := Low(Rows) to High(Rows) do
begin s := ''; for j := Low(Rows[i]) to High(Rows[i]) do //String zusammensetzen s := s + Rows[i, j] + ','; Stringliste.Add(s); end; |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
noch etwas Spekulatius:
hinter TRows könnte sich eine Tlist verbergen, der man teilweise die Daten geklaut hat??? Gruß K-H |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Was könnte dir weiterhelfen? (um beim Thema zubleiben)
Du kannst nur verschiedenes Durchprobieren... - Das Gesamte Objekt in die Procdure rein geben? - mal das ganze auserhalb der Procdure ausprobieren? (nicht schön, aber wenn es funzt...) - mal ein Communikations-Objekt fütter und in die Procdure rein geben ... Puhhh :glaskugel: den fehler in der Anwendung finden oder im Compiler wäre die Lösung, aber beides scheind mir schwirig zu sein... |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Hallo Zusammen,
vielen Dank für die rege Beteiligung der Fehlersuche!!! Finde ich stark! :-D Also das Array sieht wie folgt aus (ja, es verbirgt sich hinter den Cols and Rows):
Delphi-Quellcode:
Das Ganze ist dann wie eine Tabelle anzusehen, mit Daten, die aus einem MySQL Server kommen...
type
TRows = array of array of string; // [Cols, Rows] TCols = array of string; Cols wird tatsächlich nicht verwendet in der Function, aber ich übergebe immer die "ganze" Tabelle, daher immer Cols and Rows... Cols sind die Spalten (wie in Excel "A", "B", "C";...) Rows sind die Zeilen (wie in Excel 1, 2, 3, ...) In der Schleife werden die Daten an das TStringList übergeben, mit jeweils den " um einen Text kenntlich zu machen. Diese Information benötige ich, wenn ich die Daten der *.csv Datei wieder in den MySQL-Server schicke. Ich habe davon in diesem Programm noch drei weitere Stellen, wo zwei identische (Anzahl der Spalten mit anderen " Informationen) tadellos funktionieren... Die Suche nach dem Fehler wird durch den Umstand, dass das Array aus ca. 50.000 Datensätzen besteht nicht erleichtert. Der Fehler tritt immer an der selben Stelle auf (Spalte 2, Zeile 223). Ich hoffe, damit ein paar Informationslöcher gestopft zu haben... Vielen Dank Ykcim |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
dann müsste der Zugriff folgendermaßen funktionieren ...
Delphi-Quellcode:
var
col,row:Integer; s:String; begin SetLength(Rows,10,10); For col := Low(Rows) to High(Rows) do For Row := Low(Rows[col]) to High(Rows[col]) do Rows[col,row] := IntToStr(col) + '_'+IntToStr(row); For col := Low(Rows) to High(Rows) do For Row := Low(Rows[col]) to High(Rows[col]) do begin if Row=High(Rows[col]) then s := s + Rows[Col,Row] + #13#10 else s := s + Rows[Col,Row] + ',' end; Showmessage(s); end; |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Hatte ich das nicht bereits so ähnlich geschrieben?
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
@DeddyH
jepp, sorry, habe die #10 gerade erst gesehen .... |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Schön, daß mal jemand das SetLength explizit nutzt, bleibt die Frage ob Ykcim es auch nutzt??
Gruß K-H |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Aber wenn, dann außerhalb der gezeigten Routine, schließlich sind das Var-Parameter. Wäre ja blöde, wenn die anders wieder rauskommen, als sie reingekommen sind ;)
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Ich glaube sowas ähnliches ist da passiert.
Er wäre nicht der Erste der sich seine dyn. Datenstrukturen zerschießt. Gruß K-H |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Also sagen wir den Standardsatz: "Zeichma mehr Kot" :-D
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Zu Testzwecken kannst du auch aus allen (!) Arrays vorübergehend Statische machen, mit genau den passenden Werten und die Setlength auskommentieren, und wie schon gesagt wurde, die Bereichsprüfung ect. einschalten. Dann siehst du, wo’s knallt. Vermutlich irgendwo Zeilen- und Spaltenindex vertauscht oder ein Index kleiner Null bzw. größer Count-1. Und nenn das Ding vielleicht TGridArray, TRows ist definitiv verwirrend.
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Oder wie schon gesagt die Parameter nicht als Var deklarieren und auf das Array wie von Bummi und mir gezeigt zugreifen. Wobei man sich überlegen könnte, Cols als statisches Array zu deklarieren, da anscheinend immer die gleiche Elementanzahl vorausgesetzt wird.
|
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Hallo Zusammen,
ich habe jetzt noch nicht alle Tips ausprobiert. Werde das Thema morgen angehen und Berichten. Aber kann mir jemand noch etwas zur Bereichprüfung sagen und wie ich die aktiviere. Ich habe die noch nie verwendet. @DeddyH: Der Tip mit den Const hat leider nicht funktioniert - der Eintrag wird dennoch verändert... Gute Nacht - bis morgen - ich mach jetzt Feieradend Ykcim |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Hab grad kein TDE zur Hand, aber
Menü > Projekt > Optionen > Compilieren > Laufzeitfehler > Bereichsprüfung Oder über einen Kompilerschalter (welchen ich hier schonmal genannte hatten) im Quellcode, also in der/den Unit(s), wo es benötigt wird. |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Ich habe mal eine Mini-Demo erstellt, läuft einwandfrei (nur ein Memo und ein Button auf der Form):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type TSpalten = array [1 .. 3] of string; TZeilen = array of TSpalten; var Zeilen: TZeilen; i: integer; s: string; begin (* Dimensionieren *) SetLength(Zeilen, 10); try (* und befüllen *) for i := Low(Zeilen) to High(Zeilen) do begin Zeilen[i, 1] := Format('Feld1 - %d', [i + 1]); Zeilen[i, 2] := Format('Feld2 - %d', [i + 1]); Zeilen[i, 3] := Format('Feld3 - %d', [i + 1]); end; (* Nun auslesen und in Memo ausgeben *) Memo1.Lines.BeginUpdate; try Memo1.Lines.Clear; for i := Low(Zeilen) to High(Zeilen) do begin (* Statisches Array -> Direktformatierung ohne Probleme *) s := Format('"%s",%s,"%s"', [Zeilen[i, 1], Zeilen[i, 2], Zeilen[i, 3]]); Memo1.Lines.Add(s); end; finally Memo1.Lines.EndUpdate; end; finally (* Aufräumen *) SetLength(Zeilen, 0); end; end; |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Zitat:
Mir scheint dass dein gesamter Ansatz völlig umständlich ist. Es gibt Komponenten, die eine sogenannte Memory-Table oder auch Memory-Dataset nachbilden. Das heisst, du kannst selbst Felder mit Namen und Datentyp (string, integer, Boolean,...) definieren und so viele Datensätze einfügen wie der Hauptspeicher hergibt. Das Speichern der Daten als CSV-Datei und später erneute Laden aus der CSV-Datei ist sehr einfach zu bewerkstelligen. Auch das Löschen,Ändern und Anzeigen von Datensätzen ist total einfach (du brauchst dazu nur ein TDataSource und ein TDBGrid bzw. TDBEdits). Also ich würde an deiner Stelle den Code wegwerfen und die Sache mit Hilfe einer Memory-Table angehen. PS: du kannst auch nach best. Feldern Sortieren, Filtern und Suchen |
AW: Fehler: Unkontrollierter Übertrag von Daten in ein Array
Hallo Zusammen,
ich habe gerade die Bereichsprüfung aktiviert und keinen Fehler bekommen. Das mag daran liegen, dass der Fehler nicht mehr auftritt. Das habe ich aber erst danach bemerkt... Gestern ist er jedes Mal zuverlässig aufgetreten. Ich hatte gestern Abend noch an einem anderen Fehler gearbeitet, der in der vorgelagerten Procedure steckte und dafür sorgte, dass mein Programm nur einmal durchlief und danach immer Fehler machte. Die Ursache war ein falscher Index... Ich habe da zwar keinen Zusammenhang gesehen, aber auch in der Version von gestern Abend funktioniert es jetzt. Daher kann / brauche ich jetzt erst einmal nicht weiter zu suchen. Ich möchte mich an dieser Stelle für die tolle Unterstützung bedanken! VIELEN DANK Ykcim |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz