Flushmem verändert Referenz

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

billykater

Betreff: Flushmem verändert Referenz

BeitragDo, Sep 08, 2005 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Flushmem ändert die Referenz auf eine Variable innerhalb eines Arrays

Field m_Register:TVM_Variable[]
wird mit new TVM_Variable[64] initialisiert
TVM_Variable hat eine ToString() Methode

Nach ein paar aufrufen von Flushmem steht plötzlich nur in dem m_Register[7] eine Refernz auf eine TList alle Elemente stimmen noch
Code: [AUSKLAPPEN]

Print m_Register[7].ToString()
FlushMem()
Print m_Register[7].ToString() '<- Hier stürzt er ab im debugger steht hier drinnen jetzt TList



Der gesamte Code dafür ist ca. 800 Zeilen lang wer den sehen will dem sende ich das ganze.
Wie schon oben erwähnt das passiert nicht beim ersten Aufruf von Flushmem sondern irgendwann später. Gibts dafür auch allgemeine Tipps?

Markus2

Betreff: Re: Flushmem verändert Referenz

BeitragFr, Sep 09, 2005 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
billykater hat Folgendes geschrieben:
Flushmem ändert die Referenz auf eine Variable innerhalb eines Arrays

Field m_Register:TVM_Variable[]
wird mit new TVM_Variable[64] initialisiert
...


Kannste das nicht so machen ?
Field m_Register:TVM_Variable[64]
for i=0 to 63
m_Register[i]= new TVM_Variable
next


new TVM_Variable[64] <- finde ich falsch

Jolinah

BeitragFr, Sep 09, 2005 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht schon, ist für dynamische Arrays, wenn man zu Beginn noch nicht weiss wie gross sie werden.

Code: [AUSKLAPPEN]

Type MyType
  Field a
End Type

Local a:MyType[]
Local size = 100
a = new MyType[size]

For Local i = 0 to size-1
  a[i] = new MyType
Next


Allerdings wird da nur das Array erstellt, die einzelnen Objekte müssen nach wie vor Manuell erzeugt und zugewiesen werden.
 

billykater

BeitragFr, Sep 09, 2005 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Die einzelnen Felder hab ich mit so einer Schleife initialisiert ,OK hätte ich vielleicht dazuschreiben sollen.
Alles funktioniert auch Perfekt bis dann irgendwann nach zig aufrufen von flushmem und der selben Funktionen plötzlich in diesem einen Feld etwas anderes drinnen steht.
Hatte jemand schonmal so ein ähnliches Problem?
 

Dreamora

BeitragSa, Sep 10, 2005 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich nicht.
Hast du etwas am Feld oder Array geändert, dass zu einer "unnötigen" referenz geführt hätte, die ausradiert werden konnte? (vielleicht den Array dynamisch kleiner gemacht und danach wieder grösser und vergessen die felder wieder zu initiliasieren?)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

billykater

BeitragSa, Sep 10, 2005 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab den Fehler weiter eingegrenzt.

er tritt auf nachdem ich
Code: [AUSKLAPPEN]


Method Pop(v:TVM_Variable Var)
       v = TVM_Variable(m_Stack.removeLast())
End Method

var:TVM_Variable
.......

Pop(var)

Print var.ToString() <- Hier geht noch
FlushMem()
Print var.ToString() <- Hier stürzt er ab


Wenn ich statt dem Funktionsaufruf direkt
Code: [AUSKLAPPEN]

var = TVM_Variable(m_Stack.removeLast())

schreibe gibt das eine Endlosschleife die aber glaube ich nicht daran liegt

€:
Die Endlosschleife war ein anderes Problem.
Das wirkliche Problem war der Aufruf von Pop: dadurch hat er immer die Referenz bei Flushmem geändert.
Den Fehler konnte ich bis jetzt noch nicht reproduzieren.
  • Zuletzt bearbeitet von billykater am Sa, Sep 10, 2005 14:33, insgesamt einmal bearbeitet

Jolinah

BeitragSa, Sep 10, 2005 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Code: [AUSKLAPPEN]
Print var.ToString() <- Hier stürzt er ab


Könnte var Null sein? Das würde den Absturz erklären Wink In der Hilfe steht zwar dass RemoveLast() eine Exception auslöst wenn keine Elemente mehr in der Liste sind.
 

billykater

BeitragSa, Sep 10, 2005 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Entschuldigung hab bei meinem letzten Code einen kleinen Fehler gemacht.

So sollte es richtig lauten
Code: [AUSKLAPPEN]


Pop(var)

Print var.ToString() <- Hier gehts noch
FlushMem()
Print var.ToString() <- Hier stürzt er ab


Der Debugger sagt zu var dann eine elendslange Liste mit DumpObject@adresse und Type Object,Type TList.
Dazu zeigt noch den Inhalt von Self an(Der ganze Code steht in einem Type)

Wenn ich den Code statt in der Pop Funktion direkt ausführe hat er keine Probleme damit also ist insofern das Problem gelöst. Wäre aber nützlich zu wissen wieso FlushMem() da die Variable löscht
 

Dreamora

BeitragSa, Sep 10, 2005 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
*rauseditiert da nur blubb. War wohl mit den gedanken noch zu sehr beim ersten Post und Arrays*

Erzeug ein kleines Beispiel, das lauffähig ist und das Problem beinhält.
Wobei ich glaube, dass du bei dem Versuch einfach über einige Fehler in deinem Code stolpern wirst, die das Problem verursachen.

PS: gibts irgend einen sinnvollen Grund warum du Var benutzt? Var dient eigentlich nur dazu bei einer Funktion mehr als eine Rückgabe zu haben oder man eine dynamische Rückgabe auf Basis verschiedener Types hat.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Sa, Sep 10, 2005 17:22, insgesamt einmal bearbeitet

Jolinah

BeitragSa, Sep 10, 2005 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
machst irgendwelche komische klammern *TVM_Variable(m_Stack.removeLast()) was es garnicht gibt


TVM_Variable( ) castet das Objekt was m_Stack.removeLast() zurück gibt.

Aber wie gesagt, statt Var kannst du ja auch einfach
Code: [AUSKLAPPEN]
Return TVM_Variable(m_Stack.removeLast())


benutzen. Mit Var müsste es zwar auch funktionieren, schon komisch das Flushmem das Objekt löscht.
 

Dreamora

BeitragSa, Sep 10, 2005 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du in dem Programm strict drin oder nicht?
*BM läuft in bezug auf Variablengültigkeit etc sehr unterschiedlich in den beiden Modi*
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

billykater

BeitragSa, Sep 10, 2005 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Strict hab ich verwendet und wenn ichs auf Return umschreibe funktionierts auch.
Inzwischen hab ich das mit der Funktion komplett weggelassen. Ist wahrscheinlich von der Performance sowieso besser

Suco-X

BeitragSa, Sep 10, 2005 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Und jetzt noch einen tollen Beispielcode zum testen für jedermann (Ausführbar und Problem dokumentiert), damit wir dein Problem nicht 3 Tage lang erraten müssen, sondern erkennen können wo es genau dran liegt. Ich dachte Dreamora hätte das schon klar gemacht.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

billykater

BeitragSo, Sep 11, 2005 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hab jetzt zumindestens versucht ein Beispiel zu machen. Wie man unschwer am Code erkennen kann soll das eine Virtual Machine werden.
Bin jetzt nur über einen neuen Fehler gestolpert.

der Code zwischen Zeile 84 und 97 wird 2 mal ausgeführt.
Alles Weitere steht in der Readme.
Einfach die Exception missachten und den Output ansehen.
http://rapidshare.de/files/496...g.rar.html

Falls dieser Fehler behoben wird (oder bei euch gar nicht auftritt) kann man gleich testen indem man Zeile 51,52 das ' weggibt das sollte dann mein ursprünglichen Problem zeigen.
 

Dreamora

BeitragSo, Sep 11, 2005 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bekomme die gleiche Ausgabe.
Allerdings sehe ich auch nicht was daran falsch sein sollte um ehrlich zu sein. Du hast am Anfang zweimal TCode.Push also muss 2x der gleiche Code rauskommen.
Da ist also kein Fehler

Die Exception ist übrigens nicht aus Spass da. Vielleicht solltest du erst Mal das Problem bebehen mit einer simplen Anfrage, bevor du dich um andere Probleme kümmerst. Denn solange das nicht fehlerfrei läuft kannst du theoretisch uneingeschränkt viele Fehler "verpassen".
Solange die exception kommt kann man das Problem mit zeile 52/53 gar nicht erst überprüfen weil er schon zu Beginn von POP in die Exception rennt!
(kein wunder, da der stack leer ist und somit auch nix entfernt werden kann)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

billykater

BeitragSo, Sep 11, 2005 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code der bei mir komisch ist ist ziemlich am Ende das hier

Code: 1
Begin
2
Ende
Flush
Begin
2
Ende
Begin
Ende
Flush
Begin
Ende

<- Im gleichen Funktionsaufruf führt er das 2 mal aus und löscht gleichzeitig ein Element aus TList.
Sieh nach nach dem Select kann man so viele Prints reinmachen wie man will die werden immer 2* ausgeführt
 

Dreamora

BeitragMo, Sep 12, 2005 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
???

Da steht
Code X
Begin
Ende
FLUSH
Begin
Ende


Und wenn man den code ansieht, sieht man, dass da eine Loop mit Prints ist, dann Print flush und dann nochmal eine Loop. Also wie gewollt.

Das andere was du da hast, habe ich nicht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

billykater

BeitragMo, Sep 12, 2005 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das mal auf einem anderen PC getestet und da kommt das gleiche raus.

Hier noch ein Screenshot mit dem Problem. Das übrigens auch die Exception auslöst.

http://rapidshare.de/files/5013856/Fehler.jpg.html

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group