amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Cast auf PLANEPTR funktioniert nicht [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2010-06-08, 23:16 h

Reth
Posts: 1858
User
Hallo zusammen,

bin gerade über etwas gestolpert, das mir bisher nicht aufgefallen war, da es im Programm immer zu funktionieren scheint und keinerlei Fehler gibt (auch nicht von der Darstellung).

Habe meine Grafiken in Form von Sourcecode (UBYTE-Arrays) abgespeichert und includiere sie so ins Programm. Z.B.:
C++ code:
UBYTE  lake_data[] =
{
		0x00,0x00,0x00,...
...
}


Wenn ich mir dann die Adresse des Arrays im Speicher ausgeben lasse funktioniert das prima über &lake_data (std::cout << "Lake_Data: " << (&lake_data) << std::endl;). Für die Funktion, welche mir aus den Daten aber eine BitMap aufbauen soll caste ich die Daten auf PLANEPTR (vom Type Zeiger auf UBYTE), also mit (PLANEPTR)(&lake_data).
Wenn ich mir dieses aber ausgeben lasse (std::cout << "Lake_Data: " << ((PLANEPTR)(&lake_data)) << std::endl;) bekomme ich nichts zu sehen, hätte aber immer noch denselben Wert, wie von &lake_data erwartet! Habe ihn ja schließlich nur gecastet und nicht verändert!
Wo liegt denn hier der Denkfehler und wie kann ich es richtig machen? PLANEPTR wird doch einfach nur mit (UBYTE *) substituiert, oder nicht!?

Dasselbe passiert auch, wenn ich ((PLANEPTR)(lake_data)) oder ((PLANEPTR)(&lake_data[0])) einsetze! In der Funktion (und in der Ausgabe), die einen PLANEPTR erwartet kommt einfach nichts an!

Das Seltsame ist aber, dass die so erzeugten BitMaps und ihre Masken einwandfrei zu funktionieren scheinen (zumindest sieht die Grafik normal aus)! Nur die Kontrollausgaben, wie oben beschrieben geben entweder nichts aus, oder zum Teil Datenmüll! Das hat mich stutzig gemacht! Erwarten würde ich hier als Ausgabe immer die Adresse des Arrays im Speicher (bzw. des ersten Elementes)! Blicks gerade nicht!

Vielen Dank schon einmal!

Ciao

[ Dieser Beitrag wurde von Reth am 08.06.2010 um 23:37 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2010-06-08, 23:52 h

ZeroG
Posts: 1487
User
@Reth:
code:
(PLANEPTR)(lake_data)

Sollte klappen. lake_data ist schon ein Zeiger, wenn du da noch ein & vorsetzt bekommst du die Adresse des Pointers anstatt die Adresse auf die der Pointer zeigt.

[ - Answer - Quote - Direct link - ]

2010-06-09, 08:15 h

tboeckel
Posts: 124
User
Zitat:
PLANEPTR wird doch einfach nur mit (UBYTE *) substituiert, oder nicht!?

Nicht ganz. In graphics/gfx.h ist PLANEPTR folgendermaßen definiert:
[csource]typedef UBYTE *PLANEPTR;[/csource]

Damit ist PLANEPTR ein eigenständiger neuer Typ und nicht einfach nur ein "Ersatz", so wie er mit "#define PLANEPTR (UBYTE *) definiert würde.

Da C++ ein deutlich strengeres Typkonzept als C hat wird da dann natürlich auch zwischen diesen unterschiedlichen Typen unterschieden. Für std::cout ist offensichtlich eine entsprechende Operandenüberladung für den "<<" Operator und "UBYTE *" Typen definiert, aber halt nicht für PLANEPTR. Entweder implementierst du den "<<" Operator für PLANEPTR selbst, oder du castest die Zeiger aus der Bitmap doch wieder auf "UBYTE *"

[ - Answer - Quote - Direct link - ]

2010-06-09, 09:11 h

Reth
Posts: 1858
User
@tboeckel:

Die Ausgabe mit einem Cast auf (UBYTE *) hat mit std::out leider auch nicht funktioniert.
Also:
C++ code:
std::cout << "Lake_Data: " << ((UBYTE *)(&lake_data)) << std::endl;


Da sollte ja dann zumindest die Adresse des Zeigers auf lake_data stehen, oder?

Das mit dem & vor lake_data lasse ich im Code nun auch mal weg. Hab mich nur gewundert, wieso die Grafiken dennoch einwandfrei angezeigt wurden!

Vielleicht funktioniert ja der Code zur Erstellung der BitMaps, nur die Ausgabe über std::out nicht (kann ja mal printf probieren)!

[ - Answer - Quote - Direct link - ]

2010-06-09, 12:54 h

akl
Posts: 265
User
@Reth:

>std::cout << "Lake_Data: " << ((PLANEPTR)(&lake_data)) << std::endl;

Was erwartest Du denn zu sehen?

Wie wäre es mit:

std::cout << "Pointer als Hexwert: " << std::hex << ((unsigned long) &lake_data[0]) << std::endl;

oder

std::cout << "Pointer als Dezimalwert: " << std::dec << ((unsigned long) &lake_data[0]) << std::endl;

Du kannst nicht voraussetzen, dass der C++ Compiler erahnt, wohin er den Pointer konvertieren soll. Wenn ich C-Compiler wäre, würde ich ihn nach (char *) konvertieren, womöglich(!) im ersten Byte ein NUL (0x00) finden und nichts ausgeben... ;-)

Das ist übrigens der Vorteil von printf(), dass man dahingehend diszipliniert sein und klare Angaben machen muss...

[ Dieser Beitrag wurde von akl am 09.06.2010 um 12:55 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2010-06-09, 13:26 h

akl
Posts: 265
User
@Reth:

>Das mit dem & vor lake_data lasse ich im Code nun auch mal weg. Hab >mich nur gewundert, wieso die Grafiken dennoch einwandfrei angezeigt >wurden!

Bei einem statischen Array der Art "char name[]" hast Du einfach Glück gehabt, weil alle drei Wege zum gleichen Ziel führen:

name
&name
&name[0]

Wäre es dagegen ein dynamisches Array vom Typ "char *name" gewesen, wärst Du mit &name so auf die Nase gefallen, wie es einer der Vorredner beschrieben hat. Ich würde mir Schreibweise Nummer 3 angewöhnen, weil sie einheitlich ist und Fehler besser auffallen.


[ Dieser Beitrag wurde von akl am 09.06.2010 um 13:28 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2010-06-09, 14:32 h

cha05e90
Posts: 157
User
Zitat:
Original von akl:
Wenn ich C-Compiler wäre

:P
--
sam440ep-OS4.1|A2000/040-CGX4-OS3.9|A2000/030-P96-OS3.9|A1000-OS1.3

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Cast auf PLANEPTR funktioniert nicht [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.