Flushmem verändert Referenz
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
billykaterBetreff: Flushmem verändert Referenz |
Do, Sep 08, 2005 15:13 Antworten mit Zitat |
|
---|---|---|
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? |
||
Markus2Betreff: Re: Flushmem verändert Referenz |
Fr, Sep 09, 2005 12:42 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Sep 09, 2005 12:53 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Sep 09, 2005 14:04 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Sep 10, 2005 10:00 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Sep 10, 2005 11:33 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Sep 10, 2005 13:10 Antworten mit Zitat |
|
---|---|---|
Zitat: Code: [AUSKLAPPEN]
Print var.ToString() <- Hier stürzt er ab Könnte var Null sein? Das würde den Absturz erklären In der Hilfe steht zwar dass RemoveLast() eine Exception auslöst wenn keine Elemente mehr in der Liste sind. |
||
billykater |
Sa, Sep 10, 2005 14:32 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Sep 10, 2005 14:36 Antworten mit Zitat |
|
---|---|---|
*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 |
Sa, Sep 10, 2005 17:15 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Sep 10, 2005 17:24 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Sep 10, 2005 18:58 Antworten mit Zitat |
|
---|---|---|
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 |
Sa, Sep 10, 2005 19:21 Antworten mit Zitat |
|
---|---|---|
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 |
So, Sep 11, 2005 11:20 Antworten mit Zitat |
|
---|---|---|
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 |
So, Sep 11, 2005 18:53 Antworten mit Zitat |
|
---|---|---|
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 |
So, Sep 11, 2005 22:01 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Sep 12, 2005 12:47 Antworten mit Zitat |
|
---|---|---|
???
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 |
Mo, Sep 12, 2005 15:15 Antworten mit Zitat |
|
---|---|---|
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 |
||
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group