amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Cast auf PLANEPTR funktioniert nicht [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

08.06.2010, 23:16 Uhr

Reth
Posts: 1858
Nutzer
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. ]

[ - Antworten - Zitieren - Direktlink - ]

08.06.2010, 23:52 Uhr

ZeroG
Posts: 1487
Nutzer
@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.

[ - Antworten - Zitieren - Direktlink - ]

09.06.2010, 08:15 Uhr

tboeckel
Posts: 124
Nutzer
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 *"

[ - Antworten - Zitieren - Direktlink - ]

09.06.2010, 09:11 Uhr

Reth
Posts: 1858
Nutzer
@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)!

[ - Antworten - Zitieren - Direktlink - ]

09.06.2010, 12:54 Uhr

akl
Posts: 265
Nutzer
@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. ]

[ - Antworten - Zitieren - Direktlink - ]

09.06.2010, 13:26 Uhr

akl
Posts: 265
Nutzer
@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. ]

[ - Antworten - Zitieren - Direktlink - ]

09.06.2010, 14:32 Uhr

cha05e90
Posts: 157
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Cast auf PLANEPTR funktioniert nicht [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.