Erreur de compilation pour serpent

Fermé
osmi2013 Messages postés 4 Date d'inscription jeudi 14 mars 2013 Statut Membre Dernière intervention 2 avril 2013 - Modifié par Chris 94 le 14/03/2013 à 17:14
osmi2013 Messages postés 4 Date d'inscription jeudi 14 mars 2013 Statut Membre Dernière intervention 2 avril 2013 - 19 mars 2013 à 09:48
Bonjour,

Je suis un programmeur debutant et j'ai choisi c comme point de depart.J'ai copier sur un site un programme du jeu serpent que j'ai entrer dans turbo c++.Apres avoir fini,j'ai lance la commande debug aussito le logiciel m'indique des erreur:fonction should have a return value.Le probleme c'est que je ne sais pas quelles valeurs les fonctions check(),en() et win() doivent retourne.Merci de bien vouloir m'eclaisir sur ce sujet.

#include <graphics.h> 
#include <stdlib.h> 
#include <dos.h> 
#include <conio.h> 
#include <stdio.h> 
#include <time.h> 

check(); 
end(); 
win(); 
int m[500],n[500],con=20,TEMP; 
clock_t start,stop; 
 void main(void) 
{ 

int gd=DETECT,gm,ch,maxx,maxy,x=13,y=14,p,q,spd=100; 
int a=0,i=0,j,t,temp; 
initgraph(&gd,&gm,"..//bgi"); 

setcolor(WHITE); 
settextstyle(3,0,6); 
outtextxy(200,2,"  "); 
settextstyle(6,0,2); 
outtextxy(20,80," Use Arrow Keys To Direct The Snake "); 
outtextxy(20,140," Avoid The Head Of Snake Not To Hit Any Part Of Snake"); 
outtextxy(20,160," Pick The Beats Untill You Win The Game "); 
outtextxy(20,200," Press 'Esc' Anytime To Exit "); 
outtextxy(20,220," Press Any Key To Continue "); 

outtextxy(20,220," DONT FORGET TO GIVE U R VALUABLE OPINION "); 
ch=getch(); 
if(ch==27) exit(0); 
cleardevice(); 
maxx=getmaxx(); 
maxy=getmaxy(); 

randomize(); 

p=random(maxx); 
temp=p%13; 
p=p-temp; 
q=random(maxy); 
temp=q%14; 
q=q-temp; 



 start=clock(); 
 while(1) 
{ 

 setcolor(WHITE); 
 setfillstyle(SOLID_FILL,con+5); 
 circle(p,q,5); 
 floodfill(p,q,WHITE); 

   if( kbhit() ) 
   { 
     ch=getch(); if(ch==0) ch=getch(); 
     if(ch==72&& a!=2) a=1; 
     if(ch==80&& a!=1) a=2; 
     if(ch==75&& a!=4) a=3; 
     if(ch==77&& a!=3) a=4; 
      } 
       else 
     { 
     if(ch==27 
     ) break; 
     } 

       if(i<20){ 
     m[i]=x; 
     n[i]=y; 
     i++; 
        } 

   if(i>=20) 

   { 
     for(j=con;j>=0;j--){ 
      m[1+j]=m[j]; 
      n[1+j]=n[j]; 
       } 
     m[0]=x; 
     n[0]=y; 

     setcolor(WHITE); 
     setfillstyle(SOLID_FILL,con); 
     circle(m[0],n[0],8); 
     floodfill(m[0],n[0],WHITE); 

     setcolor(WHITE); 
     for(j=1;j<con;j++){ 
    setfillstyle(SOLID_FILL,con+j%3); 
     circle(m[j],n[j],5); 
     floodfill(m[j],n[j],WHITE); 
          } 
       delay(spd); 

    setcolor(BLACK); 
    setfillstyle(SOLID_FILL,BLACK); 
     circle(m[0],n[0],8); 
     floodfill(m[0],n[0],BLACK); 

     setcolor(BLACK); 
    setfillstyle(SOLID_FILL,BLACK); 
     circle(m[j],n[j],5); 
     floodfill(m[j],n[j],BLACK); 

     } 
     stop=clock(); 
     t=(stop-start)/CLK_TCK; 
     //printf(" TIME %d sec   ",t); 
     //printf("SCORE %d",con-5); 
     check(); 

    if(x==p&&y==q) { con=con+5; if(spd>=5) spd=spd-5; else spd=5; 
           if(con>490) win(); 
     p=random(maxx); temp=p%13;  p=p-temp; 
     q=random(maxy); temp=q%14;   q=q-temp; 
         } 
    if(a==1)  y =  y-14; if(y<0) { temp=maxy%14;y=maxy-temp;} 
    if(a==2)  y =  y+14; if(y>maxy) y=0; 
    if(a==3)  x =  x-13; if(x<0) { temp=maxx%13;x=maxx-temp;} 
    if(a==4)  x =  x+13; if(x>maxx) x=0; 
    if(a==0){  y = y+14 ;  x=x+13; } 
   } 

 } 


check(){ 
   int a; 
   for(a=1;a<con;a++) 

if(m[0]==m[a] && n[0]==n[a]) end(); 
   else continue; 

   } 
end() 

{ 

    int j,i; 
   setcolor(WHITE); 
   for(i=0;i<5;i++){ 
   delay(500); 
    cleardevice(); 
    delay(500); 
   for(j=0;j<=con;j++){ 
     setfillstyle(SOLID_FILL,RED); 
     circle(m[j],n[j],5); 
     floodfill(m[j],n[j],WHITE); 
    } 

   } 

    settextstyle(3,0,4); 
    outtextxy(150,150,"    GAME OVER "); 
    getch(); 
    getch(); 
    exit(0); 
    } 

win() 
{ 
int j,i; 
setcolor(WHITE); 
   for(i=0;i<5;i++){ 
   for(j=0;j<=con;j++){ 
     setfillstyle(SOLID_FILL,con); 
     circle(m[j],n[j],5); 
     floodfill(m[j],n[j],WHITE); 
    } 
    delay(500); 
    cleardevice(); 
    delay(500); 
   } 
  settextstyle(3,0,4); 
  outtextxy(210,320," YOU WIN "); 
  getch(); 
  exit(0); 
}
A voir également:

4 réponses

[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié par [Dal] le 15/03/2013 à 10:23
Bonjour osmi2013,

Ce programme n'est sans doutes pas le meilleur code source pour apprendre.

Vu l'ancienneté des outils sur lesquels il tourne, il a même peut-être été rédigé avant que le standard ANSI du C ne voit le jour, et en tout cas, il fait usage de fonctions non standard du C propres à Borland, et le style du programmeur laisse une grande place à la discussion.

Sinon, il est probable que le compilateur t'avertisse du fait que en définissant les prototypes des fonctions de la façon suivante :

check();

Cela signifie implicitement en C que la fonction doit implicitement retourner un "int", ce qu'elle ne fait pas, puisque la fonction check() programmée dans ce code ne retourne rien (elle devrait utiliser return pour renvoyer un entier ayant une signification quelconque dans le cadre du programme). Pareil pour les deux autres, qui ne renvoient rien non plus et se contentent de terminer le programme (avec exit).

Je pense que le programmeur a fait une erreur de conception, et qu'il aurait dû explicitement spécifier que ces fonctions ne renvoient rien, et donc un prototype void check(); et une implémentation void check() { /* suite du code */, ou même, tant qu'à faire, void check(void) pour explicitement indiquer aussi qu'il n'y a pas d'arguments à la fonction.

Faire pareil pour les deux autres fonctions.

Enfin, utiliser Turbo C++ pour apprendre le C d'aujourd'hui n'est peut-être pas le meilleur choix. La première version du standard C n'a été finalisée qu'en 1989. J'ignore quelle version de Turbo C tu utilises. En ce qui me concerne, ma dernière utilisation de ce compilateur (que j'ai d'ailleurs adoré avec Turbo Pascal aussi) date d'avant le standard :-)


Dal
1
Stolous Messages postés 30 Date d'inscription jeudi 14 mars 2013 Statut Membre Dernière intervention 15 septembre 2014 4
14 mars 2013 à 23:59
Bonsoir,
D'ou viennent tes fameuses fonctions?

si c'est de ton programme tu doit avoir un
return 
dans ta fonction, sinon si c'est une Bibliothèque regarde dans ses sources.

désolé si je ne t'ai pas beaucoup t'aider.
0
Merci c'est jentille de m'aider.Je crois que j'ai essaye d'ecrire un programme sans pour autant comprendre l'algorithme qui est traduit j'aimerais que quelqu'un qui a deja vu ce programme ou fait un programme similaire me donne des astuces sur le types de variables qui doivent etre retourne dans les fonctions car elles n'appartiennent pas a la bibliotheque.
0
osmi2013 Messages postés 4 Date d'inscription jeudi 14 mars 2013 Statut Membre Dernière intervention 2 avril 2013
18 mars 2013 à 09:21
Merci Dal.J'ai fait ce que tu m'as dit j'ai utilise void pour indiquer au compiler que la fonction ne retoune rien du tout et la compilation a marche.Ensuite j'ai tente d'executer le programme mais je recois ces erreur:
linker Error:Undefined symbol _getmaxx in module Snake.CCP
linker Error:Undefined symbol _cleardevice in module Snake.CCP
linker Error:Undefined symbol _outtextxy in module Snake.CCP
linker Error:Undefined symbol _settextstyle in module Snake.CCP
linker Error:Undefined symbol _initgraph in module Snake.CCP
Merci de bien vouloir me dire pourquoi cela s'affiche.Et a ton avis quel compiler je devrais utiliser j'avais installe Microsoft Visual c++ 2010 express mais la version ne dure que 15 jour
.
0
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié par [Dal] le 18/03/2013 à 13:10
Salut osmi2013,

1.

Tu disais dans ton message d'origine "J'ai copier sur un site un programme du jeu serpent que j'ai entrer dans turbo c++".

Alors, je pensais que tu utilisais Turbo C de Borland et non Visual c++ 2010 express.

Comme je le disais dans mon message précédent, ce programme fait usage de fonctions non standard du C propres à Borland. Il est donc normal qu'un autre environnement de développement ne les trouve pas, et ne puisse pas produire l'exécutable. Là, ton Visual C++ se plaint de ne pas savoir où trouver les fonctions graphiques. Pour le faire fonctionner tel quel, il faudrait utiliser Turbo C, qui intègre les bibliothèques d'origine.

Mais je ne te recommande pas de travailler avec un compilateur si ancien.

2.

Le code pourrait être utilisable avec WinBGIm (une bibliothèque fonctionnant avec le compilateur libre MinGW sous Windows (MinGW est le portage du compilateur gcc sous Windows), pour reproduire les fonctions graphiques Borland).

http://winbgim.codecutter.org/

A partir de cette page, tu peux te procurer deux environnements de développement gratuits, sous Windows, qui incluent cette bibliothèque, et d'autres émulant des fonctions issues de Borland aussi, "conio" et "conio2" aussi par exemple, pour t'éviter d'avoir à installer toi même ces bibliothèques compatibles avec les environnements Borland (ce qui peut être une tâche ardue pour un débutant).

http://quincy.codecutter.org/
ou
http://codeblocks.codecutter.org/

Si tu veux utiliser un compilateur moderne (c'est mieux), Codeblocks avec MinGW est très bien, et gratuit, et plus complet que Quincy, a priori (d'après ce que j'ai lu, car je n'ai jamais utilisé "Quincy").

La version de Codeblocks accessible sur ce site est une version adaptée (non issue du projet officiel Codeblocks http://www.codeblocks.org/), et qui inclue WinBGIm (avec d'autres choses utiles préinstallées, comme GLUT, wxwidgets, FLTK,...).

Après avoir installé cette version utilise le wizard, qui d'après ce que j'ai vu devrait se trouver sur File - New - Project - WinBGIm Project pour un projet pré-paramétré gérant cette bibliothèque, et copie ton code dans le main.

Tente la compilation, puis l'exécution. Avec un peu de chance, cela devrait passer :-) ou peut-être avec des adaptations minimales au code ou aux paramètres du prrojet.


Dal
0
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié par [Dal] le 18/03/2013 à 13:18
Sinon, tu peux te procurer le "vrai" Codeblocks, plus à jour que celui-là, ici : http://www.codeblocks.org/downloads/26 (version mingw-setup pour une version incluant le compilateur), ou tu as un lien de téléchargement direct ici : https://www.commentcamarche.net/telecharger/developpement/6161-code-blocks/

Il te faudra ensuite installer les bibliothèques additionnelles dont tu as besoin.

Si tu ne sais pas comment faire, tu peux t'inspirer des indications de cette fiche pratique :

https://forums.commentcamarche.net/forum/affich-37594493-codeblocks-installer-une-bibliotheque-librairie

La version disponible sur codecutter.org t'évite de le faire, au prix d'avoir à utiliser une version moins à jour de Codeblocks et de MinGW (actuellement, la dernière mise à jour faite par l'auteur de ce re-packaging date de 2011).


Dal
0
osmi2013 Messages postés 4 Date d'inscription jeudi 14 mars 2013 Statut Membre Dernière intervention 2 avril 2013
19 mars 2013 à 09:48
merci ennormement,je vais faire ce que tu m'as dit et on vera le resultat
0