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