Partage
  • Partager sur Facebook
  • Partager sur Twitter

Passage de structure a une fonction

Sujet résolu
27 mars 2017 à 22:28:25

Hello,

Voila surement un des sujet les plus récurrent du forum, mais même en lisant tout ce que je trouve sur le forum, je ne trouve pas ma réponse.

J'ai donc la structure :

struct sPositionPion {
		int dColonne;
		int dLigne;
	} dFou, dTour;

Je voudrais envoyer un seul des objet de la structure a une fonction

Fct_ConverChar(dTour.dColonne)

qui est de type int et passer par un return dans cette fonction.

int Fct_ConverChar(int dTour.dColonne);

J'ai beau relire le cours de c, et celui ci

Je ne comprend pas comment faire.

Si je comprend bien, je ne peux pas envoyer d'objet de structure a une fonction de cette façon (??)

Est ce que je dois obligatoirement passe par un pointer et une fonction de type void?

ou  bien c'est dans ma déclaration de fonction que je me plante carrément??

Merci d'avance pour  vos réponses :)



-
Edité par Dunkhan 3 avril 2017 à 23:34:22

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2017 à 22:51:23

Salut,

Si ta structure est déclaré en dehors de toute fonction, alors les variables dFou et dTour sont globales (enfin je crois bien) donc pas besoin de les passer en arguments.

Sinon, si tu appelles une fonction comme ceci

fonction(dFou.dColonne);

Alors tu envoies un int, qu'il faut récupérer dans ... un int.

typeretour fonction(int foucolonne)

Tu peux aussi évidemment envoyer l'adresse de dFou.dColonne, à récupérer dans un int* .


 

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2017 à 23:10:41

Mes variables sont déclarée dans mon main, donc ne sont pas globales.

Ce qui pose problème en fait, c'est que quand je déclare le prototype de ma fonction avec

int Fct_ConverChar(int dTour.dColonne);

 visual studio souligne le point entre dTour & dColonne

dTour.dColonne 



et m'affiche une erreur.. évidement ca affiche la même erreur dans mon fichier de fonction et donc le compilateur refuse de.. compiler :/

Il ne me dit rien quand je veux simplement appeler ma fonction dans le main avec

Fct_ConverChar(dTour.dColonne)




Je pourrais évidement passer par un void et un pointer, mais je pensais qu'il était possible d'utiliser une fonction de type int et un return dans cette fonction.. apparemment je dois mal déclarer le prototype de ma fonction, mais je ne trouve rien sur le net qui me dis comment faire..





-
Edité par Dunkhan 27 mars 2017 à 23:14:38

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2017 à 23:33:44

Parce que tu n'as pas le droit de mettre un point dans le nom d'une variable ... mon premier message n'est peut-être pas très clair mais je crois bien qu'il te donne la solution ...

N'empêche je me demande si tu es à l'aise avec le type de retour, et avec les pointeurs, j'ai l'impression que tu es embrouillé :euh:

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2017 à 23:57:00

Je suis en première année cours du soir, on vient seulement de voir les pointeurs.

Je suis un peu en avance sur le cour et j'ai déjà pas mal utiliser les pointeurs jusqu'ici dans d'autre prg d'exercices que le prof nous avait donner a faire alors que l'on ne les avait pas encore vu (au cour), mais comme je suis du genre curieux et que j'aime tester.. il m'a dit que jusqu'ici je m'en sortais pas mal et ma donner sa "bénédiction" pour continuer (je ne me jette pas de fleur hin, je décris la situation).

La je dois faire un prg "simple" et je me suis dis que c’était l'occasion de tester les structures.. mais je dois avouer que c'est un plus gros morceau que je ne le pensais ^^

edit: sur le temps que j’écrive mon pavé, j'ai un peu réfléchi a ce que tu me disais, et en relisant j'ai fini par comprendre^^

Mon prototype n'avait pas a avoir la variable dTour.dColonne en paramètre , mais simplement dColonne (par ex).

Maintenant ca marche :)

Merci :))

-
Edité par Dunkhan 3 avril 2017 à 23:24:16

  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2017 à 0:28:00

Ce qui est important, c'est que l'argument de la fonction soit de type int (car dTour.dColonne est de type int). Il peut s'appeler dColonne (comme la variable d'origine) ou tartiflette ça n'a pas d'importance. (j'étais pas sûr que tu aies compris ça).

Si tu transmets la structure complète, alors l'argument est de type `struct sPositionPion`.

-
Edité par Gam' 28 mars 2017 à 0:31:53

  • Partager sur Facebook
  • Partager sur Twitter
3 avril 2017 à 23:33:47

Je reviens ouvrir mon post pq je coince sur le passage de structure via pointeur dans une fonction.

Je vous met le code que j'ai jusqu'ici..

dans mon main

/* LIBRAIRIE */
#include "stdlib.h"
#include "stdio.h"
#include "fonctions.h"



int main(int argc, char *argv[]) {
	
	int i;
	
	struct sCoordonneePion
	{
		char cCharColonne;
		int dIntColonne;
		int dLigne;
		char tDamier[8][8];
	};
	//typedef struct sCoordonneePion sCoordonneePion;

	struct sCoordonneePion dFou, dTour;

	test(&dFou);
	
	
	

dans mon fichier fonctions.h qui contient mon prototype

void test(struct sCoordonneePion *pdFou);

et mon fichier fonctions.cpp

void test(struct sCoordonneePion *pdFou)
{
	pdFou->dLigne = 12;

}



Les erreurs que visual studio souligne en rouge dans le main :

test(&dFou);

il souligne le & et me dit

"L'argument de type "sCoordoneePion *" est incompatible avec le paramètre de type "sCoordonneePion *"

Et l'erreur que j'ai dans le fichier "fonctions.cpp" :

pdFou->dLigne = 12;

Visual Studio souligne en rouge pdFou et me dit :

"Pointeur vers un type classe incomplète non autorisé"

Je pige pas trop, j'ai suivi, je crois, à la lettre un autre exemple ici sur le forum

J'avoue que je suis un peu perdu la..

J'ai aussi essayé de faire une typedef de ma structure (en commentaire dans mon code), mais je n'arrive pas a utiliser ma structure de cette façon la non plus en passage de fonction..

Y a un truc qui m’échappe dans l'utilisation des structures et je ne sais pas ce que c'est :(


-
Edité par Dunkhan 3 avril 2017 à 23:35:47

  • Partager sur Facebook
  • Partager sur Twitter
3 avril 2017 à 23:55:40

Bonsoir,

Puisque tu fais du C++ (extension .cpp) tu devrais poster sur le forum C++. Ou alors renommes tes fichiers en .c.

Sinon, pour ton erreur, c'est tout simple: La déclaration du type struct sCoordonneePion doit être visible de là où tu l'utilises. Le corps de la fonction main n'est pas le bon endroit pour une déclaration. Note que ce problème n'a rien de spécifique aux structure. Si tu suis un cours, tu as dû voir, vers le début, la notion de visibilité (des identificateurs), non?

-
Edité par Marc Mongenet 3 avril 2017 à 23:56:13

  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2017 à 13:28:02

Marc Mongenet a écrit:

Bonsoir,

Puisque tu fais du C++ (extension .cpp) tu devrais poster sur le forum C++. Ou alors renommes tes fichiers en .c.

Edité par Marc Mongenet il y a environ 13 heures


Salut,

Je fais du C, mais visual cree des fichiers .cpp par defaut.. je pourrais les renommer en .c

Marc Mongenet a écrit:

Sinon, pour ton erreur, c'est tout simple: La déclaration du type struct sCoordonneePion doit être visible de là où tu l'utilises. Le corps de la fonction main n'est pas le bon endroit pour une déclaration. Note que ce problème n'a rien de spécifique aux structure. Si tu suis un cours, tu as dû voir, vers le début, la notion de visibilité (des identificateurs), non?

-


J'avoue que je ne comprend pas ta remarque.. est ce que les structures ne fonctionnent pas de la même façon que les variables "classiques"??

J'avais cru comprendre qu'il fallait éviter autant faire se peut de déclarer les variables en globale??!!

En prenant compte de ce que tu dis, est ce que je dois déclarer les structures dans mon fichier .h??

  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2017 à 14:47:30

Dunkhan a écrit:

Je fais du C, mais visual cree des fichiers .cpp par defaut.. je pourrais les renommer en .c

J'avoue que je ne comprend pas ta remarque.. est ce que les structures ne fonctionnent pas de la même façon que les variables "classiques"??

J'avais cru comprendre qu'il fallait éviter autant faire se peut de déclarer les variables en globale??!!

En prenant compte de ce que tu dis, est ce que je dois déclarer les structures dans mon fichier .h??


Salut,

Tant que tes fichiers ont l'extension "cpp", ils seront compilés par le compilateur C++. Il faut les renommer en "c".

Oui, tu doit mettre la déclaration du type struct sCoordonneePion dans le .h. Mais seulement la déclaration du type, pas la définition des variables dFou, dTour.
Je suppose que le cours que tu suis a mal présenté les notions de déclaration et définition. Elles sont simples, mais fondamentale. Une déclaration sert décrire un identificateur, ainsi le compilateur sait ce que représente cet identificateur (une fonction, un type, une variable, etc.). Mais une simple déclaration ne produit rien dans l'exécutable compilé. Ce qui produit qqch, c'est une définition.

Quelques exemples :

// déclaration de type
struct toto {
   int x;
   char y;
};

// déclaration de variable
extern int foo;

// déclaration de fonction
int bar(void);

// définition de variable
int foo;

// définition de fonction
int bar(void) {
    return 22;
}


PS : Un fichier .h ne doit jamais contenir de définition.

-
Edité par Marc Mongenet 4 avril 2017 à 14:48:43

  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2017 à 15:26:23

Ok,

j'avoue ne pas avoir tout compris, je ne pense pas que l'on aie déjà vu cela au cours.. et du coup je ne comprend pas bien la différence entre les deux..

Après, j'avoue que j'essaie d'avance un peu plus vite que le cours (on n'y a pas encore vu les structures ).

Pour mon exemple, j'ai donc mis

   struct sCoordonneePion
    {
        char cCharColonne;
        int dIntColonne;
        int dLigne;
        char tDamier[8][8];
    };

dans mon .h, ce qui supprime les problèmes..

Mais je ne comprend pas pq^^

je vais devoir continuer a lire un peu la doc avant de continuer..

Merci pour ton temps et tes réponses :)



  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2017 à 16:41:51

Dunkhan a écrit:

dans mon .h, ce qui supprime les problèmes..

Mais je ne comprend pas pq^^

Parce que pour compiler pdFou->dLigne = 12; le compilateur a besoin de savoir de quoi est fait pdFou, bref de complétement connaitre sont type. En effet, avec void test(struct sCoordonneePion *pdFou), le compilateur sait uniquement qu'il a affaire à une structure, mais ne sait pas ce qu'il y a dedans. Donc il n'est pas capable de générer les instructions machine pour affecter 12 au membre dLigne (membre qui n'existe peut-être même pas).
  • Partager sur Facebook
  • Partager sur Twitter