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 :

programme qui semble s'exécuter sans rien afficher


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Points : 37
    Points
    37
    Par défaut programme qui semble s'exécuter sans rien afficher
    Bonjour à tous,

    Je pense (et espère) que je suis au bon endroit pour poster ma requête car il s'agit d'un programme de c s'exécutant sous linux.

    Pour poser le contexte :

    dans le cadre d'un projet de c en dut informatique S1 je dois faire un programme simulant " the Conway's Game of Life" (pour plus d'info voir : http://fr.wikipedia.org/wiki/Jeu_de_la_vie ).

    Comme il est précisé dans le titre du sujet, mon programme ne rencontre pas d’erreurs lors de la compilation sous la distribution ubuntu (j'ai utiliser la commande, <gcc programme.c -o programme -lncurses>), cependant lors de l'exécution (<./programme>) le terminal n'affiche rien et me redonne la main.

    Voici mon programme :

    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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <curses.h>
    #include <string.h>
    #define x 15
    #define y 40
     
    /* FONCTION MENU */
     
    void Menu(){
    printf("\n\n CONWAY'S GAME OF LIFE");
    printf("\n\n\n\n\t Choisissez votre mode :");
    printf("\n\n\n\n 1 : Lancer le jeu de la vie.\n\n");
    printf(" 2 : Engendrer une population aléatoire.\n\n");
    printf(" 3 : Population par défaut.\n\n");
    printf(" 4 : Charger une population.\n\n");
    printf(" 5 : Sauver une population courante.\n\n");
    printf(" 6 : Aide.\n\n");
    printf(" 7 : Quitter.");
     
    switch(getch()){
    case '1':
    clear();
    void EvolutionPop(char t[x][y]);
    break;
     
    case '2':
    clear();
    int GenererAleatoire();
    break;
     
    case '3':
    clear();
    void GenererDefaut();
    break;
     
    case '4':
    clear();
    void ChargerPop();
    break;
     
    case '5':
    clear();
    int SauverPop(char t[x][y]);
    break;
     
    case '6':
    clear();
    int Aide();
    break;
     
    case '7':
    clear();
    void Quitter();
    break;
    }
    }
     
     
     
    /* FONCTION QUITTER */
     
    void Quitter(){
    exit(0);
    }
     
     
     
    /* FONCTION DE CHARGEMENT DE POPULATION */
     
    void ChargerPop(){
    FILE* fichier;
    char s[10000];
    fichier=fopen("config.txt","rt");
     
    if (fichier==NULL){
    printf ("Erreur, fichier inexistant.");
    }
    else{
    fgets (s,10000,fichier);
    while (!feof(fichier)){
    printf ("%s",s);
    fgets (s,10000,fichier);
    }
    usleep(4000000);
    }
    fclose(fichier);
    }
     
     
     
    /* FONCTION DE SAUVEGARDE DE POPULATION */
     
    int SauverPop(char t[][y]){
    FILE* fichier;
    char nomFichier[40];
    int i, j, colsMax, linesMax;
     
    colsMax=15;
    linesMax=40;
    int n=20; 
     
    printf ("\nDonnez le nom du fichier:");
    char* fgets(char *ptr, int n, FILE *fichier);
    fichier=fopen(nomFichier,"wt");
     
    if (fichier==NULL){
    printf ("Erreur, fichier inexistant.");
    }
    else{
    for (i=0;i<linesMax;i++){
    for (j=0;j<colsMax ;j++){
    fprintf(fichier,"%d", t[i][j]);
    fprintf(fichier,"\n");
    }
    }
    fclose (fichier);
    }
    }
     
     
     
    /* FONCTION DE GENERATION DE LA POPULATION PAR DEFAUT */
     
    void GenererDefaut (char t[][y]){
    int i, j, colsMax, linesMax;
    char croix[]="+";
     
    colsMax=15;
    linesMax=40;
     
    j=linesMax/2;
    i=(colsMax - strlen(croix))/2;
    /* Placement des "+" pour la configuration par défaut */
    move(j,i);
    printw(croix);
    move(j,i-1);
    printw(croix);
    move(j,i+1);
    printw(croix);
    move(j+1,i-1);
    printw(croix);
    move(j+1,i+1);
    printw(croix);
    move(j+2,i-1);
    printw(croix);
    move(j+2,i+1);
    printw(croix);
    }
     
     
     
    /* FONCTION AIDE */
     
    int Aide(){
    printw(" Bienvenue dans le menu Aide du jeu de la vie de Conway.\n\n");
    printw(" Le jeu de la vie est un automate cellulaire imagine par John Horton Conway en 1970.\n\n");
    printw(" Le principe est simple. Sur une grille théoriquement infinie, mais de dimension 15 par 40 dans ce programme, les cases qui representent des cellules, sont soit vivantes soit mortes. A chaque etape, l evolution d une cellule est calculee en fonction de l etat de ses huit voisines de la facon suivante: \n\n");
    printw(" - Une cellule morte avec exactement 3 voisins vivants devient vivante (naissance liee a un environnement optimal.\n");
    printw(" - Une celle vivante avec 2 ou 3 voisins vivants reste vivante (elle n est ni isolee, ni etoufee), sinon elle meurt (mort par desertification ou surpopulation). \n\n");
    printw(" C est l analogie entre ces regles et certains criteres d evolution de populations de bacteries qui a conduit a donner cet automate le nom de jeu de la vie.");
    }
     
     
     
    /* FONCTION DU CALCUL DE VOISIN */
     
    int calculVoisins(int sommeVoisins, char t[][y]){
    int i,j;
    /* Si la somme des voisins est égale à 3 et que la cellule est morte. */
    if (sommeVoisins == 3 && t[i][j] == ' ' ){
    Affichage(t[i][j]);
    }
     
    /* Si la somme des voisins est égale à 2 ou à 3, et que la cellule est vivante. */
    if (sommeVoisins == 2 || sommeVoisins == 3 && t[i][j] == '+'){
    Affichage(t[i][j]);
    }
     
    /* Si la somme des voisins est diiférente de 2 et de 3, et que la cellule est vivante. */
    if (sommeVoisins != 2 || sommeVoisins != 3 && t[i][j] == '+'){
    Affichage(t[i][j]);
    }
    }
     
     
     
    /* FONCTION DE L EVOLUTION DE LA POPULATION */
     
    void EvolutionPop(char t[][y]){
    int i, j, sommeVoisins;
     
    for(i=0; i<15; i++){
    for(j=0; j<40; j++){
    if(i==0 && j==0){
    sommeVoisins=t[i][j+1] + t[i+1][j] + t[i+1][j+1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i==15 && j==40){
    sommeVoisins=t[i][j-1] +t[i-1][j] + t[i-1][j-1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i==15 && j==0){
    sommeVoisins=t[i-1][j] + t[i][j+1] + t[i-1][j+1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i==0 && j==40){
    sommeVoisins=t[i][j-1] + t[i+1][j] + t[i+1][j-1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i==15 && j!=0 && j!=40){
    sommeVoisins=t[i][j-1] + t[i][j+1] + t[i-1][j] + t[i-1][j-1] + t[i-1][j+1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i!=0 && i!=15 && j==40){
    sommeVoisins=t[i][j-1] + t[i-1][j] + t[i-1][j-1] + t[i+1][j] + t[i+1][j-1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i==0 && j!=0 && j!=40){
    sommeVoisins=t[i][j-1] + t[i+1][j-1] + t[i+1][j] + t[i+1][j+1] + t[i][j+1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i!=0 && i!=15 && j==0){
    sommeVoisins=t[i-1][j] + t[i-1][j+1] + t[i][j+1] + t[i+1][j+1] + t[i+1][j];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    if(i!=0 && i!= 15 && j!=0 && j==40){
    sommeVoisins=t[i-1][j] + t[i-1][j+1] + t[i][j+1] + t[i+1][j+1] + t[i+1][j] + t[i+1][j-1] + t[i][j-1] + t[i-1][j-1];
    int calculVoisins(int sommeVoisins, char t[i][j]);
    }
    }
    }
    }
     
     
     
    /* FONCTION DE GENERATION ALEATOIRE DE LA POPULATION */
     
    int PopAleatoire(char t[][y]){
     
    int i, j;
    char croix[]="+";
    int pop_aleatoire = 0;
    srand(time(NULL));
     
    for(i=0;i<15;i++){
    for(j=0;j<40;j++){
    pop_aleatoire = rand();
    t[i][j] = pop_aleatoire;
    if(t[i][j]%2==0){	// si les points de coordonnées correspondent à un chiffre pair
    printw(croix);
    }
    else{ // si les points de coordonnées correspondent à un chiffre impair
    printw(" ");
    }	// le fait de mettre un random avec l’affichage en chiffre pair ou impair permet de donner une probabilité de 50% (1/2) etant donné que l’intervalle est infini
    }
    }
    }
     
     
     
    /* FONCTION AFFICHAGE DE CARACTERES */
     
    int Affichage(char t[][y]){
    int i,j;
    char croix[]="+";
     
    for(i=0;i<15;i++){
    for(j=0;j<40;j++){
    if (t[i][j]==' '){
    printw(croix);
    }
    else{
    printw(" ");
    }
    }
    }
    return;
    }
     
     
     
    /* FONCTION MAIN */
     
    int main (void){
    char t[x][y];
    initscr();
    void Menu();
    refresh();
    endwin();
    return(0);
    }
    Je m’excuse par avance d'un si long message mais je n'ai pas réussi à trouver la commande spoil sur ce forum (si il y en a une).

    J'espère avoir apporté suffisamment de précisions à mon problème, dans le cas contraire n'hésitez pas à me le signaler.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Salut,

    Déjà pense à utiliser les balises faites pour afficher du code, histoire que ton message soit plus lisible.

    Concernant, ton problème, j'ai du mal à comprendre comment certaines choses peuvent compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main (void){
    char t[x][y];
    initscr();
    void Menu();
    refresh();
    endwin();
    return(0);
    }
    Le void devant Menu... par exemple essaye de rajouter les flags de compile -Wall ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch(getch()){
    case '1':
    clear();
    void EvolutionPop(char t[x][y]);
    break;
    void EvolutionPop(char t[x][y]) ....
    int SauverPop(char t[x][y]); ....

    Il faut que tu revoie la création et l'appel de fonction, je ne pense pas que ça soit très clair pour toi.

    C'est impossible que ton code compile... Tu doit te tromper de source quand tu compile.

    Corrige déjà ces problèmes, hésite pas si tu as toujours des soucis

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Points : 37
    Points
    37
    Par défaut
    Desolé pour les balises.
    Pourtant mon programme compile bien (la source correspond).
    Je ne connais pas les commandes ou instructions de flags -wall et autres, peux tu m'expliquer ou m'orienter vers un tuto correspondant s'il te plait(j'ai cherché mais pas trouvé quelque chose de concluant).

    Je vais revoir pour void EvolutionPop(char t[x][y]) int SauverPop(char t[x][y]); .

  4. #4
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par Arketran Voir le message
    Je ne connais pas les commandes ou instructions de flags -wall.
    wall pour warning all. En fait, il faut configurer ton compilateur pour afficher TOUS les warning. Car ce n'est n'est pas parce qu'il ne t'en affiche pas qu'il n'y en a pas. C'est peut-être juste parce qu'il est configuré 'bienveillant'. Ce qui n'est pas recommandé du tout.

    A+

    Pfeuh

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Salut,

    je viens de tester et tu peux placer des prototypes dans le code et le compilo ne râle pas de base, je suis étonné.

    le mieux pour corriger toutes tes erreurs est de rajouter les flags de compilations -Wall et -Wstrict-prototypes donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -Wstrict-prototypes file.c ...
    Ainsi, le compilo te dira les problèmes dont je t'ai parlé dans mon mail précédent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void EvolutionPop(char t[x][y]) ....
    int SauverPop(char t[x][y]); ....
    Une fonction est prototypée de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type_de_retour    nom_de_la_fonction(type_parametre_1 nom1, type_parametre_2 nom2, ...);
    Donc dans ton code tes déclarations sont correctes.

    C'est tes appels à tes fonctions qui sont fausses.

    Ton programme se termine tout de suite car Menu() n'est JAMAIS appelé.

    Quand tu fais void Menu() dans le main ... la ligne est sautée.
    De même pour les autres ligne que je t'ai citée dans mon précédent message.


    Bon courage,
    si tu as un soucis hésites pas.
    Pour appeler une fonction

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Si j'ai bien compris, la syntaxe que j'ai utilisé pour appeler la fonction tenait plus de la déclaration.

    Ainsi ça donnerait ceci :

    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
    void Menu();
    void EvolutionPop(char t[x][y]);
    int GenererAleatoire();
    void GenererDefaut();
    void ChargerPop();
    int SauverPop(char t[x][y]);
    void Aide();
    void Quitter();
     
    /* FONCTION MENU */
     
    void Menu(){
        printf("\n\n CONWAY'S GAME OF LIFE");
        printf("\n\n\n\n\t Choisissez votre mode :");
        printf("\n\n\n\n 1 : Lancer le jeu de la vie.\n\n");
        printf(" 2 : Engendrer une population aléatoire.\n\n");
        printf(" 3 : Population par défaut.\n\n");
        printf(" 4 : Charger une population.\n\n");
        printf(" 5 : Sauver une population courante.\n\n");
        printf(" 6 : Aide.\n\n");
        printf(" 7 : Quitter.");
     
        switch(getch()){
        case '1':
        clear();
        EvolutionPop(t[x][y]);
        break;
     
        case '2':
        clear();
        GenererAleatoire();
        break;
     
        case '3':
        clear();
        GenererDefaut();
        break;
     
        case '4':
        clear();
        ChargerPop();
        break;
     
        case '5':
        clear();
        SauverPop(t[x][y]);
        break;
     
        case '6':
        clear();
        Aide();
        break;
     
        case '7':
        clear();
        Quitter();
        break;
        }
    }
    De même pour l'appel de la fonction Menu dans la fonction main. J'ai une question.

    Lorsque j'exécute à nouveau mon programme, le menu apparaît rapidement dans la console, avant de disparaître. Cela peut-être dû à quoi ? Serait-ce utile d'utiliser la fonction usleep ?

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    C'est un peu mieux.

    Cependant ça ne doit plus du tout compiler, car t n'est plus déclaré :

    La encore pour les paramètre tu confond déclaration et appel, regarde l'appel de fonction avec paramètre sur le site que je t'ai donné.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Oui effectivement.

  9. #9
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par NeoKript Voir le message
    je viens de tester et tu peux placer des prototypes dans le code et le compilo ne râle pas de base, je suis étonné.
    C'est normal que ça marche. Par contre, tu n'as aucun moyen de partager tes fonctions avec les autres sources sans passer par un fichier .h

Discussions similaires

  1. excuter le programme sans rien afficher
    Par safa1990 dans le forum Caml
    Réponses: 1
    Dernier message: 27/05/2014, 19h25
  2. Quel est le programme qui est encours exécution
    Par iliesss dans le forum Windows 7
    Réponses: 5
    Dernier message: 23/05/2011, 16h56
  3. Programme qui ne s'exécute pas
    Par jeune ingénieure dans le forum Windows XP
    Réponses: 2
    Dernier message: 13/03/2011, 12h09
  4. Exécuter du code sans rien afficher
    Par Gébix dans le forum Débuter
    Réponses: 12
    Dernier message: 13/04/2009, 15h45
  5. Réponses: 8
    Dernier message: 08/05/2006, 20h40

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