1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut probleme lors de la compilation

    Bonjour,

    J'apprends à programmer en C.

    Je suis entrain d’écrire un programme d'atari-go: http://senseis.xmp.net/?AtariGo

    pour l'instant je suis entrain de créer la taille du goban (5x5,7x7,9x9,13x13 ou 19x19)

    a chaque fois que je vais insérer du nouveau code (boucle, fonction, etc...) je le compile pour voir s'il y a des erreurs.

    voici mon code (Main.c):

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    int c=0;
    int i,j;
    unsigned char p[19][19];
    int new=1;
    int main(int argc,char *argv[]){
    printf("Nouveau jeu: (O ou N)?\n\t1) Oui\n\t2) Non\n\nVotre choix:");
    scanf("%d",&new);
    printf ("Taille du Goban:\n\t1) 5x5\n\t2) 7x7\n\t3) 9x9\n\t4) 13x13\n\t5) 19x19\n\nVotre choix:");
    scanf("%d",&c);
     
     if ((c==1) && (new==1))
    {
    /* init board */
          for (i = 0; i < 5; i++)
            for (j = 0; j < 5; j++)
              p[i][j] = 0;
    if ((c==2) && (new==1))
    {
    /* init board */
          for (i = 0; i < 7; i++)
            for (j = 0; j < 7; j++)
              p[i][j] = 0;
    }
    if ((c==3) && (new==1))
    {
    /* init board */
          for (i = 0; i < 9; i++)
            for (j = 0; j < 9; j++)
              p[i][j] = 0;
    }
    if ((c==4) && (new==1))
    {
    /* init board */
          for (i = 0; i < 13; i++)
            for (j = 0; j < 13; j++)
              p[i][j] = 0;
    }
    if ((c==5) && (new==1))
    {
    /* init board */
          for (i = 0; i < 19; i++)
            for (j = 0; j < 19; j++)
              p[i][j] = 0;
    }
    }
     
    showboard(c);
    return 0;
    }
    puis showboard.c:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int ii=0;
    int i=0;
    int j=0;
    void showboard(int c){
     
    if (c==1){
     unsigned char p[5][5];
    printf("   A B C D E\n");
        for (i = 0; i < 5; i++){
          ii = 5 - i;
          printf("%2d",ii);
     
          for (j = 0; j < 5; j++)
            if (p[i][j] == 0)
               printf(" -");
            else if (p[i][j] == 1)
                    printf(" O");
                 else printf(" X");
     
          printf("%2d",ii);
          printf("\n");
     
         }
    printf("   A B C D E\n");
    }
     
    if (c==2){
     unsigned char p[7][7];
    printf("   A B C D E F G\n");
        for (i = 0; i < 7; i++){
          ii = 7 - i;
          printf("%2d",ii);
     
          for (j = 0; j < 7; j++)
            if (p[i][j] == 0)
               printf(" -");
            else if (p[i][j] == 1)
                    printf(" O");
                 else printf(" X");
     
          printf("%2d",ii);
          printf("\n");
     
         }
    printf("   A B C D E F G\n");
    }
     
    if (c==3){
     unsigned char p[9][9];
    printf("   A B C D E F G H J\n");
        for (i = 0; i < 9; i++){
          ii = 9 - i;
          printf("%2d",ii);
     
          for (j = 0; j < 9; j++)
            if (p[i][j] == 0)
               printf(" -");
            else if (p[i][j] == 1)
                    printf(" O");
                 else printf(" X");
     
          printf("%2d",ii);
          printf("\n");
     
         }
    printf("   A B C D E F G H J\n");
    }
     
    if (c==4){
     unsigned char p[13][13];
    printf("   A B C D E F G H J K L M N\n");
        for (i = 0; i < 13; i++){
          ii = 13 - i;
          printf("%2d",ii);
     
          for (j = 0; j < 13; j++)
            if (p[i][j] == 0)
               printf(" -");
            else if (p[i][j] == 1)
                    printf(" O");
                 else printf(" X");
     
          printf("%2d",ii);
          printf("\n");
     
         }
    printf("   A B C D E F G H J K L M N\n");
    }
     
    if (c==5){
     unsigned char p[19][19];
    printf("   A B C D E F G H J K L M N O P Q R S T\n");
        for (i = 0; i < 19; i++){
          ii = 19 - i;
          printf("%2d",ii);
     
          for (j = 0; j < 19; j++)
            if (p[i][j] == 0)
               printf(" -");
            else if (p[i][j] == 1)
                    printf(" O");
                 else printf(" X");
     
          printf("%2d",ii);
          printf("\n");
     
         }
    printf("   A B C D E F G H J K L M N O P Q R S T\n");
    }
     
    }
    quand je compile mon code, j'ai une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    cc -O   -c -o main.o main.c
    main.c: In function ‘main’:
    main.c:9:1: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&new);
     ^
    main.c:11:1: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&c);
     ^
    cc -std=c99  main.o showboard.o   -o aigo
    pouvez vous m'aider?

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 927
    Points : 16 384
    Points
    16 384
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par ludovic787 Voir le message
    quand je compile mon code, j'ai une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    cc -O   -c -o main.o main.c
    main.c: In function ‘main’:
    main.c:9:1: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&new);
     ^
    main.c:11:1: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&c);
     ^
    cc -std=c99  main.o showboard.o   -o aigo
    pouvez vous m'aider?
    Bonjour

    Ce n'est pas une erreur, c'est un "warning". Cela signifie grosso-modo de la part du compilo "attention, tu écris un truc pas vraiment propre mais je peux quand-même le comprendre". Donc ton code compile quand-même. Ceci dit, les programmeurs de C qui se veulent consciencieux écrivent du code sans warning (surtout qu'avec un warning il existe une chance pour que le compilo comprenne "mal" ton idée).

    Il se trouve que la fonction scanf() renvoie le nombre de variables qu'elle a pu réellement remplir. Ca permet par exemple, quand ce nombre ne correspond pas au nombre attendu, de détecter qu'il y a eu une erreur de saisie et donc d'agir en conséquence. Toi tu utilises cette fonction sans traiter cette valeur et ton compilo te dit juste que ce n'est peut-être pas très correct.
    Tu peux éliminer ce warning en castant en (void) tous tes scanf() ou bien en rajoutant l'option "-Wunused-result" dans ta ligne de compilation => cc -Wunused-result -O -c -o main.o main.c. Ceci dit c'est quand-même bizarre parce que d'une part ça te le fait aux scanf et pas aux printf (elles aussi renvoient une valeur que tu ne récupères pas) et d'autre part on fait ça tellement souvent (d'utiliser les fonctions pour leur travail et donc sans récupérer forcément ce qu'elles renvoient) que cette option est généralement incluse par défaut (chez-moi ton main compile sans souci avec ta ligne de commande) donc j'aimerais bien savoir sur quel environnement tu développes...

    Autre chose: quand on écrit du C, on l'écrit avec une indentation propre. Ca montre d'une part que tu aimes ce que tu fais (produire un code élégant) et d'autre part ça aide à te relire/faire évoluer
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut

    Merci pour la réponse,

    Je pense avoir resolu mon probleme par moi meme:

    j'ai mis avant les scanf

    int n=scanf("%d",&new);
    int t=(scanf("%d",&c);

    et dans ma fonction showboard , j'ai mis un extern char p[19][19]

    J'ai créé un makefile (j'utilise gcc sous linux):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SRC = main.c showboard.c \
    
    OBJ = main.o showboard.o \
    
    PRG = aigo
     
    CFLAGS = -O
    $(PRG) : $(OBJ)
    	$(CC) -std=c99  $(OBJ)  -o $@
    et pour l'indentation (je n'ai pas encore installé geany)
    Merci

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 927
    Points : 16 384
    Points
    16 384
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par ludovic787 Voir le message
    Je pense avoir resolu mon probleme par moi meme:

    j'ai mis avant les scanf

    int n=scanf("%d",&new);
    int t=(scanf("%d",&c);
    Mouais. Tu crées des variables inutiles. Tu soignes les symptômes et non la maladie.

    Citation Envoyé par ludovic787 Voir le message
    et dans ma fonction showboard , j'ai mis un extern char p[19][19]
    Ah oui, tu fais bien d'y venir. Les variables globales sont rarement une bonne idée. Ca simplifie peut-être les problèmes au début mais ça les déporte ailleurs en les démultipliant. Surtout quand ces variables globales ont des noms aussi intelligents que "i", "j", "ii" ou "p".
    Chaque fonction doit avoir ses propres variables de travail et si des infos doivent passer de l'une à l'autre alors on utilises les paramètres. Et si on commence à avoir pas mal de trucs à communiquer (dans un projet par exemple) alors on crée une structure contenant tous les trucs et on se passe cette structure. Par exemple moi, pour mes projets, j'ai un objet "cEnv" contenant tout mon environnement (nom du projet, version, répertoire temporaire, os, etc), un objet "cConfig" contenant toute ma configuration (nom de la bdd, port, options de l'utilisateur, etc). Ensuite mes fonctions reçoivent ces deux objets et ont automatiquement accès à tous ces éléments.
    Bref un projet c'est comme une maison: ça commence par des fondations solides.

    Citation Envoyé par ludovic787 Voir le message
    J'ai créé un makefile (j'utilise gcc sous linux):
    Moi aussi et mon gcc a compilé ton code initial sans souci

    Citation Envoyé par ludovic787 Voir le message
    et pour l'indentation (je n'ai pas encore installé geany)
    Et ça t'empêche d'indenter ??? Accessoirement ce n'est pas parce que tu t'orientes vers la prog qu'il faut oublier les autres connaissances notemment en matière de grammaire. Déjà d'une part parce que la grammaire permet à ton interlocuteur de te lire facilement (il ne laggue pas sans cesse en revenant au début de la phrase parce que sa signification va à l'encontre de la signification des mots) et d'autre part parce que ça reste utile surtout pour exprimer ses idées. "a essayé" et "à essayer" se prononcent de la même façon mais signifient des choses totalement différentes...
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut

    Je suis revenu à mon ancien code: en enlevant les int avant les scanf.

    en utilisant la commande: gcc main.c showboard.c -o aigo

    je n'ai plus de problème.

    alors que si je mets dans mon makefile -Wunused-result. j'ai encore l'erreur du début.

    Et ça t'empêche d'indenter ??? Accessoirement ce n'est pas parce que tu t'orientes vers la prog qu'il faut oublier les autres connaissances notamment en matière de grammaire.
    J'ai appris à programmer en suivant les cours sur FUN Mooc:
    ABC du langage C et Programmer en C pour avoir les bases.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 927
    Points : 16 384
    Points
    16 384
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par ludovic787 Voir le message
    alors que si je mets dans mon makefile -Wunused-result. j'ai encore l'erreur du début.
    Ok, c'est l'option "-std=c99" qui la rajoute (ça me fait pareil chez-moi avec cette option). Et contrairement à ce que je pensais, l'option "-Wunused-result" ne demande pas de supprimer ce contrôle mais demande au contraire de le forcer. Toutefois chez-moi, cette option ne change rien à la compilation de ton code (je l'ai demandée et ton code compile sans problème).

    Bravo pour ton observation. Tu ne te laisses pas faire et quand tu as raison c'est bien. N'oublies pas non plus d'admettre aussi tes erreurs et tu feras un grand homme.
    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

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 562
    Points : 38 544
    Points
    38 544

    Par défaut

    Citation Envoyé par Sve@r Voir le message
    Il se trouve que la fonction scanf() renvoie le nombre de variables qu'elle a pu réellement remplir. Ca permet par exemple, quand ce nombre ne correspond pas au nombre attendu, de détecter qu'il y a eu une erreur de saisie et donc d'agir en conséquence. Toi tu utilises cette fonction sans traiter cette valeur et ton compilo te dit juste que ce n'est peut-être pas très correct.
    Tu peux éliminer ce warning en castant en (void) tous tes scanf() ou bien en rajoutant l'option "-Wunused-result" dans ta ligne de compilation => cc -Wunused-result -O -c -o main.o main.c. Ceci dit c'est quand-même bizarre parce que d'une part ça te le fait aux scanf et pas aux printf (elles aussi renvoient une valeur que tu ne récupères pas) et d'autre part on fait ça tellement souvent (d'utiliser les fonctions pour leur travail et donc sans récupérer forcément ce qu'elles renvoient) que cette option est généralement incluse par défaut (chez-moi ton main compile sans souci avec ta ligne de commande) donc j'aimerais bien savoir sur quel environnement tu développes...
    Ce n'est pas bizarre du tout: Dans stdio.h, scanf() a été déclarée avec __attribute((warn_unused_result)), et printf() non.
    C'est parce que la valeur de retour de scanf() est beaucoup plus importante que celle de printf(), parce que scanf() ne modifie pas les arguments qu'elle n'a pas pu convertir. Résultat, si on passe à scanf() l'adresse d'une variable non-initialisée, si la chaîne entrée est mauvaise, la variable est toujours non-initialisée!

    C'est pourquoi en règle générale, il faut toujours lire et vérifier la valeur retournée par scanf(), et non pas caster le retour de fonction en void.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut

    Je vais revoir comment faire un Makefile.
    je continuerais à compiler avec la ligne gcc main.c showboard.c -o aigo en attendant.

    Et encore merci pour ton aide

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut boucle while indefini

    dans mon code j'ai introduis une boucle while pour ne prendre que les valeurs de scanf, mais je tourne en boucle a l’intérieure de celle ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ((new!=1)||(new!=2)){
    	printf("Nouveau jeu: (O ou N)?\n\t1) Oui\n\t2) Non\n\nVotre choix:");
    	scanf("%d",&new);
    }
     
    while ((c!=1)||(c!=2)||(c!=3)||(c!=4)||(c!=5)){
    	printf ("Taille du Goban:\n\t1) 5x5\n\t2) 7x7\n\t3) 9x9\n\t4) 13x13\n\t5) 19x19\n\nVotre choix:");
    	scanf("%d",&c);
    }
    merci de votre aide

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 562
    Points : 38 544
    Points
    38 544

    Par défaut

    Trois problèmes:
    1. Tu ne lis toujours pas la valeur de retour de scanf().
    2. Quand celle-ci n'est pas satisfaisante, il faut lire le reste de la ligne dans le buffer sinon scanf() n'arrêtera pas d'échouer sur le même caractère. La première fonction de ce post le fait en appelant fgetc() en boucle sur stdin.
    3. Regarde cette ta condition while ((new!=1)||(new!=2)){ d'un peu plus près. Que se passe-t-il si la valeur est 42? Que se passe-t-il si la valeur est 1?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut

    Je viens de trouver mon erreur:

    il suffit de remplacer les || par &&.

    Merci

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 927
    Points : 16 384
    Points
    16 384
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par ludovic787 Voir le message
    il suffit de remplacer les || par &&.
    Lois mathématique de "De Morgan". non(A OU B) = non(A) ET non(B) ; et non(A ET B) = non(A) OU non(B)
    Tu veux un choix sur "1 ou 2", tu refuseras donc tout choix sur "non(1) et non(2)"
    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

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut

    j'ai inseré un if vers la fin de mon code pour choisir entre noir ou blanc:
    main.c
    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
    #include <stdio.h>
    #include <stdlib.h>
    int c=0;
    int i,j;
    unsigned char p[19][19];  /* go board */
    unsigned char l[19][19];  /* liberty of current color */
    unsigned char ma[19][19]; /* working matrix for marking */
    unsigned char ml[19][19]; /* working matrix for marking */
    char ans[0];
    int p1move, p2move;        /* p1 color, p2 color */
    int lib;                  /* current stone liberty */
    int p1ik, p1jk;             /* location of p1 stone captured */
    int p2ik, p2jk;             /* location of p2 stone captured */
    int p1k, p2k;               /* no. of stones captured by p1 and p2 */
    int new=0;
    void showboard(int c);
    int main(int argc,char *argv[]){
     
    while ((c!=1)&&(c!=2)&&(c!=3)&&(c!=4)&&(c!=5)){
    	printf ("Taille du Goban:\n\t1) 5x5\n\t2) 7x7\n\t3) 9x9\n\t4) 13x13\n\t5) 19x19\n\nVotre choix:");
    	scanf("%d",&c);
    }
     
    if ((c==1))
    	{
    	/* init board */
    		for (i = 0; i < 5; i++)
    		for (j = 0; j < 5; j++)
    			p[i][j] = 0;
    	}
    if ((c==2))
    	{
    	/* init board */
    		for (i = 0; i < 7; i++)
    		for (j = 0; j < 7; j++)
    			p[i][j] = 0;
    	}
    if ((c==3))
    	{
    	/* init board */
    		for (i = 0; i < 9; i++)
    		for (j = 0; j < 9; j++)
    			p[i][j] = 0;
    	}
    if ((c==4))
    	{
    	/* init board */
    		for (i = 0; i < 13; i++)
    		for (j = 0; j < 13; j++)
    			p[i][j] = 0;
    	}
    if ((c==5))
    	{
    	/* init board */
    		for (i = 0; i < 19; i++)
    		for (j = 0; j < 19; j++)
    			p[i][j] = 0;
    	}
     
     
     
     if (!new)  /* new game */
         {
     
    /* choose color */
          printf("\nChoose side(b or w)? ");
          scanf("%c",ans);
          if (ans[0] == 'b')
            {
             p1move = 1;   /* P1 white */
             p2move = 2;   /* P2 black */
            }
          else
            {
             p1move = 2;   /* P1 black */
             p2move = 1;   /* P2 white */
           }
        }
     
    showboard(c);
     
    /* main loop
     * tant que pas capturer de pierres 
     * lit mouvement joueur1
     * enleve pierre
     * lit mouvement joueur2
     * enleve pierre
     * */
     
     
     
    return 0;
    }
    puis showboard.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    extern unsigned char p[19][19];
    extern int p1move, p2move;        /* p1 color, p2 color */
    extern int lib;                  /* current stone liberty */
    extern int p1ik, p1jk;             /* location of p1 stone captured */
    extern int p2ik, p2jk;             /* location of p2 stone captured */
    extern int p1k, p2k;               /* no. of stones captured by p1 and p2 */
    int ii=0;
    int i=0;
    int j=0;
    void showboard(int c){
     
    if (c==1){  /*goban 5x5*/
    	printf("   A B C D E\n");
    		for (i = 0; i < 5; i++){
    		ii = 5 - i;
    		printf("%2d",ii);
     
    		for (j = 0; j < 5; j++)
    			if (p[i][j] == 0)
    			printf(" -");
    			else if (p[i][j] == 1)
                    printf(" O");
                	else printf(" X");
     
    		printf("%2d",ii);
    		printf("\n");
     
    }
    	printf("   A B C D E\n");
    }
     
    if (c==2){  /*goban 7x7*/
    	printf("   A B C D E F G\n");
    		for (i = 0; i < 7; i++){
    		ii = 7 - i;
    		printf("%2d",ii);
     
    		for (j = 0; j < 7; j++)
    			if (p[i][j] == 0)
    			printf(" -");
    			else if (p[i][j] == 1)
                    printf(" O");
               	else printf(" X");
     
    		printf("%2d",ii);
    		printf("\n");
     
         }
    	printf("   A B C D E F G\n");
    }
     
    if (c==3){  /*goban 9x9*/ 
    	printf("   A B C D E F G H J\n");
    		for (i = 0; i < 9; i++){
    		ii = 9 - i;
    		printf("%2d",ii);
     
    		for (j = 0; j < 9; j++)
    			if (p[i][j] == 0)
    			printf(" -");
    			else if (p[i][j] == 1)
                    printf(" O");
                	else printf(" X");
     
          		printf("%2d",ii);
          		printf("\n");
     
         }
    	printf("   A B C D E F G H J\n");
    }
     
    if (c==4){  /*goban 13x13*/
    	printf("   A B C D E F G H J K L M N\n");
    		for (i = 0; i < 13; i++){
    		ii = 13 - i;
    		printf("%2d",ii);
     
    		for (j = 0; j < 13; j++)
    			if (p[i][j] == 0)
    			printf(" -");
    			else if (p[i][j] == 1)
                    printf(" O");
                	else printf(" X");
     
          		printf("%2d",ii);
          		printf("\n");
     
         }
    	printf("   A B C D E F G H J K L M N\n");
    }
     
    if (c==5){  /*goban19x19*/
    	printf("   A B C D E F G H J K L M N O P Q R S T\n");
    		for (i = 0; i < 19; i++){
    		ii = 19 - i;
    		printf("%2d",ii);
     
    		for (j = 0; j < 19; j++)
    			if (p[i][j] == 0)
    			printf(" -");
    			else if (p[i][j] == 1)
                    printf(" O");
                	else printf(" X");
     
          		printf("%2d",ii);
          		printf("\n");
     
         }
    	printf("   A B C D E F G H J K L M N O P Q R S T\n");
    }
    if (p2move == 1)
          printf("     Your color: White O\n");
       else
          if (p2move == 2)
    	 printf("     Your color: Black X\n");
          else
    	 printf("\n");
     if (p1move == 1)
    	    printf("     My color:   White O\n");
    	 else
    	    if (p1move == 2)
    	       printf("     My color:   Black X\n");
    	    else
    	       printf("\n");
    }
    mais je n'arrive pas à y inserer b or w

    merci de votre aide

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 927
    Points : 16 384
    Points
    16 384
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par ludovic787 Voir le message
    j'ai inseré un if vers la fin de mon code pour choisir entre noir ou blanc:
    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char ans[0];
    ...
    /* choose color */
          printf("\nChoose side(b or w)? ");
          scanf("%c",ans);
    ...
    mais je n'arrive pas à y inserer b or w
    Ben oui, pas évident d'insérer un caractère dans une chaine de taille zéro caractères...
    Accessoirement le formatage "%c" demande une saisie de caractère, et non une saisie de chaine.

    Donc soit tu déclares ta variable "ans" comme un char, et tu peux alors la remplir via "%c", soit comme une chaine de taille suffisante et tu peux alors la remplir via "%s".

    Sinon une autre remarque à propos de tes variable globales: tu vas droit dans le mur. Déjà les globales c'est une source d'ennui pas permis, mais en plus avec les noms que tu leur donnes, (lib, ma, ml, etc) ben tu auras peut-être un programme qui fonctionne mais qui sera une telle usine à gaz que tu ne pourras plus jamais ni le relire, ni le faire évoluer.
    Essaye de programmer en modules. De petites fonctions dédiées à une tâche simple que tu peux ensuite combiner (style legos) pour produire un truc fonctionnel et surtout évolutif. Et avec des variables locales à chaque fonction. Et si t'as trop d'infos à transmettre de fonctions en fonctions et que ça devient lourd, ben tu regroupes tes infos dans une structure et tu passes juste la structure. Par exemple une structure "s_jeu" qui contiendra ton goban, le coup en cours, la liste des coups, etc...
    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

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2008
    Messages : 32
    Points : 22
    Points
    22

    Par défaut

    merci pour ces conseils, j'ai prevu de faire un fichier .h pour integrer toutes les fonctions du jeu.

    Par contre pour ce qui est des structures, je ne sais pas comment cela fonctionne. Je vais me renseigner sur google.

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 927
    Points : 16 384
    Points
    16 384
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par ludovic787 Voir le message
    j'ai prevu de faire un fichier .h pour integrer toutes les fonctions du jeu.
    Oui, c'est pas mal. Multiplier les fichiers sources réduit le nombre de lignes de chaque fichier ce qui le rend plus facile à maintenir.

    Citation Envoyé par ludovic787 Voir le message
    Par contre pour ce qui est des structures, je ne sais pas comment cela fonctionne. Je vais me renseigner sur google.
    Oui, ou bien sur les tutoriels de ce forum. Mais pour résumer, une structure c'est un type qui regroupe plusieurs items.

    Exemple de structure:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct s_date {
        unsigned short jj;
        unsigned short mm;
        long aa;
    };

    A partir de là, toute variable "X" de type "struct s_date" aura alors à sa dispositions les 3 items" jj", "mm" et "aa" et pourra y accéder.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct s_date toto;
    toto.jj=14;
    toto.mm=7;
    toto.aa=1789;
    Et si une fonction reçoit l'adresse de cette variable, elle-aussi alors pourra accéder aux items
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void affiche(struct s_date *pt) {
        printf("Jour: %hu, mois: %hu, année: %ld\n", pt->jj, pt->mm, pt->aa);      // "pt->jj" est un substitut plus simple à écrire que "(*pt).jj"
    }
     
    affiche(&toto);
    Ainsi, avec un seul paramètre on accède à tout l'ensemble. Pour le codeur, c'est beaucoup plus simple de gérer "une" variable "toto" que 3 variables "jj", "mm" et "aa" tout en gardant la possibilité d'y accéder au besoin.

    Et enfin en rajoutant un typedef, on peut alors se passer ensuite du mot "struct" lorsqu'on veut créer une variable correspondant.
    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
    16
    17
    typedef struct {
        unsigned short jj;
        unsigned short mm;
        long aa;
    } t_date;
     
    void affiche(t_date *pt) {
        printf("Jour: %hu, mois: %hu, année: %ld\n", pt->jj, pt->mm, pt->aa);
    }
     
    int main () {
        t_date toto;
        toto.jj=14;
        toto.mm=7;
        toto.aa=1789;
        affiche(&toto);
    }
    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

Discussions similaires

  1. [utf8] Problème lors de la compilation
    Par ChipsterJulien dans le forum Editeurs / Outils
    Réponses: 1
    Dernier message: 10/03/2006, 18h36
  2. [Free Pascal] Problème lors de la compilation
    Par llaurentt dans le forum Free Pascal
    Réponses: 2
    Dernier message: 31/01/2006, 10h40
  3. Probleme lors de la compilation...
    Par Draleg dans le forum C
    Réponses: 15
    Dernier message: 08/12/2005, 18h14
  4. [Debutant] probleme lors de la compilation
    Par boobi dans le forum Débuter
    Réponses: 5
    Dernier message: 26/08/2005, 16h57
  5. [MYSQL] Probleme lors de la compilation
    Par Nasky dans le forum Autres éditeurs
    Réponses: 10
    Dernier message: 24/02/2004, 18h04

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