Initialisation d'une variable de type structure
Résolu
allstarwe
Messages postés
9
Date d'inscription
Statut
Membre
Dernière intervention
-
allstarwe Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
allstarwe Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
Bonjour, depuis 2-3 jours je bloque sur mon projet (qui consiste à crée un rond point et de faire circuler des voitures) à cause d'une mauvaise initialisation d'une variable de type structure.
Ma structure est :
Ensuite j'ai crée une fonction initCar pour initialiser mes deux entrée (en rouge et en orange sur l'image), pour que cette fonction me génère aléatoirement deux lettres.

Ma fonction initCar :
Et après dans ma fonction affichage (celle qui contient le rond point) j'ai essayé d'afficher les 2 lettres dans les coordonnées correspondantes (23,1) et (21,1) mais mon programme a rempli tout mon rond point comme sur cette image :

Ma fonction affichage ressemble à
Si vous pouvez m'aidé merci :)
Ma structure est :
typedef struct voiture VEHICULE; struct voiture { char vehicule; /* N, S, E, O */ int vitesse; /* 1 => lent ou 2 => rapide */ int pos_i; /* Position courante 'i' du véhicule sur la route */ int pos_j; /* Position courante 'j' du véhicule sur la route */ char alig; /* 'g' => gauche ou 'd' => droite */ };
Ensuite j'ai crée une fonction initCar pour initialiser mes deux entrée (en rouge et en orange sur l'image), pour que cette fonction me génère aléatoirement deux lettres.

Ma fonction initCar :
Voiture initCar () { Voiture car [NB_LIN][NB_COL] = {{0}}; char direction [] = {'N', 'S', 'E', 'W'}; int position [2][2] = {{0}}; // On part avec deux voitures sur deux files position [0][0] = 23; position [0][1] = 1; position [1][0] = 21; position [1][1] = 1; int i = 0, j = 0; srand (time (NULL)); for (i = 0; i < NB_LIN; i++) { for (j = 0; j < NB_COL; j++) { car [i][j].vehicule = direction [rand () % 4]; car [i][j].vitesse = 1; car [i][j].pos_i = position [i][j]; car [i][j].pos_j = position [i][j]; car [i][j].alignement = 'd'; } printf("\n"); } roadMap (car); }
Et après dans ma fonction affichage (celle qui contient le rond point) j'ai essayé d'afficher les 2 lettres dans les coordonnées correspondantes (23,1) et (21,1) mais mon programme a rempli tout mon rond point comme sur cette image :

Ma fonction affichage ressemble à
else if (j < 33) { do { printf("%c", matrice[i][j].vehicule); j++; } while (j < 33); }
Si vous pouvez m'aidé merci :)
A voir également:
- Initialisation d'une variable de type structure
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Clear type - Guide
- Structure d'un rapport de stage - Guide
- Type de ram - Guide
- Incompatibilité de type vba ✓ - Forum Excel
1 réponse
Salut allstarwe,
Il y a plusieurs problèmes dans ton (extrait) de code.
Tu définis un
Ta fonction initCar déclare un tableau car, que tu passes ensuite à une fonction
Je ne comprend pas très bien
Il est préférable de spécialiser ta fonction d'initialisation en la simplifiant pour initialiser un VEHICULE, et de lui passer un pointeur sur ta structure. Ainsi, ta fonction aura accès à l'adresse mémoire qui lui été passée pour opérer l'initialisation, et c'est la responsabilité de la fonction appelante (main, ou une autre fonction que tu créeras) d'allouer l'espace mémoire nécessaire au stockage des struct des différents VEHICULEs.
Quelque chose comme cela :
Cet exemple simplifié alloue statiquement un tableau dans
Dal
Il y a plusieurs problèmes dans ton (extrait) de code.
Tu définis un
typedefVEHICULE, qui est un alias de
struct voiture, mais tu n'utilise ni l'un ni l'autre dans ton code, mais un type "Voiture" qui n'est pas définit.
Ta fonction initCar déclare un tableau car, que tu passes ensuite à une fonction
roadMap(). Or, la mémoire de ce tableau n'est garantie d'être allouée que dans la fonction qui l'a déclarée (à moins que tu l'alloues avec malloc, puis que tu libères la mémoire avec free).
Je ne comprend pas très bien
Voiture car [NB_LIN][NB_COL]. Si tu cherches à créer un tableau de deux voitures, cela ne me semble pas cohérent d'avoir un tableau à deux dimensions. De plus, la position est stockée dans la struct.
srand(time (NULL));ne doit être exécuté qu'une seule fois par ton programme, tu ne dois donc pas le mettre dans une portion de code exécutée plusieurs fois.
Il est préférable de spécialiser ta fonction d'initialisation en la simplifiant pour initialiser un VEHICULE, et de lui passer un pointeur sur ta structure. Ainsi, ta fonction aura accès à l'adresse mémoire qui lui été passée pour opérer l'initialisation, et c'est la responsabilité de la fonction appelante (main, ou une autre fonction que tu créeras) d'allouer l'espace mémoire nécessaire au stockage des struct des différents VEHICULEs.
Quelque chose comme cela :
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct voiture VEHICULE; struct voiture { char vehicule; /* N, S, E, O */ int vitesse; /* 1 => lent ou 2 => rapide */ int pos_i; /* Position courante 'i' du véhicule sur la route */ int pos_j; /* Position courante 'j' du véhicule sur la route */ char alig; /* 'g' => gauche ou 'd' => droite */ }; void initCar(VEHICULE * car, int vit, int pi, int pj, char al) { char direction [] = {'N', 'S', 'E', 'W'}; car->vehicule = direction [rand () % 4]; car->vitesse = vit; car->pos_i = pi; car->pos_j = pj; car->alig = al; } int main(void) { VEHICULE tab[2]; /* tableau de 2 VEHICULEs */ srand(time (NULL)); initCar(&tab[0], 1, 23, 1, 'd'); initCar(&tab[1], 1, 21, 1, 'd'); return 0; }
Cet exemple simplifié alloue statiquement un tableau dans
main(). Tu peux, bien sûr, aussi gérer dynamiquement l'allocation avec malloc / free.
Dal
Après, tu fais ce que tu veux avec.
Par exemple :
Appelée dans avec quelque chose comme : .
Dal
J'ai bien réussis à initialisé mes 2 voitures par contre je ne vois pas comment les faire apparaître dans ma fonctions roadMap (http://pastebin.com/2HWA8RCZ). Si tu pouvez m'aidé :)
Ton lien Pastebin ne mène sur rien.
C'est mieux de poster ton code sur le forum. Cela dit, je n'ai pas envie de me plonger dans des centaines de lignes de code hors sujet par rapport à ta demande additionnelle, à laquelle je crois déjà avoir répondu avec un exemple simple.
Si tu tiens à envoyer du code additionnel, essaye de cerner le problème et d'envoyer un exemple contenu de quelques lignes illustrant ton problème, j'apprécierai grandement.
Dal