Ne compile pas

Fermé
Anonyme24000 - 4 janv. 2022 à 23:27
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 9 janv. 2022 à 21:40
Bonjour,
J'ai crée un sous-programme "Cases" où j'utilise la structure joueur dedans. Cependant le programme m'affiche toujours la même erreur (alors que j'ai déclaré ma fonction dans le main() et que j'ai utilise un prototype dans les fichiers.h.

Auriez-vous une idée de mon erreur ?
Merci :-)




Configuration: Windows / Chrome 96.0.4664.110

4 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
4 janv. 2022 à 23:31
bonjour,
je suspecte que c'est une erreur dans le code.
0
Bonjour, je n'ai pas termine mon message je vous le réecris si vous arrivez à m'aider :


J'ai crée un sous-programme "Cases" où j'utilise la structure joueur dedans. Cependant le programme m'affiche toujours la même erreur (alors que j'ai déclaré ma fonction dans le main() et que j'ai utilise un prototype dans les fichiers.h.

Auriez-vous une idée de mon erreur ?
Merci :-)





typedef struct Proprietes Proprietes;
void cases;


int main()
{
cases;
return 0;
}

struct Proprietes
{
char nomCase[30];
int position;
int prix;
char proprietaire[30];
int batiment[5];
int hypotheque;
int prixHypotheque;
};Proprietes

void cases //l'erreur est à cette ligne
{
///CASE 0 -------- DEPART --------
strcpy(Proprietes[0].nomCase, "DEPART");

///CASE 1 -------- MERCURE --------
strcpy(Proprietes[1].nomCase, "MERCURE");
Proprietes[1].prix = 60;
etc etc ....



le message d'erreur à la ligne du void cases : error : two or more data types in declaration specifiers

Configuration: Windows / Chrome 96.0.4664.110
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
Modifié le 4 janv. 2022 à 23:48
En effet la ligne:
void cases;

n'a pas de sens. Que cherches-tu a écrire? Peut-être une fonction sans paramètre? Alors la syntaxe est :
void cases();

A corriger ligne ??, ligne ?? et ligne ??. Et peut-être d'autres.
Et une fonction qui ne reçoit rien et qui ne retourne rien est de manière certaine une fonction qui fait mal sont boulot! Un sous-programme est un concept qui n'existe pas en C.
0
En effet, j'ai essayé aussi d'utiliser
 void cases(); 


Cependant cela n'a pas marché. Je pense que comme vous l'avez dit c'est un problème de paramètres de la fonction ou un problème concernant le fait qu'il n'y a aucune valeur renvoyée...

Normalement, je n'ai pas besoin de paramètres.
Cette fonction n'a normalement pas besoin de paramètres pour fonctionner. J'utilise juste une structure qui permet d'acceder à chaque case de la fonction
void cases()
avec les sous variables de la structure. Je ne vois donc pas où se trouve l'erreur... :-(


Que voulez-vous dire par "Un sous-programme est un concept qui n'existe pas en C." ?


Bonne soirée à vous.
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Anonyme24000
5 janv. 2022 à 09:56
"cela n'a pas marché": montre le code essayé, et le message d'erreur obtenu.

N'oublie pas d'utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Ton vocabulaire est incompréhensible ou incorrect: "case de la fonction", "sous-programme", "déclaré ma fonction dans le main()", ...

Surtout, tu n'expliques pas ce que tu attends de ton programme.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 5 janv. 2022 à 10:32
Salut Anonyme24000,

Tu fais un Monopoly ?

Revois ton cours de C, car des bases essentielles ne sont pas au rendez-vous. Pour te guider, lis bien ce qui suit, au besoin plusieurs fois et si tu ne comprend pas quelque chose, pose tes questions.

1.

Que voulez-vous dire par "Un sous-programme est un concept qui n'existe pas en C." ?

Le C ne connaît que des fonctions.

Les fonctions sont déclarées et appelées avec des parenthèses, même s'il n'y a pas de paramètres à passer.

Lé déclaration d'une fonction qui ne comporte pas de paramètres devrait explicitement indiquer entre les parenthèses qu'aucun paramètre ne doit être passé avec le mot clef
void
.

Vois par exemple la fonction de la bibliothèque standard getchar(), qui permet d'obtenir un char de l'entrée standard.

Son prototype est :

int getchar(void);


On ne lui passe aucun paramètre (déclaration
void
) et elle retourne un int qui peut contenir le char obtenu sur stdin ou la valeur EOF qui indique une erreur.

Elle est appelée ainsi :

int c;
c = getchar();


avec des parenthèses sans rien dedans.

Sans les parenthèses, le compilateur C ne sait pas que tu te réfères à une fonction.

Tu dois faire pareil avec ta fonction "cases()" :
  • dans ta déclaration de prototype qui devrait être :
    void cases(void);
  • dans ton appel à cette fonction dans main qui devrait être :
    cases();
  • dans ton code d'implémentation de la fonction qui devrait correspondre au prototype :
    void cases(void) {


Ce sont des choses très basiques de la syntaxe du C.

2.

void cases(void)
{
    ///CASE 0 -------- DEPART --------
    strcpy(Proprietes[0].nomCase, "DEPART");

    ///CASE 1 -------- MERCURE --------
    strcpy(Proprietes[1].nomCase, "MERCURE");
    Proprietes[1].prix = 60;
    etc etc .... 


Même avec ces différentes corrections, note que pour que cette fonction fasse quelque chose avec un tableau de struct dénommé Proprietes il faudrait que ce tableau soit déclaré comme une variable globale, ce qui n'est pas le cas dans le code que tu as posté. Peut-être n'as tu pas posté le code qui déclare ce tableau, mais je suspecte une autre erreur dans cette partie du code :

struct Proprietes
{
        char nomCase[30];
        int position;
        int prix;
        char proprietaire[30];
        int batiment[5];
        int hypotheque;
        int prixHypotheque;
}; Proprietes


Ta définition du type
struct Proprietes
est suivie, après le
;
d'un mot nu Proprietes. C'est une erreur de syntaxe. Cela ne déclare ni une variable Proprietes de ce type, ni le tableau dont tu as besoin.

3.

Enfin, le but de la fonction que tu appelles "cases()" est visiblement de remplir les "cases" du tableau. Le nom de la fonction est donc mal choisi.

Le mieux serait de déclarer le tableau dans une fonction et de passer le tableau en paramètre. Tu évites ainsi de devoir créer une variable globale.

Cela donne ceci :

#include <string.h>
  
#define NB_PROPRIETES 28

typedef struct Proprietes Proprietes;
struct Proprietes
{
        char nomCase[30];
        int position;
        int prix;
        char proprietaire[30];
        int batiment[5];
        int hypotheque;
        int prixHypotheque;
};


void remplir_cases(Proprietes * p);

int main(void)
{
        Proprietes p[NB_PROPRIETES];

        remplir_cases(p);
        return 0;
}

void remplir_cases(Proprietes * p)
{
        ///CASE 0 -------- DEPART --------
        strcpy(p[0].nomCase, "DEPART");

        ///CASE 1 -------- MERCURE --------
        strcpy(p[1].nomCase, "MERCURE");
        p[1].prix = 60;
}


4.

Tu as remarqué que quand tu postes ton code sur le forum il s'affiche de manière toute moche, sans coloration syntaxique, ni numérotation des lignes (ce qui ne nous permet pas de te dire ligne n°xx il y a tel problème) et sans indentation, alors que lorsqu'on te répond on te présente un code correctement formaté pour le forum ?

Pour poster du code sur le forum tu dois le poster entre balises de code :

<code c>Ton code ici</code>

Tu peux taper ces balises de code toi même ou cliquer sur le bouton de code du forum
<>▼ 
(le triangle pointant vers le bas) et choisir le langage dans lequel tu postes : ici le c, ce qui va intégrer à la fenêtre d'édition du message sur le forum ces balises dont tu pourras compléter le contenu.

Dal
0
Tout d'abord, merci beaucoup pour votre aide Dal.
Vous avez pris le temps de répondre à mes questions.
Oui en effet je pense que mon niveau en programmation en c doit vous piquer les yeux...
On m'a appris à parler de Sous-programme et non de fonctions; mais maintenant je sais merci !
J'essaye tant bien que mal de progresser mais strucutres, tableaux et pointeurs sont 3 sujets que j'ai du mal à assimiler... alors réunion un tableau avec des pointeurs ou une structure et un tableau... est assez complexe pour moi.

Auriez-vous un site en tête ou une chaine YTB ou autre support de cours qui me permettrait de bien progresser ?

Effectivement je souhaite réaliser un monopoly.

J'ai crée le plateau du Monopoly et je souhaite que ma fonction
remplir_cases
soit utile lorsqu'un joueur arrive à un endroit du plateau (une case), un
int position
lui ai donné (en utilisant la fonction gotoligcol) . Et cette position renvoie à une case particulière du Monopoly.
Et donc en reliant chaque case à une position, ainsi les cases de la fonction
 void remplir_cases 
vont être appelés lorsqu'un joueur est dessus.


En moins de détail, chaque case de mon plateau est définie par une position.
Je souhaite relier la position de chaque case avec chaque case de la fonction
void remplir_cases 
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083 > Anonyme24000
Modifié le 6 janv. 2022 à 11:03
Ce cours est pas mal : https://zestedesavoir.com/tutoriels/755/le-langage-c-1/1043_aggregats-memoire-et-fichiers/4279_structures/

En ce qui me concerne, je n'ai commencé à bien comprendre le C, après avoir tenté divers supports ou formes d'apprentissage, qu'en lisant "The C Programming Language" de Kernighan & Ritchie...mais cela remonte à un moment et il y a peut être des ressources en ligne que d'autres pourront te conseiller.

Une des clefs pour comprendre les structs est de commencer à les utiliser sans typedef (qui n'est que la définition d'un alias en C) et en séparant bien la déclaration de type de son utilisation pour déclarer des variables de ce type. Ensuite on peut faire des trucs plus funky, si on veut, mais je ne pense pas que cela soit utile, celui nuit simplement à la clarté du code.

Pour ton problème :

J'ai crée le plateau du Monopoly

Je pense que tu veux dire que tu as créé une fonction qui dessine le plateau. C'est à dire un carré, avec des cases qui sont sensées être parcourues sur le périmètre du carré. C'est cela ?

et je souhaite que ma fonction remplir_cases soit utile lorsqu'un joueur arrive à un endroit du plateau (une case)

Ta fonction remplir_cases() n'est utile que pour remplir les cases du tableau de struct en les initialisant avec les données nécessaires au départ du jeu. Elle ne sera appelée qu'une fois. Ensuite, au cours du jeu, tu vas utiliser les données contenues dans le tableau de struct pour : dessiner le contenu des cases (noms, prix, présence de constructions,...), vérifier si une propriété appartient à quelqu'un,..., mettre à jour ces données à mesure de l'évolution du jeu.

A ce propos, plutôt que de mettre le nom du propriétaire dans la struct, tu pourrais y mettre un identifiant, qui te permette de lier cette donnée à une liste des joueurs (qui sera un tableau de struct, contenant leur nom, leur solde, et les autres données afférentes au joueur).

A ce propos vois cette illustration : https://forums.commentcamarche.net/forum/affich-37460646-language-c-gestion-des-vehicules#9

, un int position lui ai donné (en utilisant la fonction gotoligcol) . Et cette position renvoie à une case particulière du Monopoly. Et donc en reliant chaque case à une position, ainsi les cases de la fonction void remplir_cases vont être appelés lorsqu'un joueur est dessus.

Je ne comprends pas "un int position lui ai donné (en utilisant la fonction gotoligcol)". En supposant que
gotoligcol()
(d'après le nom) soit une fonction permettant de placer le curseur d'écriture sur l'écran à certaines coordonnées de l'écran, cette fonction serait juste une fonction de gestion de l'écran et pas une fonction de gestion de la position du joueur, ni permettant de déterminer la position du joueur.

C'est plutôt l'inverse : à partir de la position du joueur sur le plateau, tu peux déterminer les coordonnées de la case à l'écran. Pars des données et mets y autant d'éléments permettant de gérer le jeu et son intelligence.

Je vois effectivement que tu as mis un champ
int position;
dans ta
struct Proprietes
. Attention, au Monopoly classique toutes les cases du plateau ne sont pas des "propriétés". Crées-tu un tableau de struct des cases du plateau ou un tableau de struct des seules cases du plateau qui sont des "propriétés" ?

Idéalement, tu devrais créer une fonction de gestion de l'écran qui, à partir de la position sur le plateau (cases de 0 à 39 pour un plateau classque de Monopoly de 40 cases), retourne les coordonnées à l'écran sur ton terminal.

Sépare bien tes fonctions de gestion des données du jeu et du tableau des fonctions de représentation à l'écran et d'intéraction avec l'utilisateur.

Tu devrais commencer par les premières. Une fois les premières faites, tu peux créer les secondes, et, demain, décider que l'affichage se fait sous forme graphique en 2D, en 3D, sous forme holographique, etc., et que l'intéraction se fait à la souris, avec des gants de réalité virtuelle, etc., sans avoir à changer les premières Tu dois découpler ton code de gestion de ton jeu de son interface.

Bien sûr, une autre façon de résoudre simplement ton problème de détermination des coordonnées à l'écran d'une case, si ton écran est fixe et n'est pas redimensionable, est simplement de mettre dans la struct contenant les données de la case les coordonnées à l'écran de la case en question. C'est plus direct, mais cela ira à l'encontre du principe de découplage des éléments appartenant à la gestion du jeu de ceux appartement à la gestion de l'interface d'affichage.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083 > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
6 janv. 2022 à 16:12
@Anonyme24000, au cas où tu ne serais pas "Anonyme12345" qui a posté ce message il y a quelques jours, je t'invite aussi à te reporter à ce fil :

https://forums.commentcamarche.net/forum/affich-37476020-deplacement-des-joueurs-sur-un-jeu-tel-monopoly
0
Merci pour toute votre aide, je vous répond quelques jours plus tard car j'ai eu le temps d'avancer. Les déplacements fonctionnent.
Cependant, j'ai toujours un petit problème dans ma fonction Lancer les dés.
Lorsqu'on lance les 2 des, si l'on fait un double (par exemple de1==3 et de2==3 aussi donc double) on a le droit de relancer les des une deuxième fois.
Et si au deuxième lancer, on fait un nouveau double on va en prison.

Pour réaliser ce programme, j'ai utilisé un
int *compteur
que j'ai passé en paramètre dans ma fonction
int LancerDesDes
. Lorsque l'on fait un double, on obtient
compteur=compteur+1
. Et si
compteur==3
, alors le joueur va en prison.

sauf que lorsque je compile et que j'arrive à faire un double mon compteur affiche 4 au lieu de 2 (j'ai fais un
printf("%d \n", compteur);
).

Je peux vous montrer le code mais si j'affiche mon code ici et que je dois le rendre, avec les outils actuels, le correcteur de mon école détectera du plagiat alors que je cherche juste à ce qu'on m'éclaire. Est-il possible d'envoyer un screen de mon code directement sur ce forum.

Merci et bonne soirée.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
9 janv. 2022 à 21:40
Si j'ai bien compris, il suffit de disposer d'une variable

int dernier_lancer_est_double = 0;
  • si un lancer donne un double, on le met à 1
  • si le nouveau lancer est un double et que
    dernier_lancer_est_double
    alors faire ce qu'il y a à faire en cas de doubles consécutifs et remettre
    dernier_lancer_est_double
    à 0
  • sinon, on remet
    dernier_lancer_est_double
    à 0
0