Bug?
Übersicht

MacintoshBetreff: Bug? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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]
|
||
- Zuletzt bearbeitet von Macintosh am Di, Sep 07, 2010 10:38, insgesamt einmal bearbeitet
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber in BlitzBasic ist das doch nicht anders?
BlitzBasic: [AUSKLAPPEN] Type Blub |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich habe noch nie BlitzBasic benutzt ^^
nur C, und da siehtman schön was ein pointer ist, und da passieren nicht solche"scgusselfehler" |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nunja, aber ich finde das sehr schade, das man an objecte, auf die ein ointer zeigt nicht mehr "rann kann". | ||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group