Struct array en argument

Résolu
cs_Gabi Messages postés 55 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 20 décembre 2005 - 20 déc. 2005 à 05:24
cs_Gabi Messages postés 55 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 20 décembre 2005 - 20 déc. 2005 à 16:34
J'ai un problème avec les arrays de struct en argument (o rly ?). Quand j'en passe un, la valeur que cela donne dans la fonction n'est pas correcte (menant à une runtime error). Pour comprendre, je vous donne un exemple hypothétique :

struct :

struct myStruct
{
int a,b,c;
};

fonction :

void Bonjour(myStruct[] pStruct)
{
cout << sizeof(myStruct);
}

déclaration d'un élément de struct :

myStruct Struct1[] = {{1,2,3},{4,5,6},{7,8,9}};

utilisation de la fonction :

Bonjour(Struct1);

Comme je dis, ça ne créé pas d'erreur de compilation, étant donné que le code en soi est correct. Le problème se trouve probablement au niveau des adresses et des espaces d'array, mais là c'est pas facile à voir. Quelqu'un aurait une idée ? Merci.

10 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 déc. 2005 à 16:17
La taille du tableau (on dit comme ca en francais), tu ne peux pas la connaitre, car on peut aussi bien passer un pointeur qu'un tableau à ta fonction, donc l'information taille du tableau, si elle existe, est perdue.
Tu peux passer un argument supplémentaire, spécifiant la taille du tableau
3
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
20 déc. 2005 à 09:20
Bizarre, si tu dis que çà bug je veux bien le croire mais quand même çà parait surprennant .
Donne un exemple concret qui bug(par ex ton code) .

A m a u r y
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
20 déc. 2005 à 11:51
C'est correct de déclarer un tableau de myStruct sans définir de taille
? C'est une question, car j'ai appris que ca l'était pour les tableaux
de caractères, mais dans ton cas, tu es sur que cette ligne est
correcte ? :

myStruct Struct1[] = {{1,2,3},{4,5,6},{7,8,9}};



Ensuite ,ton problème c'est quoi en fait ?

cout << sizeof(myStruct); => si ca, ca affiche 4 c'est normal...

myStruct est un pointeur... pas un élément de myStruct.



cout << sizeof(myStruct[0]).
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 déc. 2005 à 13:19
sizeof(myStruct) ca doit afficher 12, pas 4
sizeof(pStruct) va afficher 4
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
20 déc. 2005 à 13:54
Oui pardon, j'ai dis n'importe quoi :)
0
cs_Gabi Messages postés 55 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 20 décembre 2005
20 déc. 2005 à 15:56
Mon code est assez complexe, c'est un truc en direct3d, je vais essayer de mettre seulement ce qui est pertinent. Ne vous inquiétez pas s'il y a un paquet de truc étranges dans les fonctions, je fais des tests.

Le struct :

struct CPrimitive
{
public:


CPrimitive();
~CPrimitive();
void Create(D3DVERTEX pVertex[],char* TexturePath);
void Render();


private:


LPDIRECT3DVERTEXBUFFER9 VertexBuffer;
LPDIRECT3DTEXTURE9 Texture1;
D3DMATERIAL9 Material;
D3DVERTEX* Vertex;
};

Déclaration:

D3DVERTEX Triangle[] = { {0.0f,1.0f,0.0f,0.0f,1.0f,-1.0f,0.1f,0x7fffffff,0.5f,0.0f},{-1.0f,-1.0f,-1.0f,0.0f,1.0f,-1.0f,0.1f,0x7fffffff,0.0f,1.0f},{1.0f,-1.0f,-1.0f,0.0f,1.0f,-1.0f,0.1f,0x7fffffff,1.0f,1.0f},
{0.0f,1.0f,0.0f,-1.0f,1.0f,0.0f,0.1f,0x7fffffff,0.5f,0.0f},{-1.0f,-1.0f,1.0f,-1.0f,1.0f,0.0f,0.1f,0x7fffffff,0.0f,1.0f},{-1.0f,-1.0f,-1.0f,-1.0f,1.0f,0.0f,0.1f,0x7fffffff,1.0f,1.0f},
{0.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.1f,0x7fffffff,0.5f,0.0f},{1.0f,-1.0f,1.0f,0.0f,1.0f,1.0f,0.1f,0x7fffffff,0.0f,1.0f},{-1.0f,-1.0f,1.0f,0.0f,1.0f,1.0f,0.1f,0x7fffffff,1.0f,1.0f},
{0.0f,1.0f,0.0f,1.0f,1.0f,0.0f,0.1f,0x7fffffff,0.5f,0.0f},{1.0f,-1.0f,-1.0f,1.0f,1.0f,0.0f,0.1f,0x7fffffff,0.0f,1.0f},{1.0f,-1.0f,1.0f,1.0f,1.0f,0.0f,0.1f,0x7fffffff,1.0f,1.0f}};

CPrimitive PTriangle;

Fonction :

void CPrimitive::Create(D3DVERTEX pVertex[], char* TexturePath)
{
void* Data;

//ici je sais pas si je dois faire
memcpy(Vertex,pVertex,sizeof(pVertex));

ou

for(int i =0;i<sizeof(pVertex);++i)
{
Vertex[i].X=pVertex[i].X;
Vertex[i].Y=pVertex[i].Y;
Vertex[i].Z=pVertex[i].Z;
Vertex[i].Normal=pVertex[i].Normal;
Vertex[i].fSize=pVertex[i].fSize;
Vertex[i].Color=pVertex[i].Color;
Vertex[i].U=pVertex[i].U;
Vertex[i].V=pVertex[i].V;
}

ou

Vertex=pVertex;



//Create the vertex buffer
c_App.GetDevice()->CreateVertexBuffer(sizeof(pVertex),D3DUSAGE_WRITEONLY,D3DFVF_VERTEX,D3DPOOL_MANAGED,&VertexBuffer,NULL);


//Filling the vertex buffers with data
VertexBuffer->Lock(0,sizeof(Data),(void**)&Data,0);
memcpy(Data,pVertex,sizeof(pVertex));
VertexBuffer->Unlock();


D3DXCreateTextureFromFileA(c_App.GetDevice(),TexturePath,&Texture1); //Load the texture from the set path
}

Utilisation concrète :

PTriangle.Create(Triangle,"texture.jpg");

Voilà, bonne chance.
0
cs_Gabi Messages postés 55 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 20 décembre 2005
20 déc. 2005 à 16:00
J'ai oublié d'ajouter que dans la fonction, si je déclare l'array de struct D3DVERTEX (celui qui s'appelle Triangle) à l'intérieur de la fonction, tout fonctionne. Mais je suis incampable de "l'amener" de l'extérieur à travers un argument. Mêem sans remplir Vertex, et en utilisant seulement l'argument lui-même, pVertex, rien ne marche.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 déc. 2005 à 16:03
Aucun problème avec ca:

#include
using namespace std;

typedef struct
{
int a,b,c;
} myStruct;

void Bonjour(myStruct* pStruct)
{
cout << pStruct[0].a << endl;
cout << pStruct[1].c << endl;
}

int main()
{
myStruct Struct1[] = {{1,2,3},{4,5,6},{7,8,9}};
Bonjour(Struct1);
}
0
cs_Gabi Messages postés 55 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 20 décembre 2005
20 déc. 2005 à 16:06
J'ai déouvert autre chose. L'accès aux éléments de l'array en tant que tel est correct. Le problème se trouve vraiment au niveau de sizeof(). Comment pourrais-je trouevr la taille de l'array et non du pointeur ?
0
cs_Gabi Messages postés 55 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 20 décembre 2005
20 déc. 2005 à 16:34
C'est ce que j'ai fini par me résigner à faire. Merci à vosu tous pour votre aide.
0
Rejoignez-nous