Forum Clubic

[C] Erreur à la compilation avec une fonction

Bonjours à tous,

Je viens vous demandez de l’aide car j’ai un problème lors de la compilation d’un programme en C contenant une fonction.

Lors de la compilation avec Dev-C++ il m’affiche toujours la même erreur:


In function `teste': 
syntax error at end of input 

à la ligne qui correspond à la dernière accolade juste après le return(0)

Voila ma fonction:

int teste(int ligne, int colonne)
{
int lig;
int col;
int tab_mines[TAILLE][TAILLE];
int compteur;

if((lig==1 || lig==2 || lig ==3) && (col==1 || col==2 || col==3))
{
              compteur=0;
             if(tab_mines[lig-1][col]==0)compteur=compteur+1;
             if(tab_mines[lig-1][col+1]==0)compteur=compteur+1;
             if(tab_mines[lig-1][col-1]==0)compteur=compteur+1;
             if(tab_mines[lig+1][col]==0)compteur=compteur+1;
             if(tab_mines[lig+1][col+1]==0)compteur=compteur+1;
             if(tab_mines[lig+1][col-1]==0)compteur=compteur+1;
             if(tab_mines[lig][col+1]==0)compteur=compteur+1;
             if(tab_mines[lig][col-1]==0)compteur=compteur+1;
return(compteur);
}

et voici mon appel de la fonction:

compteur=teste(ligne,colonne);

merci à tous ceux qui prendront le temps de m’aider


int teste(int ligne, int colonne)
{
int lig;
int col;
int tab_mines[TAILLE][TAILLE];
int compteur;

if((lig==1 || lig==2 || lig ==3) && (col==1 || col==2 || col==3))
{
            compteur=0;
            if(tab_mines[lig-1][col]==0) compteur++;
            if(tab_mines[lig-1][col+1]==0)compteur++;
            if(tab_mines[lig-1][col-1]==0)compteur++;
            if(tab_mines[lig+1][col]==0)compteur++;
            if(tab_mines[lig+1][col+1]==0)compteur++;
            if(tab_mines[lig+1][col-1]==0)compteur++;
            if(tab_mines[lig][col+1]==0)compteur++;
            if(tab_mines[lig][col-1]==0)compteur++;
            return compteur;
  } // <--
}

Merci, la compilation se passe sans problème, mais maintenant quand j’exécute mon programme au lieu d’avoir la valeur de la variable"compteur", j’ai un nombre(exemple: 409600) qui s’affiche

je dirai qu’il manque un return si on ne rentre pas dans le if.
il faudrait aussi initialiser la variable compteur.

pour ton probleme d’affichage, peut tu nous montrer le bout de code que tu utilise?

Voila

/*debut du comptage des cases sans mines*/
                
                compteur=teste(ligne,colonne);
                
                /*fin du comptage des cases sans mines*/
                
                /*Sauvegarde du nombre de cases sans mines dans le tableau*/
                tab_sans_mines[ligne][colonne]=compteur;
                
                /*Remise a zeros du compteur*/
                compteur=0;
                
                /*Debut de l'affichage du tableau incluant le nombre de cases sans mines*/
                for(i=0; i<TAILLE; i++)
                {
                    for(j=0; j<TAILLE; j++)
                        {
                            printf("%d",tab_sans_mines[i][j]);
                        }
                            printf("\n");
                }

jmgchouchou> son erreur venait bien de l’accolade manquante et non du fait qu’il n’y a aucun retour car, selon les CFLAGS, cela est toléré ou pas car le compilo initialise EAX à 0 et dès qu’il n’y a aucun retour, le compilo retourne implicitement EAX via un RET qui lui même retourne de manière implicite EAX.
Ceci dit, il vaut mieux faire ainsi en effet :


int teste(int ligne, int colonne)
{
int lig;
int col;
int tab_mines[TAILLE][TAILLE];
int compteur;

    compteur=0;
    if((lig==1 || lig==2 || lig ==3) && (col==1 || col==2 || col==3))
    { 
           if(tab_mines[lig-1][col]==0) compteur++;
           if(tab_mines[lig-1][col+1]==0)compteur++;
           if(tab_mines[lig-1][col-1]==0)compteur++;
           if(tab_mines[lig+1][col]==0)compteur++;
           if(tab_mines[lig+1][col+1]==0)compteur++;
           if(tab_mines[lig+1][col-1]==0)compteur++;
           if(tab_mines[lig][col+1]==0)compteur++;
           if(tab_mines[lig][col-1]==0)compteur++;
           } // <--
 
 return compteur;
            
}

j’avais bien remarqué l’accolade manquante. je me suis simplement mal exprimé. :jap:
intéressante l’explication assembleur :slight_smile:

mais je vois toujours pas pour le problème d’affichage :??:

Je peux pas poster le code complet ici(+ de 200 lignes) donc je l’ai mis sur rapidshare

http://rapidshare.com/files/2537818/Demineur.c.html

pas vu d’erreur dans le code

pour l’affichage du tableau tab_sans_mines je rajouterais un espace après l’affichage de chaque case


 /*Debut de l'affichage du tableau incluant le nombre de cases sans mines*/
                for(i=0; i<TAILLE; i++)
                {
                    for(j=0; j<TAILLE; j++)
                        {
                            printf("%d ",tab_sans_mines[i][j]);
                        }
                            printf("\n");
                }

Voila ce que j’obtiens comme erreur

http://img506.imageshack.us/img506/1429/sanstitre2ef2.jpg

j’ai testé et dans la fonction teste(int,int) si je ne met pas de return, ca plante
donc


int test(int l, int c)
{
 //le code
 if(qqch)
 {
 }
 return compteur;

}

apparament les CFLAGS ne tolère pas ce manque et le compilo ne le corrige pas. (voir un peu plus haut)

Ca retourne bien 0 chez moi.

Oui moi aussi si je fais comme ça ça retourne 0, mais ça ne doit pas retourner 0 justement(du moins pas dans le contexte dans lequel je l’ai testé)

Je vous remercie d’avoir regarder mon problème, mais ce n’est pas grave, ça marche sans fonction, c’est juste que l’on vient de les voir donc je voulais en mettre dans mon projet, mais je ne pense pas que l’on m’en tiendra rigueur…

Si je croise mon chargé de TD je lui demanderai

ca peut aussi dépendre du compilo
j’ai utilisé devc++ (oui, je sais c’est mal) qui normalement utilise gcc.
sachant que ma version est ancienne…

Pourquoi utiliser devc++ c’est mal?(je l’utilise sous windows)

C’est pas que c’est le mal mais disons qu’il date, qu’il n’est plus développé et qu’une fois qu’on a testé son fils spirituel à savoir code::blocks, on se dit que revenir sur DevC++ c’est comme passer du C++ au Java :MDR

c’est juste une blaguounette du fait qu’il n’est plus dévellopé et donc plus mis a jour. (en gros une boutade entre développeurs :wink: )

Cela veux dire que si j’ai des erreurs de compilation avec Dev c++ il se peut que je ne les ai plus sous un autre compilateur mis à jours?

Pas forcément, avec code::blocks tu peux choisir différents compilateurs dont gcc mais si tu en choisis un autre, il y a une forte probabilité que les erreurs surviennent.
De toute façon, il est toujours de bon ton de ne pas dépendre du compilateur mais de son code qu’il faudra donc corriger soit même.

Bonjour a tous! Je suis un peut un débutant et moi aussi j’ai un petit problème. En fait lorque je compile mon programme dev c++ me marque " `choix’ undeclared (first use in this function) " alor que j’ai deja mis choix plus haut. Je ne comprend pas. voila mon code.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
do
{
long compteur = 0;
long nombreEntre = 0, nombreMystere = 0;
const long MAX =100, MIN = 1;

srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN; // nbe aleatoire

do
{
compteur++;
printf(" quel est le nombre mystere?");
scanf("%ld", &nombreEntre);

if ( nombreEntre < nombreMystere )
printf(" Plus grand!\n\n");
else if ( nombreEntre > nombreMystere )
printf(“Plus petit!\n\n”);
else
printf(“Vous avez trouver le nombre mystere en %d coups! BRAVO!!\n\n”, compteur);
}
while ( nombreEntre != nombreMystere );

long choix = 0;
printf(" recommencer partie?\n");
printf(“0 oui\n”);
printf(“1 non\n”);
scanf ("%d", &choix);
} while ( choix == 0);

system(“PAUSE”);
return 0;
}

L’erreur est au niveau de " recommencer partie". Si quelqu’un pourait m’aider sa serait très sympa merci ^^