Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Verstehe Code-Syntax nicht!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.08.2005, 18:41 Uhr
~AlinghiFan
Gast


Hallo zusammen.
Ich programmiere in letzter Zeit zum Spass ein bischen mit C und C++ rum. Nun habe ich noch ein wenig in Direct3D9 hereingeschnuppert und es funktioniert auch wirklich gut. Da ist blos ein Codeabschnitt, den ich nicht ganz verstehen kann.


C++:
CUSTOMVERTEX vertices[] =
{
    { -1.0f,-1.0f, 0.0f, 0xffff0000, },
    {  1.0f,-1.0f, 0.0f, 0xff0000ff, },
    {  0.0f, 1.0f, 0.0f, 0xffffffff, },
};

void* pVertices;
    
g_pVB->Lock( 0, sizeof( vertices ), (void**)&pVertices, 0 );
    
memcpy( pVertices, vertices, sizeof( vertices ) );
    
g_pVB->Unlock();



Also das Ziel ist es ja, das CUSTOMVERTEX Array in den "g_pVB" VertexBuffer zu kopieren.
Die Lock Funktion wird wohl Speicher für pVertices zur verfügung stellen.
Doch warum muss man der Lock Funktion einen void** Zeiger übergeben?
Würde ein void* Zeiger nicht auch reichen?


C++:
void *ptr = malloc( sizeof( vertices ) );

memcpy( ptr, original, sizeof( vertices ) );



Eventuell sind Kenntnisse von D3D9 von nöten. Aber ich hoffe, jemand kann mich aufklären.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.08.2005, 19:16 Uhr
mauralix



Bei mir zeigt es eh keinen Fehler an wenn ich das Argument &pVertices nicht caste.

Allerdings wette ich das du weiter unten es mit Indexbuffern zu tun hast. Di sehen dann sicher so aus int *pIndices und die müssen gecastet werden!

Machst du vielleicht gerade das D3D-Tutorial durch wo ein Rechteck mit einer Textur belegt wird? das von zfx.info oder so?
--
nur olfaktorisch fassbar....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2005, 19:38 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Im Prinzip ganz einfach:
Du übergibst &pVertices, d.h. die Adresse von pVertices (also einen Zeiger darauf). Nun ist pVertices an sich aber schon ein Zeiger, also übergibst du einen Zeiger auf einen Zeiger, ergo void**.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2005, 20:39 Uhr
~AlinghiFan
Gast


"Machst du vielleicht gerade das D3D-Tutorial durch wo ein Rechteck mit einer Textur belegt wird? das von zfx.info oder so?"

Ganau das.
Aber der Code von Steffan Zerbst ist ein wenig unübersichtlich. Da ist das Tutorial des DX9 SDKs von Microsoft besser.

Also das mit dem void** Zeiger muss ich mir nochmal ansehen. Da programmiert man schon ne weile mit Zeigern und dan haut einem sowas aus der Bahn ;-)

Naja, vielen Dank für die Antworten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.08.2005, 20:59 Uhr
~AlinghiFan
Gast


So, nun habe absolut den Durchblick verloren.
Ich habe nun mit dem void** Zeiger rumgespielt und folgende Verrückten Ergebnisse bekommen.


C++:
int zahl[] = { 90, 20, 30 };

void **ptr = (void**)zahl;

cout << *(zahl + 0) << "\n";
cout << *(zahl + 1) << "\n\n";

cout << *(ptr + 0) << "\n";
cout << *(ptr + 1) << endl;



Das Ergebnis:

90
20

0000005A
00000014

Also 90 und 20 sind ja logisch. Aber der void** Zeiger gibt zwar die richtigen Zahlen aber im Hexadezimalsystem aus!

Nun, ich brauche HILFE. Kennt jemand eine gute Seite, die sich mit void** Zeigern beschäftigt? In meinem C++ Buch steht nichts darüber

Besten Dank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2005, 09:03 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von ~AlinghiFan:
So, nun habe absolut den Durchblick verloren.
Also 90 und 20 sind ja logisch. Aber der void** Zeiger gibt zwar die richtigen Zahlen aber im Hexadezimalsystem aus!



Das gehört so:

Pointer werden nun man in hex ausgegeben: *(ptr+x) hat nun mal den Typen void*, weil ja ptr void** Zum typen hat. zahl ist hingegen zuweisungkompatibel mit einem int*, daher gibt *(zahl+n) ein int aus, wie du es erwartest
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.08.2005, 17:22 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das ptr+1 die zweite zahl ausgibt ist aber auch glück das sizeof(int) == sizeof(void*) in dem falls ist
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: