AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Globale Variable wird überschrieben

Ein Thema von Draos · begonnen am 1. Jan 2009 · letzter Beitrag vom 1. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Draos

Registriert seit: 12. Aug 2008
42 Beiträge
 
Delphi 7 Enterprise
 
#1

Globale Variable wird überschrieben

  Alt 1. Jan 2009, 12:33
Als erstes nen frohes neues Jahr. Konnte das folgende Problem leider nicht im alten lösen

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
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#2

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 12:43
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
  Mit Zitat antworten Zitat
Draos

Registriert seit: 12. Aug 2008
42 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 12:45
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;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 12:50
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
Heiko
  Mit Zitat antworten Zitat
Draos

Registriert seit: 12. Aug 2008
42 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 12:53
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.

eOutInsert.Text:=Insert(Funktion,'x',StrToFloat(eInsert.text));
  Mit Zitat antworten Zitat
Draos

Registriert seit: 12. Aug 2008
42 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 12:55
var? was macht das var bei funtion Parameter?

Gut selbst damit gibt es den selben Fehler
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#7

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 13:04
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
  Mit Zitat antworten Zitat
Draos

Registriert seit: 12. Aug 2008
42 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 13:07
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)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 13:50
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
Heiko
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#10

Re: Globale Variable wird überschrieben

  Alt 1. Jan 2009, 13:55
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
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