Visualizzazione Stampabile
-
Visibilità di una struct
Ciao a tutti, ho un problemino con il c++, come si fa a rendere una struct, create all'interno di una funzione ( la struct la devo fare per forza dentro la funzione quindi niente variabile globale http://forumtgmonline.futuregamer.it...s/icon_cry.gif ), visibile anche all'esterno??cioè in modo che possa essere usata anche da altre funzioni.
ciao
-
Re: Visibilità di una struct
-
Re: Visibilità di una struct
potresti farmi un piccolo esempio, che purtroppo non sono molto bravo in c++.
grazie http://forumtgmonline.futuregamer.it.../icon_razz.gif
-
Re: Visibilità di una struct
Esisto diverse possibilità per risolvere quello che vuoi fare:
-Allocare in maniera dinamica una struct in una funzione e restituire un puntatore ad essa per poter utilizzare la struct in altre funzioni:
struct prova{
int i;
char c;
};
prova * funz(int i, char c){
prova * tmp =new prova;
tmp->i=i;
tmp->c=c;
return tmp;
}
-utilizzare l'attributo static per alterare la vita di una struct all'interno di una funzione ed utilzzare un puntatore per poter accedervi da altre funzioni
struct prova{
int i;
char c;
};
prova * funz(int i, char c){
static prova tmp;
tmp.i=i;
tmp.c=c;
return &tmp;
}
-Se vuoi che la variabile sia visibile a tutte le funzioni all'interno di un file ma non ad altre in altri file dichiari la struct static all'interno del file
static prova p;
Quale delle situazioni è più vicina al tuo problema?
-
Re: Visibilità di una struct
credo di aver tralasciato un dettaglio importante http://forumtgmonline.futuregamer.it...on_redface.gif , quindi ti spiego esattamente cosa sto facendo.
Sto cercando di realizzare un piccolo motore grafico 3D, quello che vorrei fare è esattamente questo: ho i modelli 3D e voglio memorizzare i dati del modello ( ad esempio la posizione il colore ecc...) dentro una struct, e fin qui ci siamo, il problema sta nel fatto che devo creare una struct di questo tipo:
struct InfoModello3D{
float posizione;
float NumeroPoligoni[NumTotalePoligoni]
};
come vedi dentro la struct c'è un array che non conosco e che devo impostare prendendo il suo valore ( NumTotalePoligoni )dal modello 3D, adesso ti faccio vedere come lavora la funzione che recupera i dati del modello 3D:
VOID RecuperoDatiModello()
{
//recupero i dati del modello 3D
//quindi adesso conosco anche la varibile che mi manca ( NumTotalePoligoni )
//quindi posso creare la struct impostando l'array
struct InfoModello3D{
float posizione;
float ColorePoligono[NumTotalePoligoni]
};
//creo un puntatore alla struct
InfoModelli3D* PuntatoreAdInfo;
//riempo la struct con i sui dati
//esempio PuntatoreAdInfo[NumeroDelModello]->ColorePoligoni[Numero delPoligoni] = verde;
//l'esempio fa schifo ma è solo per farti vedere come faccio http://forumtgmonline.futuregamer.it...s/icon_lol.gif
//fine funzione
}
come vedi adesso ho creato la struct e ho impostato la grandezza dell'array; ora c'è una seconda funziona che mi serve per modificare i dati contenuti nella struct ed eccoti spiegato il motivo per cui voglio che sia visibile ad altre funzioni.
quindi cosa mi consigli di procedere (abbi pazienza http://forumtgmonline.futuregamer.it...s/icon_lol.gif )
PS. per qualsiasi dubbio chiedi che ti spiego subito.
-
Re: Visibilità di una struct
Citazione:
ercand ha scritto mer, 05 aprile 2006 alle 21:10
struct InfoModello3D{
float posizione;
float ColorePoligono[NumTotalePoligoni]
};
http://forumtgmonline.futuregamer.it...lookaround.gif ma perchè si può fare? Di solito quando non si conosce a priori la grandezza di un array, lo si alloca dinamicamente e cioè
struct InfoModello3D{
float posizione;
float *ColorePoligono;
int NumTotPol;
};
//creo un puntatore alla struct
InfoModelli3D* PuntatoreAdInfo;
PuntatoreAdInfo =new InfoModelli3D[NumeroModelli];
PuntatoreAdInfo[NumeroDelModello].Colore Poligono= new float[NumTotalePoligoni];
PuntatoreAdInfo[NumeroDelModello].NumTot Pol=NumTotalePoligoni;
Quindi la struct puoi dichiarla globalmente e la variabile istanziata dinamicamente puoi utilizzarla in qualsiasi funzione, portandoti il puntatore appresso.
-
Re: Visibilità di una struct
http://forumtgmonline.futuregamer.it...s/icon_eek.gif http://forumtgmonline.futuregamer.it...s/icon_eek.gif http://forumtgmonline.futuregamer.it...s/icon_eek.gif non sapevo si potesse fare una cosa simile.
adesso faccio delle prove e ti faccio sapere se ci riesco.
una curiosità, ma perchè fai questo:
//creo un puntatore alla struct
InfoModelli3D* PuntatoreAdInfo;
PuntatoreAdInfo = new InfoModelli3D[NumeroModelli];
in questo caso trattandosi di puntatoti non si può fare a me del new InfoModelli3D[NumeroModelli];????
grazie veramente tanto http://forumtgmonline.futuregamer.it...ns/kissing.gif
-
Re: Visibilità di una struct
http://forumtgmonline.futuregamer.it...s/icon_eek.gif http://forumtgmonline.futuregamer.it...s/icon_eek.gif http://forumtgmonline.futuregamer.it...s/icon_eek.gif non sapevo si potesse fare una cosa simile.
adesso faccio delle prove e ti faccio sapere se ci riesco.
una curiosità, ma perchè fai questo:
//creo un puntatore alla struct
InfoModelli3D* PuntatoreAdInfo;
PuntatoreAdInfo = new InfoModelli3D[NumeroModelli];
in questo caso trattandosi di puntatoti non si può fare a me del new InfoModelli3D[NumeroModelli];????
grazie veramente tanto http://forumtgmonline.futuregamer.it...ns/kissing.gif
-
Re: Visibilità di una struct
Perchè in c++ il nome dell'array è un puntatore al primo elemento.
Se tu dichiari un puntatore, poi puoi "farlo diventare" un array allocando dinamicamente memoria.
Chiaro? http://forumtgmonline.futuregamer.it..._surprised.gif
-
Re: Visibilità di una struct
C++...
E le classi che fine han fatto?
-
Re: Visibilità di una struct
Citazione:
Mithrandir81 ha scritto mer, 05 aprile 2006 alle 23:24
C++...
E le classi che fine han fatto?
in che senso http://forumtgmonline.futuregamer.it...lookaround.gif
x pongo:
ho fatto quella domanda perchè prima facevo in questo modo
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2 Tex1, Tex2, Tex3;
};
MESH_VERTEX_CLONEFVF* m_pCloneVerticiFVF;
e poi dentro un ciclo for ( quindi senza fare NEW )facevo questo
for (long i = 0; i < numVertici; i++)
{
m_pCloneVerticiFVF[i].Tex2.x = m_pCloneVerticiFVF[i].Tex1.x;
m_pCloneVerticiFVF[i].Tex2.y = m_pCloneVerticiFVF[i].Tex1.y;
}
anche questo se non sbaglio è un array anche senza fare NEW, che casino http://forumtgmonline.futuregamer.it.../icon_dead.gif http://forumtgmonline.futuregamer.it...s/icon_lol.gif .
ps. sto facendo dei tentavimi, mi sta dando degli errori che provo a correggere
-
Re: Visibilità di una struct
Nel senso che se stai programmando in C++ ... C++ si chiama così per un particolare motivo che dovrebbe differenziarlo dalla programmazione strutturata: OOP, Object Oriented Programming, oggetti, metodi e attributi degli oggetti...classi...
-
Re: Visibilità di una struct
Citazione:
Pongo ha scritto mer, 05 aprile 2006 alle 23:12
Perchè in c++ il nome dell'array è un puntatore al primo elemento.
Se tu dichiari un puntatore, poi puoi "farlo diventare" un array allocando dinamicamente memoria.
Chiaro?
http://forumtgmonline.futuregamer.it..._surprised.gif
In C...in C anche...e prima del C++
Il motivo è che un puntatore, non fa altro che, appunto, puntare ad un'area di memoria...il puntatore contiene quindi un indirizzo di memoria...ora se prendi un indirizzo di memoria e incrementi il valore, ottieni gli indirizzi di memoria successivi...quindi punti alle zone successive di memoria.
Ovviamente devi però preoccuparti di allocare, cioè chiedere di riservare per te quelle zone di memoria...altrimenti rischi di invadere quella di altri programmi.
-
Re: Visibilità di una struct
Citazione:
Mithrandir81 ha scritto mer, 05 aprile 2006 alle 23:59
Citazione:
Pongo ha scritto mer, 05 aprile 2006 alle 23:12
Perchè in c++ il nome dell'array è un puntatore al primo elemento.
Se tu dichiari un puntatore, poi puoi "farlo diventare" un array allocando dinamicamente memoria.
Chiaro?
http://forumtgmonline.futuregamer.it..._surprised.gif
In C...in C anche...e prima del C++
Il motivo è che un puntatore, non fa altro che, appunto, puntare ad un'area di memoria...il puntatore contiene quindi un indirizzo di memoria...ora se prendi un indirizzo di memoria e incrementi il valore, ottieni gli indirizzi di memoria successivi...quindi punti alle zone successive di memoria.
Ovviamente devi però preoccuparti di allocare, cioè chiedere di riservare per te quelle zone di memoria...altrimenti rischi di invadere quella di altri programmi.
http://forumtgmonline.futuregamer.it...s/icon_nod.gif grazie per la precisazione http://forumtgmonline.futuregamer.it...s/icon_nod.gif
-
Re: Visibilità di una struct
ho fatto delle prove però mi da un errore, credo che la funzione che estrae i dati del modello 3D non riesca a riempire la struttura perchè c'è un puntatore, infatti facendo una prova mettendo l'array gia definito, esempio:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2 Texture[3];
};
non da problemi, invece se faccio in questo modo:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale; D3DXVECTOR2 Texture[NumeroTexture]; };
MESH_VERTEX_CLONEFVF* m_pCloneVerticiFVF;
m_pCloneVerticiFVF = new MESH_VERTEX_CLONEFVF[m_pMesh->GetNumVertices()];
for (int i = 0; i < m_pMesh->GetNumVertices();i++)
{
m_pCloneVerticiFVF[i].Texture = new D3DXVECTOR2[3];
for (int j = 0; j<4; j++)
{
m_pCloneVerticiFVF[i].Texture[j].x = 0.0f;
m_pCloneVerticiFVF[i].Texture[j].y = 0.0f;
}
}
mi da l'errore quando tenta di riempire Texture[j], D3DXVECTOR3 e D3DXVECTOR2 sono una terna e una coppia di valori FLOAT.
dovè che sbaglio http://forumtgmonline.futuregamer.it...on_redface.gif http://forumtgmonline.futuregamer.it...on_redface.gif
-
Re: Visibilità di una struct
Quando si utilizza un puntatore per accedere ai membri di una struttura si utilizza l'operatore -> e non .
m_pCloneVerticiFVF[i]->Texture[j].x = 0.0f;
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto gio, 06 aprile 2006 alle 07:34
Quando si utilizza un puntatore per accedere ai membri di una struttura si utilizza l'operatore -> e non .
m_pCloneVerticiFVF[i]->Texture[j].x = 0.0f;
ciao allora provando a scriverlo come dici te cioè con "->" invece che con " . " mi da degli errori:
------ Build started: Project: Mio_Progetto, Configuration: Debug Win32 ------
Compiling...
Mesh.cpp
c:\progetto\mio progetto\mesh.cpp(701) : warning C4018: '<' : signed/unsigned mismatch
c:\progetto\mio progetto\mesh.cpp(720) : error C2819: type 'MESH_VERTEX_CLONEFVF' does not have an overloaded member 'operator ->'
c:\progetto\mio progetto\mesh.cpp(25) : see declaration of 'MESH_VERTEX_CLONEFVF'
did you intend to use '.' instead?
c:\progetto\mio progetto\mesh.cpp(720) : error C2232: '->MESH_VERTEX_CLONEFVF::Texture' : left operand has 'struct' type, use '.'
c:\progetto\mio progetto\mesh.cpp(720) : error C2228: left of '.x' must have class/struct/union
c:\progetto\mio progetto\mesh.cpp(801) : warning C4018: '<' : signed/unsigned mismatch
Creating browse information file...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
Build log was saved at "file://c:\progetto\Mio Progetto\Debug\BuildLog.htm"
Mio_Progetto - 3 error(s), 2 warning(s)
comunque credo sia colpa della funzione delle DirectX9 che non riesce a riempire la struttura creata in questo modo, vi scrivo qui questa funzione ( così comè sulle SDK)che voi sapete più di me:
HRESULT Lock(
UINT OffsetToLock,
UINT SizeToLock,
VOID ** ppbData,
DWORD Flags
);
Parameters
OffsetToLock
[in] Offset into the vertex data to lock, in bytes. To lock the entire vertex buffer, specify 0 for both parameters, SizeToLock and OffsetToLock.
SizeToLock
[in] Size of the vertex data to lock, in bytes. To lock the entire vertex buffer, specify 0 for both parameters, SizeToLock and OffsetToLock.
ppbData
[out] VOID* pointer to a memory buffer containing the returned vertex data.
Flags
[in] Combination of zero or more locking flags that describe the type of lock to perform. For this method, the valid flags are:
che ne pensate?
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto gio, 06 aprile 2006 alle 07:34
Quando si utilizza un puntatore per accedere ai membri di una struttura si utilizza l'operatore -> e non .
m_pCloneVerticiFVF[i]->Texture[j].x = 0.0f;
http://forumtgmonline.futuregamer.it...s/icon_eek.gif scusa ho scritto una minchiata, ciò che non va nel tuo codice è
m_pCloneVerticiFVF[i].Texture = new D3DXVECTOR2[3];
hai dichiarato il membro Texture come array statico,quella new è fuori luogo.
-
Re: Visibilità di una struct
Cmq ti consiglio di fare una bella ripassatina sui puntatori (serve anche a me a quanto pare http://forumtgmonline.futuregamer.it...s/icon_lol.gif ), sennò il bug è sempre dietro l'angolo
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto gio, 06 aprile 2006 alle 18:46
Citazione:
y.a.f.ake ha scritto gio, 06 aprile 2006 alle 07:34
Quando si utilizza un puntatore per accedere ai membri di una struttura si utilizza l'operatore -> e non .
m_pCloneVerticiFVF[i]->Texture[j].x = 0.0f;
http://forumtgmonline.futuregamer.it...s/icon_eek.gif scusa ho scritto una minchiata, ciò che non va nel tuo codice è
m_pCloneVerticiFVF[i].Texture = new D3DXVECTOR2[3];
hai dichiarato il membro Texture come array statico,quella new è fuori luogo.
spetta http://forumtgmonline.futuregamer.it.../icon_dead.gif con statico tu intendi questo:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2 Texture[3];
};
se intendi questo si ok il new è sbagliato, io però l'ho dichiarato così:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2* Texture; };
in questo caso l'array è dinamico ( spero sia il termine corretto http://forumtgmonline.futuregamer.it.../icon_razz.gif ) quindi il new deve essere fatto, ho capito bene?
EDIT: ho editato perchè avevo scritto male la struct.
-
Re: Visibilità di una struct
Citazione:
ercand ha scritto gio, 06 aprile 2006 alle 19:22
Citazione:
y.a.f.ake ha scritto gio, 06 aprile 2006 alle 18:46
Citazione:
y.a.f.ake ha scritto gio, 06 aprile 2006 alle 07:34
Quando si utilizza un puntatore per accedere ai membri di una struttura si utilizza l'operatore -> e non .
m_pCloneVerticiFVF[i]->Texture[j].x = 0.0f;
http://forumtgmonline.futuregamer.it...s/icon_eek.gif scusa ho scritto una minchiata, ciò che non va nel tuo codice è
m_pCloneVerticiFVF[i].Texture = new D3DXVECTOR2[3];
hai dichiarato il membro Texture come array statico,quella new è fuori luogo.
spetta
http://forumtgmonline.futuregamer.it.../icon_dead.gif con statico tu intendi questo:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2 Texture[3];
};
se intendi questo si ok il new è sbagliato, io però l'ho dichiarato così:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2* Texture; };
in questo caso l'array è dinamico ( spero sia il termine corretto
http://forumtgmonline.futuregamer.it.../icon_razz.gif ) quindi il new deve essere fatto, ho capito bene?
EDIT: ho editato perchè avevo scritto male la struct.
Si per gli array dinamici ci vuole la new.
Poi ricordati di distruggere con delete[] quando hai finito di usarli!
-
Re: Visibilità di una struct
si però con l'array dinamico la funzione non riesce a riempire la struct ( da l'errore quanto cerca di riempire D3DXVECTOR3D* Texture )con i dati, quale può essere la causa http://forumtgmonline.futuregamer.it...n_rolleyes.gif ??
-
Re: Visibilità di una struct
Citazione:
ercand ha scritto gio, 06 aprile 2006 alle 03:49
ho fatto delle prove però mi da un errore, credo che la funzione che estrae i dati del modello 3D non riesca a riempire la struttura perchè c'è un puntatore, infatti facendo una prova mettendo l'array gia definito, esempio:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2 Texture[3];
};
non da problemi, invece se faccio in questo modo:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale; D3DXVECTOR2 Texture[NumeroTexture]; };
MESH_VERTEX_CLONEFVF* m_pCloneVerticiFVF;
m_pCloneVerticiFVF = new MESH_VERTEX_CLONEFVF[m_pMesh->GetNumVertices()];
for (int i = 0; i < m_pMesh->GetNumVertices();i++)
{
m_pCloneVerticiFVF[i].Texture =
new D3DXVECTOR2[3];
for (int j = 0; j<
4; j++)
{
m_pCloneVerticiFVF[i].Texture[j].x = 0.0f;
m_pCloneVerticiFVF[i].Texture[j].y = 0.0f;
}
}
mi da l'errore quando tenta di riempire Texture[j], D3DXVECTOR3 e D3DXVECTOR2 sono una terna e una coppia di valori FLOAT.
dovè che sbaglio
http://forumtgmonline.futuregamer.it...on_redface.gif http://forumtgmonline.futuregamer.it...on_redface.gif
Attento! Nel codice postato crei in m_pCloneVerticiFVF[i].Texture un vettore di tre elementi, ma poi fai variare j da 0 a 3, quando l'indice massimo ammissibile è 2!!! Hai provato a controllare questa cosa?
-
Re: Visibilità di una struct
Citazione:
MscG ha scritto gio, 06 aprile 2006 alle 22:44
Citazione:
ercand ha scritto gio, 06 aprile 2006 alle 03:49
ho fatto delle prove però mi da un errore, credo che la funzione che estrae i dati del modello 3D non riesca a riempire la struttura perchè c'è un puntatore, infatti facendo una prova mettendo l'array gia definito, esempio:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale;
D3DXVECTOR2 Texture[3];
};
non da problemi, invece se faccio in questo modo:
struct MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 posizione, normale; D3DXVECTOR2 Texture[NumeroTexture]; };
MESH_VERTEX_CLONEFVF* m_pCloneVerticiFVF;
m_pCloneVerticiFVF = new MESH_VERTEX_CLONEFVF[m_pMesh->GetNumVertices()];
for (int i = 0; i < m_pMesh->GetNumVertices();i++)
{
m_pCloneVerticiFVF[i].Texture =
new D3DXVECTOR2[3];
for (int j = 0; j<
4; j++)
{
m_pCloneVerticiFVF[i].Texture[j].x = 0.0f;
m_pCloneVerticiFVF[i].Texture[j].y = 0.0f;
}
}
mi da l'errore quando tenta di riempire Texture[j], D3DXVECTOR3 e D3DXVECTOR2 sono una terna e una coppia di valori FLOAT.
dovè che sbaglio
http://forumtgmonline.futuregamer.it...on_redface.gif http://forumtgmonline.futuregamer.it...on_redface.gif
Attento! Nel codice postato crei in m_pCloneVerticiFVF[i].Texture un vettore di tre elementi, ma poi fai variare j da 0 a 3, quando l'indice massimo ammissibile è 2!!! Hai provato a controllare questa cosa?
no aspetta, D3DXVECTOR2 è un vettore a 2 dimensioni, quindi solo coordinata ( x,y ) ; io di questi D3DXVECTOR2 ne devo creare 3 quindi new D3DXVECTOR2[3] , per quanto rigurda il ciclo for hai ragione ma anche variando il j da 0 a 3 oppure da 0 a 2 ( ho provato anche 0 a 2 non si sa mai http://forumtgmonline.futuregamer.it...s/icon_lol.gif ) mi da comunque errore http://forumtgmonline.futuregamer.it...on_redface.gif http://forumtgmonline.futuregamer.it...on_redface.gif http://forumtgmonline.futuregamer.it...on_redface.gif
-
Re: Visibilità di una struct
In che senso ti da errore? A tempo di compilazione o solleva qualche eccezione/memory fault durante l'esecuzione? ho compilato il codice su e non mi da nessun errore
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto ven, 07 aprile 2006 alle 11:52
In che senso ti da errore? A tempo di compilazione o solleva qualche eccezione/memory fault durante l'esecuzione? ho compilato il codice su e non mi da nessun errore
l'errore è precisamente:
Unhandled exception at 0x00452416 in Mio_Progetto.exe: 0xC0000005: Access violation writing location 0x3f800010.
ragionandoci sopra mi era venuta questa idea, la funzione che riempe la struct è questa:
HRESULT Lock(
UINT OffsetToLock,
UINT SizeToLock,
VOID ** ppbData,
DWORD Flags
);
secondo me il paramentro che crea problemi è il terzo, cioè:
ppbData
[out] VOID* pointer to a memory buffer containing the returned vertex data.
a questa parametro, se ho capito un minimo i puntatori, gli dobbiamo passare l'indirizzo di memoria del puntatore alla struct cioè &m_pCloneVerticiFVF , e lui poi la riempi in modo "lineare", l'errore potrebbe essere dato dal fatto che mentre riempe la struct incontra un secondo puntatore D3DXVECTOR* Texture che fa riferimento a un'altro indirizzo di memoria non consecutivo al primo, quindi la struct non può più essere riempita in maniera "lineare" e da un errore, che ne pensi può essere un ragionameto esatto??
-
Re: Visibilità di una struct
http://forumtgmonline.futuregamer.it...ns/scratch.gif
[sparominchiate perchè non so una mazza di DX mode ON]
Il buffer non lo devi inizializzare tu ma te lo restuisce lui
-
Re: Visibilità di una struct
Mi pare di capire che prima si crea un interfaccia IDirect3DVertexBuffer9 tramite CreateVertexBuffer e qui si specifica il formato dei vertici nel buffer nel tuo caso sarebbe
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL |D3DFVF_TEX3);
e poi si utilizza la lock passandogli un puntatore non inizializzato alla struttura da te definita.
eccoti un esempio trovato in rete:
struct Vertex
{
FLOAT x, y, z;
FLOAT nx, ny, nz;
};
const DWORD VertexFVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE);
g_pDevice->CreateVertexBuffer(4*sizeof(Vertex), D3DUSAGE_WRITEONLY, VertexFVF,
D3DPOOL_DEFAULT, &pVB, NULL);
Vertex *pV;
pVB->Lock(0, 0, reinterpret_cast<void**>(&pV), 0);
pV[0].x = 0.0f; pV[0].y = 0.5; pV[0].z = 3.0f;
pV[0].diffuse = 0xffffffff;
pV[1].x = 1.0f; pV[1].y = -0.5f; pV[1].z = 4.0f;
pV[1].diffuse = 0xff777777;
pV[2].x = -1.0f; pV[2].y = -0.5f; pV[2].z = 4.0f;
pV[2].diffuse = 0xff777777;
pV[3].x = 0.0f; pV[3].y = -0.5f; pV[3].z = 2.0f;
pV[3].diffuse = 0xff000000;
pVB->Unlock();
-
Re: Visibilità di una struct
il buffer che deve contenre i vertici è questo:
LPDIRECT3DVERTEXBUFFER9 m_pCloneVertexBufferFVF = NULL;
poi lo riempo attraverso questa( m_pMesh è la variabile che indica il modello 3d da cui voglio prendere i dati):
HRESULT GetVertexBuffer( LPDIRECT3DVERTEXBUFFER9 * ppVB );
Parameters
ppVB
[out, retval] Address of a pointer to an IDirect3DVertexBuffer9 interface, representing the vertex buffer object associated with the mesh.
m_pMesh-> GetVertexBuffer(&m_pCloneVertexBuffe rFVF);
e poi riempo la strusct con questa:
m_pCloneVertexBufferFVF->Lock(0,m_pMesh- >GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF), (void**)&m_pCloneVerticiFVF, 0);
ed è quest'ultima che crea il rpoblema http://forumtgmonline.futuregamer.it...s/icon_cry.gif
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto ven, 07 aprile 2006 alle 19:02
Mi pare di capire che prima si crea un interfaccia IDirect3DVertexBuffer9 tramite CreateVertexBuffer e qui si specifica il formato dei vertici nel buffer nel tuo caso sarebbe
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL |D3DFVF_TEX3);
e poi si utilizza la lock passandogli un puntatore non inizializzato alla struttura da te definita.
eccoti un esempio trovato in rete:
struct Vertex
{
FLOAT x, y, z;
FLOAT nx, ny, nz;
};
const DWORD VertexFVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE);
g_pDevice->CreateVertexBuffer(4*sizeof(Vertex), D3DUSAGE_WRITEONLY, VertexFVF,
D3DPOOL_DEFAULT, &pVB, NULL);
Vertex *pV;
pVB->Lock(0, 0, reinterpret_cast<void**>(&pV), 0);
pV[0].x = 0.0f; pV[0].y = 0.5; pV[0].z = 3.0f;
pV[0].diffuse = 0xffffffff;
pV[1].x = 1.0f; pV[1].y = -0.5f; pV[1].z = 4.0f;
pV[1].diffuse = 0xff777777;
pV[2].x = -1.0f; pV[2].y = -0.5f; pV[2].z = 4.0f;
pV[2].diffuse = 0xff777777;
pV[3].x = 0.0f; pV[3].y = -0.5f; pV[3].z = 2.0f;
pV[3].diffuse = 0xff000000;
pVB->Unlock();
è leggermente differente perchè nel tuo esempio il buffer lo crei te e lo imposti te, questo procedimento che hai postato si fa per creare dei modellini semplicissimi ( tipo quadrati come quello che hai scritto), però quando voui usare modelli con 5000 poligoni fare un lavoro come il tuo esempio è impossibile e allora si usa un formato gia prondo messo a disposizione dalle stesse DirectX.
ps. il posto precedente a questo spiega le funzioni che uso http://forumtgmonline.futuregamer.it...s/icon_lol.gif
-
Re: Visibilità di una struct
-
Re: Visibilità di una struct
Beh se l'access violation avviene nella funzione m_pCloneVertexBufferFVF->Lock è probabile che il numero m_pMesh- >GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF) sia più grande del la dimensione del vertex buffer, scusa quanto è grande il vertex buffer puoi saperlo prima no? e puoi controllare se m_pMesh- >GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF) è effetivamente minore o al massimo uguale alla dimensione del vertex buffer.
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto lun, 10 aprile 2006 alle 18:15
Beh se l'access violation avviene nella funzione m_pCloneVertexBufferFVF->Lock è probabile che il numero m_pMesh- >GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF) sia più grande del la dimensione del vertex buffer, scusa quanto è grande il vertex buffer puoi saperlo prima no? e puoi controllare se m_pMesh- >GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF) è effetivamente minore o al massimo uguale alla dimensione del vertex buffer.
provondo a trovare la dimensione ho fatto questo calcolo:
D3DXVECTOR3 posizione, normale; sono 6 float quindi 12+12
D3DXVECTOR2 *Texture lo inizializzo a 3 coppie di due float quindi 8+8+8.
in totale dovrebbe essere 48, ho provato a metterlo ma da sempre il solito errore http://forumtgmonline.futuregamer.it...s/icon_sad.gif
non so se lo hai letto ( quindi lo quoto ), ma secondo te questo ragionamento puo avere un senso???
Citazione:
Quote:
ragionandoci sopra mi era venuta questa idea, la funzione che riempe la struct è questa:
HRESULT Lock(
UINT OffsetToLock,
UINT SizeToLock,
VOID ** ppbData,
DWORD Flags
);
secondo me il paramentro che crea problemi è il terzo, cioè:
ppbData
[out] VOID* pointer to a memory buffer containing the returned vertex data.
a questa parametro, se ho capito un minimo i puntatori, gli dobbiamo passare l'indirizzo di memoria del puntatore alla struct cioè &m_pCloneVerticiFVF , e lui poi la riempi in modo "lineare", l'errore potrebbe essere dato dal fatto che mentre riempe la struct incontra un secondo puntatore D3DXVECTOR* Texture che fa riferimento a un'altro indirizzo di memoria non consecutivo al primo, quindi la struct non può più essere riempita in maniera "lineare" e da un errore, che ne pensi può essere un ragionameto esatto??
-
Re: Visibilità di una struct
No perchè come vedi quando gli passi il puntatore fai un cast ad un void *, quindi nella funzione lui vede semplicemente quel tipo di puntatore.
Se ho ben capito questa funzione scarica un buffer dalla scheda video e lo riversa in un buffer che lui crea in memoria e di cui ti restituisce il puntatore, perchè alla Lock non gli passi 0 invece di m_pMesh- >GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF) in modo da restituirti tutto il buffer?
Ho spulciato fra i metodi dell'interfaccia ID3DXMesh e queste funzioni non ti potrebbero essere di aiuto?
GetFVF e GetNumBytesPerVertex per sapere il formato dei vertici e quindi utilizzare un struttura adeguata per accedervi.
Che differenza c'è fra l'utilizzare la coppia GetVertexBuffer e lock ed utilizzare LockVertexBuffer ?
edit:
Più correttamente( http://forumtgmonline.futuregamer.it...lookaround.gif ) dovrebbe essere così:
MESH_VERTEX_CLONEFVF* m_pCloneVerticiFVF;
void ** data;
m_pCloneVertexBufferFVF->Lock(0,0, data, 0);
m_pCloneVerticiFVF= (MESH_VERTEX_CLONEFVF*)*data;
m_pCloneVerticiFVF sarebbe a questo punto un array di grandezza GetNumVertices() di struct, dove la singola struct dovrebbe essere definita in sintonia con GetFVF e GetNumBytesPerVertex,
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto mar, 11 aprile 2006 alle 08:30
No perchè come vedi quando gli passi il puntatore fai un cast ad un void *, quindi nella funzione lui vede semplicemente quel tipo di puntatore.
Se ho ben capito questa funzione scarica un buffer dalla scheda video e lo riversa in un buffer che lui crea in memoria e di cui ti restituisce il puntatore, perchè alla Lock non gli passi 0 invece di
m_pMesh- >GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF) in modo da restituirti tutto il buffer?
Ho spulciato fra i metodi dell'interfaccia ID3DXMesh e queste funzioni non ti potrebbero essere di aiuto?
GetFVF e GetNumBytesPerVertex per sapere il formato dei vertici e quindi utilizzare un struttura adeguata per accedervi.
Che differenza c'è fra l'utilizzare la coppia GetVertexBuffer e lock ed utilizzare LockVertexBuffer ?
edit:
Più correttamente(
http://forumtgmonline.futuregamer.it...lookaround.gif ) dovrebbe essere così:
MESH_VERTEX_CLONEFVF* m_pCloneVerticiFVF;
void ** data;
m_pCloneVertexBufferFVF->Lock(0,0, data, 0);
m_pCloneVerticiFVF= (MESH_VERTEX_CLONEFVF*)*data;
m_pCloneVerticiFVF sarebbe a questo punto un array di grandezza GetNumVertices() di struct, dove la singola struct dovrebbe essere definita in sintonia con GetFVF e GetNumBytesPerVertex,
ciao, ho provato a fare come hai detto:
VOID *Dati = NULL; //se scrivo VOID** da errore
m_pCloneVertexBufferFVF->Lock(0 , 0, (void**)&Dati, 0);
poi copio cio che c'è dentro Dati nella struct
memcpy(m_pCloneVerticiFVF, Dati, m_pMesh->GetNumVertices() * sizeof(MESH_VERTEX_CLONEFVF));
per quanto riguarda la dimensione di memcpy ho fatto varie prove ma da comunque errore http://forumtgmonline.futuregamer.it...s/icon_cry.gif http://forumtgmonline.futuregamer.it...s/icon_cry.gif http://forumtgmonline.futuregamer.it...s/icon_cry.gif incomincio a perdere le speranze
-
Re: Visibilità di una struct
Non darti per vinto!
Anche io, come te, sto cominciando a programmare un piccolo motore grafico 3D (è per questo che ho, momentaneamente, abbandonato il mondo del modding) e, ti posso assicurare, che finché non avrai una certa esperienza errori di questo tipo si ripresenteranno spesso.
Purtroppo non posso dare una soluzione diretta al tuo problema, dato che io mi sto specializzando con le OpenGL e tu, a quanto ho capito, usi DitectX, ma posso darti un consiglio: prima di cimentarti con la grafica impara ad usare bene il C/C++; solo una volta che avrai imparato a padroneggiare il linguaggio potrai passare alla programmazione 3D. Non puoi pensate di imparare a due cose così complicate (C e DiretX) contemporaneamente.
Meglio fare un passetto alla volta, altrimenti si rischia di inciampare.
-
Re: Visibilità di una struct
so che bisognerebbe studiare prima il linguaggio di programmazione per bene, ma capisci anche che studiare da soli c++ è abbastanza pesante, ma se insieme provo a fare un qualcosa che mi paice ( engine ) si ha una maggior voglia di applicarsi e di nn arrendersi alle prime difficoltà.
-
Re: Visibilità di una struct
Ho installato l'sdk delle DX e ho giocato un pò... vedi se puoi prendere spunto da questo codice, al netto di rincitronimenti miei dovrebbe avere un senso:
Codice:
//union per accedere ai membri del buffer se ti serve accedere a dati D3DXVECTOR3 utilizzi xyz sennò xy
union MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 *xyz;
D3DXVECTOR2 *xy;
};
MESH_VERTEX_CLONEFVF temp;
int posizione_pos=0;
int posizione_tex=1;
/* posizione delle coordinate delle texture
nel buffer.Questa deve essere nota a
priori: se ad esempio il buffer è
costuito da posizione e texture allora
è 1 se è cosituito da posizione,normale
e texture allora è 2 e così via */
DWORD tipofvf= g_pMesh->GetFVF();
int numtex=tipofvf>>D3DFVF_TEXCOUNT_SHIFT; //numero di texture
unsigned char * vertici;
if(!FAILED(g_pMesh->LockVertexBuffer(0,(void**)&vertici))){
for (long i = 0; i < (long)g_pMesh->GetNumVertices(); i++)
{
temp.xyz=(D3DXVECTOR3 *)(vertici + g_pMesh->GetNumBytesPerVertex()*i); //accedo alla posizione
temp.xyz[posizione_pos].x=temp.xyz[posizione_pos].z;
temp.xy=(D3DXVECTOR2 *)(temp.xyz+posizione_tex); //accedo alle texture
for (int j=0;j<numtex;j++){
temp.xy[j].x=temp.xy[j].y;
}
}
g_pMesh->UnlockVertexBuffer();
}
http://forumtgmonline.futuregamer.it...lookaround.gif
-
Re: Visibilità di una struct
Citazione:
ercand ha scritto mer, 12 aprile 2006 alle 19:45
so che bisognerebbe studiare prima il linguaggio di programmazione per bene, ma capisci anche che studiare da soli c++ è abbastanza pesante, ma se insieme provo a fare un qualcosa che mi paice ( engine ) si ha una maggior voglia di applicarsi e di nn arrendersi alle prime difficoltà.
Si, ma non puoi mai creare un motore 3D se non conosci concetti base come l'allocazione dinamica di memoria e simili.
Ti consiglio di partire dalle basi, per quanto pallose possano essere.
-
Re: Visibilità di una struct
Citazione:
y.a.f.ake ha scritto ven, 14 aprile 2006 alle 12:59
Ho installato l'sdk delle DX e ho giocato un pò... vedi se puoi prendere spunto da questo codice, al netto di rincitronimenti miei dovrebbe avere un senso:
Codice:
//union per accedere ai membri del buffer se ti serve accedere a dati D3DXVECTOR3 utilizzi xyz sennò xy
union MESH_VERTEX_CLONEFVF{
D3DXVECTOR3 *xyz;
D3DXVECTOR2 *xy;
};
MESH_VERTEX_CLONEFVF temp;
int posizione_pos=0;
int posizione_tex=1;
/* posizione delle coordinate delle texture
nel buffer.Questa deve essere nota a
priori: se ad esempio il buffer è
costuito da posizione e texture allora
è 1 se è cosituito da posizione,normale
e texture allora è 2 e così via */
DWORD tipofvf= g_pMesh->GetFVF();
int numtex=tipofvf>>D3DFVF_TEXCOUNT_SHIFT; //numero di texture
void * vertici;
if(!FAILED(g_pMesh->LockVertexBuffer(0,(void**)&vertici))){
for (long i = 0; i < (long)g_pMesh->GetNumVertices(); i++)
{
temp.xyz=(D3DXVECTOR3 *)vertici+i; //accedo alla posizione
temp.xyz[posizione_pos].x=temp.xyz[posizione_pos].z;
temp.xy=(D3DXVECTOR2 *)vertici+i; //accedo alle texture
for (int j=0;j<numtex;j++){
temp.xy[posizione_tex+j].x=temp.xy[posizione_tex+j].y;
}
}
g_pMesh->UnlockVertexBuffer();
}
adesso farò una prova e ti dico se mi funziona http://forumtgmonline.futuregamer.it.../icon_razz.gif
Citazione:
Edward Gein
Si, ma non puoi mai creare un motore 3D se non conosci concetti base come l'allocazione dinamica di memoria e simili.
Ti consiglio di partire dalle basi, per quanto pallose possano essere.
so che hai ragione ma per me dedicarmi al c++ per me sarebbe troppo pesante http://forumtgmonline.futuregamer.it...on_redface.gif