begin process at 2010 03 19 11:06:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

Struct array en argument


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Struct array en argument

mardi 20 décembre 2005 à 05:24:26 | Struct array en argument

Gabi

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.
mardi 20 décembre 2005 à 09:20:10 | Re : Struct array en argument

Pamaury

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
mardi 20 décembre 2005 à 11:51:34 | Re : Struct array en argument

luhtor

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]).
mardi 20 décembre 2005 à 13:19:46 | Re : Struct array en argument

vecchio56

Administrateur CodeS-SourceS
sizeof(myStruct) ca doit afficher 12, pas 4
sizeof(pStruct) va afficher 4
mardi 20 décembre 2005 à 13:54:38 | Re : Struct array en argument

luhtor

Oui pardon, j'ai dis n'importe quoi :)


mardi 20 décembre 2005 à 15:56:42 | Re : Struct array en argument

Gabi

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.

mardi 20 décembre 2005 à 16:00:07 | Re : Struct array en argument

Gabi

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.

mardi 20 décembre 2005 à 16:03:40 | Re : Struct array en argument

vecchio56

Administrateur CodeS-SourceS
Aucun problème avec ca:

#include <iostream>
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);
}
mardi 20 décembre 2005 à 16:06:26 | Re : Struct array en argument

Gabi

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 ?

mardi 20 décembre 2005 à 16:17:35 | Re : Struct array en argument

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
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

1 2

Cette discussion est classée dans : fonction, array, argument, struct, mystruct


Répondre à ce message

Sujets en rapport avec ce message

Passer un tableau en parametre d'une fonction [ par julien20vt ] Voila mon probleme:J'ai déclaré une structure Nom_Struct, j'initialise un tableau de Nom_Struct :Nom_Struct maStruct[1000] Ensuite j'ai la fonction s tableau de struct et fonction en C [ par sim51 ] Bonjour à tous. J'ai un petit problème de syntax, après plusieurs recherche sur le net, je n'ai pu ni affirmer ou ni infirmer la validation de mon cod fonction surchargées [ par cabarrus ] à l'aide s.v.pécrire un prog qui surcharge une fonction getnumber(lire nombre).si vous passez un argument bool, cette version de la fonction retourne Listes chainées !!!!! [ par flopflopp ] Bonjour je travaille tjrs sur mon éditeur de texte style vi et je voudrais vous soumettre un nouveau problème :En fait j'ai une structure ligne qui es FONCTION EN C, ET RENVOIE D'ARGUMENT [ par GazGaz ] lu allje voulais savoir un truc : une fonction en c, peut elle renvoyer 2 arguments ? ma fonction dans mon algo admet en argument une chaine de caract Fonction...Comment mettre deux variables dans un argument? [ par alexou09 ] Bonjour tout le monde <?xml:namespace prefix = v ns = "urn: Passage d'un tableua en tant qu'argument [ par tibob51 ] Bonjour a tous,Je voudrai passer un tableu de valeurs (qui est constant selon l'appel) mais ma syntaxe ne marche pas (je voudrai essayé de faire comme Fonction à paramètres illimités [ par Kazuya ] Bonjour,voila, j'ai fait une fonction qui utilise les fameux paramètres illimités:mafonction(int nargs,...)et j'envoie des structures en paramètresstr Fonction prenant un type comme argument (ex : va_arg ()) [ par vinc1008881 ] Bonjour, je voudrais comment faire en C une fonction qui prend un type en argument (char int  ...) comme le fais la fonction va_arg (). Merci de vos r problème de pointeur [ par Kurpeus1 ] Bonjour. J'ai déjà posé la question il y a deux trois jours mais je n'ai pas eu de réponse satisfaisante. Je me permet de réxpliquer mon problèmej'ai


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales