Initialisation d'une variable de type structure

Résolu/Fermé
allstarwe Messages postés 9 Date d'inscription jeudi 5 novembre 2015 Statut Membre Dernière intervention 23 novembre 2015 - 5 nov. 2015 à 09:10
allstarwe Messages postés 9 Date d'inscription jeudi 5 novembre 2015 Statut Membre Dernière intervention 23 novembre 2015 - 5 nov. 2015 à 18:20
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 :

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:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 5/11/2015 à 11:23
Salut allstarwe,

Il y a plusieurs problèmes dans ton (extrait) de code.

Tu définis un
typedef
VEHICULE, 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
0
allstarwe Messages postés 9 Date d'inscription jeudi 5 novembre 2015 Statut Membre Dernière intervention 23 novembre 2015
5 nov. 2015 à 11:23
Salut, ma fonction roadMap contient mon rond point c'est pour cela que je fais appel et je lui envoie mon tableau contenant les voitures.Une fois après avoir initialisé comment les affiché dans mon rond point ? Je peux t'envoyé mon code source avec toute ma fct roadMap si tu le souhaite, merci
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
5 nov. 2015 à 11:51
Si tu pars de mon code comme base, ta fonction
roadMap()
devrait être appelée dans
main()
, avec l'adresse du tableau de VEHICULEs et le nombre de véhicules dans le tableau.

Après, tu fais ce que tu veux avec.

Par exemple :

void roadMap(VEHICULE cars[], int nb) {
    int n;

    for (n = 0; n < nb; n++) {
        printf("Véhicule %d : %c %d %d %d %c\n", n, cars[n].vehicule, 
                cars[n].vitesse, cars[n].pos_i, cars[n].pos_j, 
                cars[n].alig);
    }
}


Appelée dans
main()
avec quelque chose comme :
roadMap(tab, 2);
.

Dal
0
allstarwe Messages postés 9 Date d'inscription jeudi 5 novembre 2015 Statut Membre Dernière intervention 23 novembre 2015
5 nov. 2015 à 12:37
Merci bcp j'essaye tous ça et je te tiens au courant !
0
allstarwe Messages postés 9 Date d'inscription jeudi 5 novembre 2015 Statut Membre Dernière intervention 23 novembre 2015
5 nov. 2015 à 13:22
Re 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é :)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
5 nov. 2015 à 15:46
Donc, tu as résolu ton problème initial.

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
0