Besoin d'aide sur un return de tableaux, et passage pour un sous programme [Résolu]

Signaler
-
 Tr -
Salut à tous

j'ai un problème, si quelqu'un peut m'aider à le résoudre, je suis preneur

void achat(int acheteur[], S_joueur achat[])
{
int choix_territoire;
printf("Avec quel territoire voulez-vous acheter ?\n");
scanf("%d", &choix_territoire);

switch (choix_territoire)
{
case 1://si il achat depuis le 1
if(acheteur[1-1] > 1) //on verifie qu'il y a bien des troupes (plus d'une car une reste en défense)
{
printf("\n Qui voulez vous acheter ?");
scanf("%d", &choix_territoire);
if(choix_territoire == 2)
{
versus(acheteur, 0, proprietaire(2, achat), 1);
}
}
}
}

int * proprietaire(int terre, S_joueur player[])
{
if(player[0].Territoire[terre-1] != 0)
{
return player[0].Territoire[terre-1];
}
else if(player[1].Territoire[terre-1] != 0)
{
return player[1].Territoire[terre-1];
}
else if(player[2].Territoire[terre-1] != 0)
{
return player[2].Territoire[terre-1];
}
return NULL;
}

void versus (int acheteur[], int TA, int Defenseur[], int TD)//deroulemnt d'un versus
{

int etat = 0;
printf("\n\n\n%d", acheteur[TA]);
printf("\n\n\n%d", Defenseur[TD]);
}

je vous explique;
Je souhaiterais que le programme proprietaire renvoie le tableau d'un joueur(défenseur), mais quand j'affiche le tableau défenseur dans versus, il affiche 0, alors qu'il devrait afficher 2 (le nb d'unité)

quelqu'un a une idée ?

Merci d'avance

4 réponses

Messages postés
5577
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 juin 2021
937
Salut Tr,

S'il te plaît, lorsque tu postes du code, fais le en utilisant le bouton "<>▾" dans l'interface du forum en choisissant le langage C pour que ton code soit correctement formaté et indenté sur le forum. Sinon, c'est pas beau et pas très lisible.

SI je résume ta question lorsque tu mets
proprietaire(2, achat)
en 3ème paramètre de la fonction versus() tu t'attends à ce que cette fonction proprietaire() renvoie un type tableau de int.

Or cette fonction retourne soit NULL soit une partie d'un tableau d'un type S_joueur, qui doit être un typedef sur une struc dont on ignore le type car tu ne le fournis pas.

Si la fonction proprietaire() retourne NULL, en l'état, ta fonction versus() ne le vérifie pas et tente de déréférencer le pointeur NULL, ce qui est mal. Tu devrais faire cette vérification.

Si la fonction ne retourne pas NULL, alors ta fonction tente d'afficher le deuxième élément d'un tableau (indice 1) qui est sensé être contenu dans un sous-tableau d'un tableau de ton type struct. Comme on ne sais rien de ton type struct ni de comment les données qu'il peut contenir y ont été mises, on ne peut pas te répondre sur la question de savoir pourquoi un 0 s'y trouverait plutôt qu'un 2.

Dal
Salut Dal, merci pour ta réponse !

D'accord, merci, je le ferais à présent.

Oui c'est ça. J'attends à ce que la fonction propriétaire renvoie un tableau pour pouvoir lancer le combat entre l'attaquant et le défenseur.

Autant pour moi, je vous le donne tout de suite

struct [https://www.commentcamarche.net/gamer/ joueur]
{
    char pseudo[TAILLE_PSEUDO];
    int Territoire[NB_TERRITOIRE];
};
typedef struct joueur S_joueur;


En utilisant le debugger, j'ai vu que la fonction propriétaire retourne bien quelque chose (pas le NULL, mais le tableau à qui la terre appartient), mais quand c'est le moment de passer au programme versus, propriétaire lui envoie 0.

Dans ce cas, ça devrait envoyer 2, car c'est le nombre d'unité disponible dans chaque territoire (chaque joueur possède 7 territoires, avec au début, 2 unitées).

Merci d'avance
Messages postés
5577
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 juin 2021
937
Il y a un problème dans ce que tu as posté. Ou alors ce n'est pas du C valide et cela ne compile pas de toutes façons.

Est-ce le tableau Territoire[] que tu veux renvoyer ?

SI oui, en faisant
return player[0].Territoire[terre-1];
tu ne renvoies pas le tableau Territoire, mais un élément du tableau.

D'ailleurs, un compilateur comme gcc, en compilant avec les Warnings devrait te dire :

warning: returning ‘int’ from a function with return type ‘int *’ makes pointer from integer without a cast [-Wint-conversion]


non ?

Pour retourner le tableau tu dois faire
return player[0].Territoire;
(pour retourner celui sous player[0]).
Merci pour votre retour et vos explications.

Oui c'est bien le tableau que je voulais renvoyer, mais comme vous me l'avez dit, je viens de me rendre compte de mon erreur, et, en effet, cela m'affichait bien le warning.

Je viens d'essayer avec
return player[i].Territoire;
, et cela marche parfaitement !

Merci beaucoup pour votre aide et vos explications !

En vous souhaitant une bonne journée.
Messages postés
5577
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 juin 2021
937
De rien, je suis content que le problème soit résolu.

Il ne faut jamais ignorer les warnings. Il faut les comprendre et les traiter. Ils signalent dans la quasi totalité des cas un problème réel dans le code, bien que le code compile.
Ca marche, j'y ferais attention désormais !