IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème avec une structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 6
    Par défaut Problème avec une structure
    Bonjour,

    J'ai essayé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <stdio.h>
     
    #define SIZE 20
     
    typedef struct {
    char equipeA[SIZE];
    char equipeB[SIZE];
    unsigned int numEquipeA;
    unsigned int numEquipeB;
    unsigned int numGagnant;
    unsigned int numMatch;
    }Match;
     
    Match ajouterCombinaison(Match *str) {
    str->numEquipeA = 1;
    str->numEquipeB = 2;
    str->numMatch = 0;
     
    do {
    printf("Combien de matchs voulez-vous ajouter ? (max 10)\n");
    printf("R : ");
    scanf("%d",&str->numMatch);
    }while(str->numMatch < 1 || str->numMatch > 10);
     
    for(int i=0;i<str->numMatch;++i) {
    printf("Match num%cro %d",130,str->numMatch);
    printf("\nDonner le nom de l'%cquipe %d : ",130,str->numEquipeA);
    scanf("%s",str->equipeA);
    printf("Donner le nom de l'%cquipe %d : ",130,str->numEquipeB);
    scanf("%s",str->equipeB);
    printf("Donner le gagnant entre %s et %s (1 pour %cquipe 1, 2 pour %cquipe 2) : ",str->equipeA,str->equipeB,130,130);
    scanf("%d",&str->numGagnant);
    str->numMatch++;
    }
     
    return *str;
    }
     
    void afficherStruct(Match *str) {
    for(int i=0;i<str->numMatch;++i) {
    printf("\n---Match num%cro %d entre %s et %s :\n",130,str->numMatch,str->numEquipeA,str->numEquipeB);
    printf("Gagnant : %d",str->numGagnant);
    }
    }
     
    int main(void) {
    Match *str;
     
    ajouterCombinaison(&str);
    afficherStruct(&str);
     
    return 0;
    }
    Le problème est tout d'abord que lorsque je choisis le nombre de matchs, par exemple 1, ça me dit de remplir un nombre illimité de matchs... La fonction afficherStruct elle aussi ne marche pas (ça me fait fermer le programme). J'ai fouillé partout, entre notion de pointeurs et j'en passe, et je bloque toujours.

    J'ai essayé de lire les avertissements du compilateur :
    passing argument 1 of 'ajouterCombinaison' from incompatible pointer type [-Wincompatible-pointer-types]|
    Je comprends pas, on a un pointeur sur structure et j'utilise bien le signe '&' dans le main dans les paramètres de la fonction...
    expected 'Match * {aka struct <anonymous> *}' but argument is of type 'Match ** {aka struct <anonymous> **}'|
    Et celui-là, j'avoue que je comprends pas trop... En quoi Match est un double pointeur...?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    Citation Envoyé par fxlxnn Voir le message
    Le problème est tout d'abord que lorsque je choisis le nombre de matchs, par exemple 1, ça me dit de remplir un nombre illimité de matchs... La fonction afficherStruct elle aussi ne marche pas (ça me fait fermer le programme). J'ai fouillé partout, entre notion de pointeurs et j'en passe, et je bloque toujours.
    Mais regarde ton code tu fais des boucles for, mais la variable de boucle n'est pas utilisée pour prendre le iième match.
    Mais dans 1 sens, c'est normal : tu n'as pas de tableau de matches ... ou 1 liste chaînée.

    Tu as 1 structure pour 1 match, mais il faut 1 collection de matches


    Citation Envoyé par fxlxnn Voir le message
    Je comprends pas, on a un pointeur sur structure et j'utilise bien le signe '&' dans le main dans les paramètres de la fonction...

    Et celui-là, j'avoue que je comprends pas trop... En quoi Match est un double pointeur...?
    C'est le cours pointeur

    • int a -> int* pa = &a.
    • double a -> double* pa = &a.
    • long a -> long* pa = &a.
    • float a -> float* pa = &a.

    L'opérateur esperluette & permet de prendre l'adresse d'1 variable, et donc de créer 1 pointeur.

    Mais, l'adresse d'1 pointeur, c'est 1 double pointeur
    Ce que tu ne comprends pas c'est que si tu passes 1 pointeur à ta fonction, c'est pour passer 1 tableau (<- qui est le pointeur sur le premier élément) ... ou le premier maillon/ la structure d'1 liste chaînée.

    D'ailleurs retourner 1 valeur de type match c'est incorrect
    Pour 1 constructeur, soit tu passes 1 double pointeur (avec 1 retour void) soit tu retournes 1 pointeur (avec 1 passage de paramètres void) mais pas 1 mélange des 2

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 6
    Par défaut
    Bonsoir foetus, merci pour ta réponse. Je n'utilise presque jamais les structures en C, j'ai d'ailleurs oublié qu'on pouvait avoir des 'matches' dedans... Je suis un peu perdu.

    J'ai essayé de rajouter les brackets [i] (str[i].numGagnant) mais j'ai des erreurs de compilation. Et franchement, j'abandonne après beaucoup d'essais et de recherches

    Sinon merci pour la petite précision par rapport aux pointeurs, je dormirais moins bête !
    On m'avait dit qu'on pouvait retourner une structure (type Match dans notre cas), pour ça que le type de retour est Match ... Je comprends cependant pas trop mes erreurs, peut-être parce qu'il est si tard ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    Tiens vite fait à tester et déboguer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define G_NAME_SIZE 20
     
     
    typedef struct s_one_match {
        char name_A[G_NAME_SIZE];
        char name_B[G_NAME_SIZE];
        size_t num_A;
        size_t num_B;
        size_t winner;
    } t_one_match;
     
     
    typedef struct s_list_matches {
        t_one_match* list;
     
        size_t nb;
    } t_list_matches;
     
     
     
    void match_init(t_one_match* match) {
        if (match != NULL) {
            match->name_A[0] = '\0';
            match->name_B[0] = '\0';
     
            match->num_A  = 1;
            match->num_B  = 2;
            match->winner = 0;
        }
    }
     
     
    void match_input(t_one_match* match) {
        if (match != NULL) {
            match_init(match);
     
            printf("\nDonner le nom de l'\xC3\xA9quipe %lu : ", match->num_A);
            scanf("%s", match->name_A);
            printf("Donner le nom de l'\xC3\xA9quipe %lu : ", match->num_B);
            scanf("%s", match->name_B);
            printf("Donner le gagnant entre %s et %s (1 pour \xC3\xA9quipe 1, 2 pour \xC3\xA9quipe 2) : ", match->name_A, match->name_B);
            scanf("%lu", &match->winner);
        }
    }
     
     
    void list_delete(t_list_matches* list) {
        if (list != NULL) {
            if (list->list != NULL) {
                free(list->list);
                list->list = NULL;
            }
     
            list->nb = 0;
        }
    }
     
     
    void list_display(t_list_matches* list) {
        if (list != NULL) {
            if (list->nb > 0) {
                t_one_match* match;
                size_t num;
     
                printf("Liste : %lu %s", list->nb, ((list->nb > 1)? "matches": "match"));
     
                for(num=0; num < list->nb; ++num) {
                    match = (list->list  + num);
     
                    printf("\n---Match num\xC3\xA9ro %lu entre %s et %s :\nGagnant : %lu", num, match->name_A, match->name_B, match->winner);
                }
            } else {
                printf("Liste : aucun match\n\n");
            }
        }
    }
     
     
    unsigned char list_init_input(t_list_matches* list) {
        unsigned char ret;
     
        if (list != NULL) {
            size_t nb_matches;
     
            do {
                printf("Combien de matchs voulez-vous ajouter ? (max 10)\nR : ");
                scanf("%lu", &nb_matches);
            } while((nb_matches == 0) || (nb_matches > 10));
     
            list->list = malloc(nb_matches * sizeof(t_one_match));
     
            if (list->list != NULL) {
                size_t num;
     
                list->nb = nb_matches;
     
                for(num=0; num < nb_matches; ++num) {
                    printf("Match num\xC3\xA9ro %lu" , (num + 1));
     
                    match_input(list->list + num);
                }
     
                ret = 1;
            } else {
                list->nb = 0;
     
                ret = 0;
            }
        } else {
            ret = 0;
        }
     
        return ret;
    }
     
     
    /*****************************************************************************/
    /***********************************  Main  **********************************/
    /*****************************************************************************/
     
    int main(int argc, char** argv)
    {
        t_list_matches list;
     
        if ( list_init_input(&list) ) {
            printf("\n\n");
     
            list_display(&list);
            list_delete(&list);
        } else {
            printf("main - list_init_input: error\n");
        }
     
     
        return EXIT_SUCCESS;
    }

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par fxlxnn Voir le message
    Et celui-là, j'avoue que je comprends pas trop... En quoi Match est un double pointeur...?
    Ce n'est pas "Match" qui est un double pointeur mais "&str" quand tu le passes à tes fonctions. Ben oui, "str" est de type "Match étoile" (une adresse) donc "&str" (adresse de str) est bien de type "Match étoile étoile" (l'adresse d'une adresse). Tu n'aurais peut-être pas fait la confusion si tu avais nommé ton type "t_match" conformément aux conventions.
    Accessoirement str étant un pointeur non rempli, non alloué, non quoi que ce soit légitimant un droit à y écrire dedans, tu n'as pas le droit d'écrire dedans. Pour faire simple, chaque fois que tu déclares un pointeur sur quoi que ce soit (ie float* pt) tu ne peux pas aller remplir *pt si tu n'as pas écrit avant pt=quelque chose de valide. C'est une règle absolue. Si tu la respectes t'as des chances que ça marche (il peut y avoir d'autres soucis ailleurs), si tu ne la respectes pas tu n'en as absolument aucune.
    Et c'est valable donc aussi avec ta structure Match où tu écris Match *str puis str->NumMatch=... ce qui équivaut à (*str).NumMatch=... et où donc tu remplis "*str" sans avoir rempli "str".

    Ensuite bon foetus t'a parlé de ta boucle con où tu boucles n fois pour remplir toujours la même variable. C'est comme si t'avais écrit int toto; for (i=0; i < 10; i++) toto=valeur. Là ça reste inexplicable. J'ai l'impression que tu utilises le type "Match" pour gérer à la fois un match, et à la fois n matches. Et donc ben ça peut pas marcher. On utlise un int pour gérer un nombre, on utillise un tableau d'ints pour gérer n nombres. Le raisonnement reste le même pour des strings, des floats et des matches.

    Citation Envoyé par fxlxnn Voir le message
    Je comprends pas, on a un pointeur sur structure et j'utilise bien le signe '&' dans le main dans les paramètres de la fonction...
    Ben oui mais le "&" n'est pas systématique (sinon on ne le mettrait jamais et on programmerait le compilateur pour qu'il le mette systématiquement à notre place). Ca dépend de ce que tu as en entrée.

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void setValue(int* pt, int n) {
    	(*pt)=n;
    }
     
    void raz(int* pt) {
    	setValue(pt, 0);	// Pas de "&" puisque "pt" est un "int étoile" et que setValue() attend un "int étoile"
    }
     
    int main() {
    	int var;
    	int* pt=&var;		// Règle respectée (j'écris bien "pt=quelque chose de valide")
     
    	raz(pt);		// Pas de "&" puisque "pt" est égal (est identique) à "&var"
    	raz(&var);		// Ok, ici on le met parce que "var" est un int et que raz() veut l'adresse d'un int
    }

    Citation Envoyé par fxlxnn Voir le message
    Je n'utilise presque jamais les structures en C, j'ai d'ailleurs oublié qu'on pouvait avoir des 'matches' dedans...
    C'est quoi un "matche" dans une structure ??? (en C je veux dire...)

    Citation Envoyé par fxlxnn Voir le message
    Je suis un peu perdu.
    Un peu normal. Tu ne maitrises absolument pas les pointeurs qui sont les fondements du C. Et tu veux de là te lancer dans des pointeurs sur structures, structures pouvant elles-même gérer des tableaux. C'est un peu comme si tu voulais faire le golden globe sans avoir fait de voile...

    Citation Envoyé par fxlxnn Voir le message
    Et franchement, j'abandonne après beaucoup d'essais et de recherches
    Ok, c'est ton choix. C'est entièrement de ta faute mais ça ne t'enlève pas cette liberté et franchement on s'en bat les c. On aide volontiers ceux qui en veulent mais ceux qui n'en veulent pas on les laisse vivre leur vie.

    Citation Envoyé par foetus Voir le message
    Tiens vite fait à tester et déboguer
    Ouch tu englobes la structure d'un match dans une structure de n matches ? Ok c'est effectivement ce qu'il faut faire mais je reste dubitatif sur sa capacité à piger. Moi je serais resté au tableau basique style Match tabMatch[100] pour éliminer un niveau d'abstractions...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec une structure en C
    Par anthony.pa dans le forum C
    Réponses: 2
    Dernier message: 12/02/2013, 14h51
  2. Problème avec une structure
    Par pegase.90 dans le forum C
    Réponses: 2
    Dernier message: 04/12/2007, 17h34
  3. Problème avec une structure
    Par titux dans le forum C
    Réponses: 5
    Dernier message: 22/07/2007, 16h26
  4. Problème avec une structure
    Par Pierre.g dans le forum C
    Réponses: 4
    Dernier message: 30/12/2006, 12h22
  5. Probléme avec une structure
    Par astragoth dans le forum C++
    Réponses: 3
    Dernier message: 25/04/2006, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo