![]() |
Änderung einer Variablen bewirkt Änderung des Feldinhalts
Hallo,
bei einem Delphi-Programm ist mir neulich ein merkwürdiger Fehler aufgefallen. Wenn ich den Inhalt einer String-Variablen ändere, ändert sich in einem dynamischen Array, was mit dieser Variablen nicht zu tun hat, der Inhalt eines Elements. Dies führt im weiteren Ablauf zu Schreibfehlern u.a.. Ist jemandem schonmal das Problem so oder ähnlich aufgefallen? Vielen Dank schonmal für eure Antworten! |
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Hört sich nach nicht sauberer Speicherverwaltung an ... getmem, freemem, irgendwie sowas.
|
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Das wäre eine Idee.
Ich habe mittlerweile irgendwie das Gefühl, das der Speicher, der dem Programm zugewiesen wird nicht ausreicht. Gibt es da Grenzen? Das Feld in dem die unbeabsichtigten Änderungen auftreten ist recht groß..., es dient als Zwischenspeicher für den Inhalt einer Textdatei. Dazu kommen noch ein paar kleinere Felder für Zwischenergebnisse der Suchen innerhalb des großen Feldes. |
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
In der Delphi-Hilfe zu Stringtypen steht:
Zitat:
|
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Ich habe mich etwas verwirrend ausgedrückt. Mit Strings arbeitet das Programm kaum. Und die entsprechenden Längen werden immer eingehalten.
Die Textdatei ist eine csv-Datei, deren Inhalt beim Einlesen in ein Feld aus Records einsortiert wird. In dem Record kommen verschiedene Datentypen vor. Besagtes Feld besitzt 1200 Elemente. Der Fehler tritt immer bei einem Integerwert in Element 156 auf. |
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Kannst du die relevanten Codeschnipsel posten, vielleicht fällt mir ja was auf, denn wenn Du an irgendeine Speichergrenze stoßen solltest, müsste das eher einen "out of memory"-Fehler verursachen und keine falschen Inhalte liefern.
|
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Also der Fehler tritt an der folgenden Stelle auf:
Delphi-Quellcode:
Dabei ist "Zählung" die Größe des Feldes "AusFeld", mit welchem hier gearbeitet wird. Die Strings sind lokale Variablen. Das große Feld, welches ich in einem vorherigen Post erwähnte, Name "Speicher", wird hier nicht verwendet, aber dennoch verändert.
for i := 0 to Zaehlung - 1 do
begin AusFeld[i].iSchrank := FeldPlatz[i].SchrankNr; AusFeld[i].iAusschub := FeldPlatz[i].AusschubNr; AusFeld[i].iFach := FeldPlatz[i].FachNr; AusFeld[i].iTuete := FeldPlatz[i].PackNr; AusFeld[i].iStueckTuete := FeldPlatz[i].Stueck; AusFeld[i].Datum := FeldPlatz[i].Datum; // In diesem Abschnitt tritt der Fehler auf 14.05.2013 if (AusFeld[i].iFach >= 0) and (AusFeld[i].iFach < 10) then sHelp1 := '000' + IntToStr(AusFeld[i].iFach); if (AusFeld[i].iFach > 9) and (AusFeld[i].iFach < 100) then sHelp1 := '00' + IntToStr(AusFeld[i].iFach); if (AusFeld[i].iFach > 99) and (AusFeld[i].iFach < 1000) then sHelp1 := '0' + IntToStr(AusFeld[i].iFach); if AusFeld[i].iFach > 999 then sHelp1 := IntToStr(AusFeld[i].iFach); if (AusFeld[i].iTuete >= 0) and (AusFeld[i].iTuete < 10) then sHelp2 := '0000' + IntToStr(AusFeld[i].iTuete); if (AusFeld[i].iTuete > 9) and (AusFeld[i].iTuete < 100) then sHelp2 := '000' + IntToStr(AusFeld[i].iTuete); if (AusFeld[i].iTuete > 99) and (AusFeld[i].iTuete < 1000) then sHelp2 := '00' + IntToStr(AusFeld[i].iTuete); if AusFeld[i].iTuete > 9999 then sHelp2 := IntToStr(AusFeld[i].iTuete); AusFeld[i].Barcode := sHelp1 + sHelp2; end; |
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Liste der Anhänge anzeigen (Anzahl: 1)
Hast du einmal Bereichsüberprüfung zur Laufzeit eingeschaltet (ist zumindest in meinem RAD Studio XE2 in der Debug-Konfiguration komischerweise standardmäßig aus)? Vielleicht geht ja da etwas über den Index hinaus und verändert Daten in Strukturen, die zufälligerweise im Speicher direkt daneben liegen...
|
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Ändert sich hiermit etwas?
Delphi-Quellcode:
for i := Low(AusFeld) to High(AusFeld) do
|
AW: Änderung einer Variablen bewirkt Änderung des Feldinhalts
Interessant wäre noch der Abschnitt, indem Du die Größe des ?Array of Record? zuweist, setlength oder wie machst du das?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 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