Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Globale Variable wird überschrieben (https://www.delphipraxis.net/126733-globale-variable-wird-ueberschrieben.html)

Draos 1. Jan 2009 12:33


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:
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;
Schon mal danke im Vorraus :)

Reinhard Kern 1. Jan 2009 12:43

Re: Globale Variable wird überschrieben
 
Zitat:

Zitat von Draos
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.
...

Hallo,

watt is term? Wenn term z.B. ein Objekt ist, übergibtst du in jedem Fall nur die Adresse davon, keine Kopie.

Gruss Reinhard

Draos 1. Jan 2009 12:45

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;

hoika 1. Jan 2009 12:50

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

Draos 1. Jan 2009 12:53

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));

Draos 1. Jan 2009 12:55

Re: Globale Variable wird überschrieben
 
var? was macht das var bei funtion Parameter?

Gut selbst damit gibt es den selben Fehler :(

Reinhard Kern 1. Jan 2009 13:04

Re: Globale Variable wird überschrieben
 
Zitat:

Zitat von Draos
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;

Hallo,

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

Draos 1. Jan 2009 13:07

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)

hoika 1. Jan 2009 13:50

Re: Globale Variable wird überschrieben
 
Hallo,

der Code ist ein einziges Wirrwarr ... ;)

Delphi-Quellcode:
with Term[index] do
begin
  if x[i]=v then
    Term[index].x[i]:=FloatToStr(y);
end;
mal schreibst du das Term[index], mal nicht, wieso ?
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

Reinhard Kern 1. Jan 2009 13:55

Re: Globale Variable wird überschrieben
 
Zitat:

Zitat von Draos
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)

Hallo,

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 17:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz