![]() |
Globale Variable wird überschrieben
Als erstes nen frohes neues Jahr. Konnte das folgende Problem leider nicht im alten lösen :wall:
Folgendes Problem: Ich gebe der Funktion Insert eine globale Variable (soll nicht überschrieben werden, deswegen wird diese Extra übergeben). Mein Problem liegt bei der procedure Replace. Diese ändert aus einen mir unbekannten Grund sowohl die Variable Term als auch die globale Variable, die bei Term übergeben wurde. Zur Info ist ein Programm was Terme vereinfachen soll.
Delphi-Quellcode:
Schon mal danke im Vorraus :)
function Insert(Term:tFkt;const v:char;const y:Extended):String;
procedure Replace(index:Integer); var i :Integer; begin with Term[index] do begin if Length(x)>0 then for i:=0 to Length(x)-1 do if x[i]=v then Term[index].x[i]:=FloatToStr(y); if Length(Terms)>0 then for i:=0 to Length(Terms)-1 do Replace(Terms[i]); end; end; begin Replace(0); //... end; |
Re: Globale Variable wird überschrieben
Zitat:
watt is term? Wenn term z.B. ein Objekt ist, übergibtst du in jedem Fall nur die Adresse davon, keine Kopie. Gruss Reinhard |
Re: Globale Variable wird überschrieben
Term ist ein Array einer Struktur vom Typ her.
Delphi-Quellcode:
tTerm =record
x :array of String; //Value op :Byte; First :Byte;//1->x//2->Terms Terms :array of Integer; end; |
Re: Globale Variable wird überschrieben
Hallo,
< Ich gebe der Funktion Insert eine globale Variable > aha, wie heisst die denn, v oder y ? In deiner Methode ist also ein Bug, nach deinem Datentypen ist es eine Speicherüberschreibung Warum übergibst du eine globale Variable extra ? Setze mal einen Breakpoint auf den Anfang deiner Prozedur, starte das Programm, setze einen Watchpoint auf die glob. Variable, zusätzlich das "Bei Änderung anhalten" (klappt nur im laufenden Betrieb, muss also bei jeden Programmstart neu gesetzt werden). Ausserdem muss es doch function Insert(var Term:tFkt;const v:char;const y:Extended):String; oder ist das fehlende var Absicht ? Heiko |
Re: Globale Variable wird überschrieben
Ich übergebe sie Extra, weil die globale Variable nicht geändert werden soll und ich später das Programm erweitern will mit verschiedenen solcher Variablen.
Nach der Funktion Replace ist nicht nur Term sondern auch die globale Variable überschrieben. Hier mal die Übergabe vllt hilft diese weiter.
Delphi-Quellcode:
eOutInsert.Text:=Insert(Funktion,'x',StrToFloat(eInsert.text));
|
Re: Globale Variable wird überschrieben
var? was macht das var bei funtion Parameter?
Gut selbst damit gibt es den selben Fehler :( |
Re: Globale Variable wird überschrieben
Zitat:
das ist kein Record fester Grösse (und kann daher nicht einfach kopiert werden z.B. mit Move). Ich gehe davon aus, dass tTerm immer als Adresse übergeben wird, anders gesagt, es spielt keine Rolle, ob du es übergibtst oder direkt verwendest. Das stimmt ja mit deinen Beobachtungen überein. Anders wäre es wahrscheinlich, wenn es heissen würde x : array [0..7] of string[255] usw. Gruss Reinhard |
Re: Globale Variable wird überschrieben
Hab mal geschaut richtig die beiden haben die selbe Adresse. Wie kann ich das ändern? (Nein ich setze bei den record keine festen Größen nur wenns wirklich nicht anders geht)
|
Re: Globale Variable wird überschrieben
Hallo,
der Code ist ein einziges Wirrwarr ... ;)
Delphi-Quellcode:
mal schreibst du das Term[index], mal nicht, wieso ?
with Term[index] do
begin if x[i]=v then Term[index].x[i]:=FloatToStr(y); end; Warum übergibst du Extended, was aus einem String erzuegt wird, um es danach wieder in einen String umzuformen ? benutze F2, F7, F8, Ctrl+F7. Was kommt denn bei meinem "Bei Änderung anhalten" raus ? Falls der Fehler immer noch autritt. Bsp-Programm erzeugen, was 1. genau und nur genau den Fehlercode beinhaltet 2. alle benötigten Variablen schon setzt (dazu gehört z.B. ein eInsert.text:= 'XXX' im FormCreate) 3. hoffen das jemand da durchblickt und hilft ... Heiko |
Re: Globale Variable wird überschrieben
Zitat:
dann hast du eben keinen simplen Record, sondern ein komplexes Objekt. Um das überhaupt kopieren zu können, müsstest du einen Copy-Operator dafür schreiben oder zumindest eine Copy-Prozedur. Die müsste aber die enthaltenen Objekte, die ja auch keine feste Grösse haben, ebenfalls kopieren, sozusagen rekursiv. Für Strings und Arrays gibt es die Funktion Copy, siehe Hilfe. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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