Bug?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Macintosh

Betreff: Bug?

BeitragMo, Sep 06, 2010 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi. Ich habe so vormich dahinngecodet und habe beim testen gemerkt, dass 2 variablen (Objekte) immer den gleichen wert hatten, obwohl ich das nirgendwoh so geschrieben habe.
Ich habe ewig gebraucht, bis ich durch probieren drauf gestoßen bin.

Ich habe 2 variablen. Frame1 und Frame2.
In einer Methode wird beiden das selbe Objekt zugewiesen, doch das Problem ist, das beide variablen ab da immer gleich wahren. Hat sich die eine verändert so tt es die andere auch und das ist echt misst, Vorallem weil man auf sowas beim debugen nichtnkommt.

Die Methode:

Code: [AUSKLAPPEN]

method setFrame( Frame:CRect )

Self.frame1 = Frame
Self.Frame2 = Frame

ebdmethod


sobald ich mit dieser Methode den beiden variblen das Objekt übergeben habe sind sie für immer syncron.

Ist das ein Bug?
Gelöst habe ich das Problem, indem ich stat 2 mal das gleiche Objekt zu übergeben, jeder variable ein eigenes Objekt und es funktioniert.

Intern Sind das ja sicher alles Pointer...

Danke

Xeres

Moderator

BeitragMo, Sep 06, 2010 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Beide Variablen zeigen dann auf das selbe CRect-Objekt. Wenn du dieses Objekt veränderst, greifst du mit frame1 und frame2 immer noch auf das selbe Objekt zu. BlitzMax kopiert nie Objekte, sondern referenziert immer. So arbeitet BlitzMax immer und so darf man es erwarten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

D2006

Administrator

BeitragDi, Sep 07, 2010 6:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal zur deutlichen Betonung: KEIN BUG sondern Standardverhalten.

Du musst dich selbst um das Kopieren des Objekts kümmern. Zum Beispiel in dem du eine geeignete Methode für den Type schreibst. Oder mit dem Modul ChaosClone, was auch komplexere Types relativ einfach kopieren kann.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

Macintosh

BeitragDi, Sep 07, 2010 10:31
Antworten mit Zitat
Benutzer-Profile anzeigen
naja... aber ich verändere ja NICHT das object, das zugewiesen wurde sondern entweder frame1 oder frame2
und das dürfte keine auswirkung auf das rect und keine auswirkung auf den anderen frame haben.



BlitzMax: [AUSKLAPPEN]


'das als argument übergeben CRect wird NIE verändert.

Method SetFrame( frame:CRect )

frame1 = frame
frame2 = frame

EndMethod


'wenn ich jetzt frame1.x = 10 mache üernimmt frame2 das genauso

  • Zuletzt bearbeitet von Macintosh am Di, Sep 07, 2010 10:38, insgesamt einmal bearbeitet

Goodjee

BeitragDi, Sep 07, 2010 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
aber frame1 ist das objekt...genau wie frame2

frame1=objekt
frame2=objekt
objekt.irgendeinFeld=2

jetzt ist frame1.irgendeinfeld=2 und bei frame2 genauso
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Ana

BeitragDi, Sep 07, 2010 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Als ich mit dem OOP in Berührung kam musste ich mir folgende Geschichte zum Thema pointer anhören, okay ich kam mir ein wenig verlabert vor, aber immerhin hab ichs dann verstanden. Also fühl dich nicht angegriffen sondern erfreue dich der Niedlichkeit der kleinen Geschichte. Also folgendes:

Es war mal ein Objekt, es hatte von seinem Konstruktor viele aufregende Werte bekommen und freute sich schon darauf ein wichtiger Teil eines Programms zu sein. Es lebte im Hauptspeicher, wo es genug Platz hat für all seine wichtigen Werte. Nach einigen Sekunden, was für Daten schon sehr lange ist, wunderte es sich warum nie jemand vorbei kam und seine Werte abfragte, es dachte lange nach und fragte sich wie andere Objekte das wohl machten. Es würde eines aufsuchen und es fragen, doch wo sind die eigentlich? So entschloss es sich Wegweiser(Pointer) aufzustellen die zu der Stelle führten wo seine Wohnung (Speicheradresse auf dem Hauptspeicher) begann. Und siehe da viele Anfragen kamen und das Objekt war glücklich. Manche andere Objekte kamen auch immer wieder gern vorbei, damit sie nicht immer zum wegweiser laufen mussten und von dort aus zum Objekt, gab es ihnen allen eine Karte (weiterer Pointer diesmal nicht global sondern im Feld eines Objekts) mit. So konnten sie immer zu ihm finden und mussten nicht zum wegweiser.

Wenn du also sagst ändere beim Pointer dies, dann "laufen" die Veränderungen zu unserem Objekt und machen was sie halt so tun sollen, wenn du auf einen anderen Pointer verweist, laufen sie auch zu dem Objekt und tun was sie halt tun.


Lg Ana
 

Macintosh

BeitragDi, Sep 07, 2010 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
kk.. danke an alle. hatte sonst nie wirklich probleme mit oop, finde aber auch, das es in BMax leicht verwirrt, das dort die pointer "versteckt" sind.

Naja... habe mir jetzt für mienen CRect -klasse eine Copy() methode geschrieben. Funzt perfekt.

FireballFlame

BeitragDo, Sep 09, 2010 4:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber in BlitzBasic ist das doch nicht anders?

BlitzBasic: [AUSKLAPPEN]
Type Blub
Field X$
End Type

Local a.Blub = New Blub
Local b.Blub = a

a\X = "test"
Print b\X

WaitKey
End
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

Macintosh

BeitragDo, Sep 09, 2010 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe noch nie BlitzBasic benutzt ^^
nur C, und da siehtman schön was ein pointer ist, und da passieren nicht solche"scgusselfehler"

Noobody

BeitragDo, Sep 09, 2010 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur als Hinweis: Das sind keine Pointer, sondern "Referenzen". Eine Referenz zeigt immer entweder auf ein existierendes Objekt oder auf gar nichts (was mit 'Null' gekennzeichnet wird). Dass eine Referenz auf nicht validen Speicher zeigt, ist nicht möglich, weswegen sie um einiges sicherer sind als Zeiger. Desweiteren kann man mit Referenzen keine Arithmetik und anderen Schabernack betreiben.

BlitzMax hat auch Zeiger, welche aber mit dem Keyword 'Ptr' in Kombination mit einem Datentyp gekennzeichnet werden (Float Ptr, Byte Ptr, etc.). Diese entsprechen den Zeigern aus C/++.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Macintosh

BeitragSo, Sep 12, 2010 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nuja... Kann man aus nem byte-pointer das object bekommen auf das er zeigt?
Wenn bein Sind blitznax pointer ja nicht besonders nutzlich.

Was isr an pointer arithmetic unfug?

mpmxyz

BeitragSo, Sep 12, 2010 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Byte-Pointer zeigen normalerweise auf kein Objekt sondern 'nur' auf Speicherbereiche.
Das ist auch gut so!
Sonst könnte der Garbage Collector von BlitzMax wahrscheinlich Probleme bekommen. (Hinter einen Pointer muss nicht immer ein Objekt stecken. Wie soll man das schnell erkennen können?)
Daher kann man die Umwandlung einer Referenz in einen Byte Pointer nicht mehr rückgängig machen.
Nützlich sind Pointer in BlitzMax trotzdem.
Man braucht sie zwar eher selten in eigenen Programmen, aber bei der Einbindung/Nutzung von sprachlich fremden Bibliotheken braucht man sie nicht selten. (ein Lua-State=ein Byte Pointer, Pixeldaten=ein Byte Ptr, damit man sie einfach an OpenGL/DirectX weitergeben kann)
Das ist wahrscheinlich auch der Grund, warum man Referenzen in Byte-Pointer umwandeln kann. (->Struct-Ersatz)
Pointer-Arithmetik ist bei Objekt-Referenzen Unfug, weil man sich hiermit höchstens Probleme schafft.
Mit der Möglichkeit dafür könnte man sich nie sicher sein, ob eine Referenz gültig ist. (mögliche Folgen: s.o.)
Einen Mehrwert gäbe es dafür nicht.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Macintosh

BeitragSo, Sep 12, 2010 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
nunja, aber ich finde das sehr schade, das man an objecte, auf die ein ointer zeigt nicht mehr "rann kann".

Noobody

BeitragSo, Sep 12, 2010 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Wofür brauchst du das überhaupt? Zeiger sollte man sowieso nur verwenden, wenn es unbedingt vonnöten ist (z.B. beim Arbeiten mit externen Libs), da es einfach nicht mehr in eine Sprache wie BMax passt. Zeiger auf BMax-Objekte zu verwenden ist sowieso problematisch, da der Zeiger nicht vom GC erkannt wird und er daher meint, das Objekt kann freigegeben werden, wenn keine anderen Referenzen mehr vorhanden sind. Je nach dem zeigt dein Zeiger also plötzlich in toten Speicher Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group