Comment organiser des procedures avant main

Résolu/Fermé
zaratta Messages postés 19 Date d'inscription mardi 4 décembre 2007 Statut Membre Dernière intervention 15 août 2008 - 27 avril 2008 à 20:13
zaratta Messages postés 19 Date d'inscription mardi 4 décembre 2007 Statut Membre Dernière intervention 15 août 2008 - 28 avril 2008 à 23:32
Bonjour,
#include<stdio.h>
#include<conio.h>
#include<string.h>

// * la procedure de confirmation *

void conf(char sc[120][17],int *f,char *o,char t)
{
if (sc[*f][15]==t){
(*f)++;
}
else{
printf(" ON S'ATTEND A : %s \n",o);
}

}

// * la procedure DECLARATION *

void dec(char sc[120][17],int i)
{ char *o="UNE VARIABLE";
char *p="UN BEGIN";
switch (sc[i][15]){
case 'c': { var(sc,i);
pp(sc,i);

break; }

case 'b': { pp(sc,i);

break; }

default : printf(" ON S'ATTEND A : %s OU A : %s \n",o,p);;

}
}

// * la procedure principale PASCAL *

void pas(char sc[120][17],int i)
{ char *o="UN PROGRAM";
char *p="UN IDENTIFICATEUR";
char *q="UN POINT VIRGULE";
switch (sc[i][15]){
case 'a': { conf(sc,&i,o,'a');
conf(sc,&i,p,'x');
conf(sc,&i,q,'o');
dec(sc,i);

break; }

default:printf(" ON S'ATTEND A : %s \n",o);;

}
}

// * la procedure VARIABLES *

void var(char sc[120][17],int i)
{ char *o="UNE VARIABLE";
switch (sc[i][15]){
case 'c': { conf(sc,&i,o,'c');
l_v(sc,i);

break; }

default : printf(" ON S'ATTEND A : %s \n",o);;

}
}

// * la procedure L_V *

void l_v(char sc[120][17],int i)
{ char *o="UN IDENTIFICATEUR";
char *p="DEUX POINTS ";
char *q="TYPE DE VARIABLE";
char *r="UN POINT VIRGULE";
switch (sc[i][15]){
case 'x': { l_ident(sc,i);
conf(sc,&i,p,'p');
conf(sc,&i,q,'d');
conf(sc,&i,r,'o');
l_v1(sc,i);

break; }

default : printf(" ON S'ATTEND A : %s \n",o);;

}
}

// * la procedure L_V1 *

void l_v1(char sc[120][17],int i)
{
switch (sc[i][15]){
case 'x': { l_v(sc,i);

break; }

default : ;

}
}

// * la procedure L_IDENT *

void l_ident(char sc[120][17],int i)
{ char *o="UN IDENTIFICATEUR";
char *p="UNE VIRGULE";
switch (sc[i][15]){
case 'x': { conf(sc,&i,o,'x');
conf(sc,&i,p,'q');
l_ident1(sc,i);

break; }

default : printf(" ON S'ATTEND A : %s \n",o);;

}
}

// * la procedure L_IDENT1 *

void l_ident1(char sc[120][17],int i)
{ switch (sc[i][15]){
case 'x': {
l_ident(sc,i);

break; }

default : ;

}
}
main(){............
............ }

bon voici mon probleme:
j'ai déclaré des fonctions avant le main, mais quand j'ai compileron m'affiche ce message
"function sould have a protype" pour certaines de ces fonctions
c à d :il y a des fonctions appelées par des fonctions qui sont déclarées avant

ma question comment dois-je procéder pour les organiser?

et surtout ne me proposez pas de les placer avant ( car g besoin qu'ils soient dans cet ordre )

merci d'avance
A voir également:

3 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
27 avril 2008 à 20:28
Salut,


Pour pouvoir utiliser une fonction il n'y a pas mille règles.
Soit tu la définie avant l'utilisation, soit tu écrit un prototype et la définition tu le mettra après l'emplacement où tu l'utlises.

Tu peux écrire les prototypes dans un fichier programme.h et les fonctions dans un fichier programme_fonctions.c

Lit bien les messages d'erreurs pour voir les nom des fonctions qui pose des problèmes.

Par exemple si je fait comme ça

#include<stdio.h>

int main()
{
   fonction1();
   return 0;
}

void fonction1(){
...........
}

je vais avoir un message d'erreur puisque j'essaie d'utilsier fonction1() dans main sans l'avoir préalablement déclarée.

Donc soit j'écrit comme ça
#include<stdio.h>
void fonction1();

int main()
{
   fonction1();
   return 0;
}

void fonction1(){
...........
}

soit comme ça
#include<stdio.h>

void fonction1(){
...........
}

int main()
{
   fonction1();
   return 0;
}

0
zaratta Messages postés 19 Date d'inscription mardi 4 décembre 2007 Statut Membre Dernière intervention 15 août 2008 1
28 avril 2008 à 01:08
merci infiniment pour ta réponse....

j"ai essayé avec cette méthode ...

#include<stdio.h>
void fonction1();

int main()
{
fonction1();
return 0;
}

void fonction1(){
...........
}

et apres complilation on m'affiche:
" Extra parameter in call to fonction1() "

par exemple la procédure VAR(); qui appelle la procédure l_v(); qui vient juste aprés
par conséquence "function 'l_v' should have a protype"
sachant aussi qu'on est pas encore rentré dans main()

bonne soirée à tous et surtout merci d'avance
0
Newtron Messages postés 2 Date d'inscription samedi 19 avril 2008 Statut Membre Dernière intervention 28 avril 2008 9
28 avril 2008 à 09:46
la fonction doit etre declarée soit:
- par simple prototype avant main() puis definition complète apres main()
- par definition complete avant main()

N.B : 1- l'entete de la fonction (= la ligne contenant le nom de la fonction et ses parametres) doit preceder l'appel de cette fonction, donc l'ordre de la declaration des fonction doit etre le meme ordre de l'appel des fonction si on est hors main car les fonctions qu(on declare ne sont pas toutes appelées dans main() mais peuvent etre appelées par des autres fonctions. Donc, la declaration d'une fonction non-utilisée dans main() mais dans une autre fonction doit etre avant la declaration de cette derniere (la fonction appelante)

2-les arguments dans l'entete d'une fonction doivent etre les memes qu'on appelle la fonction, dans le sens qu'on doit respecter les types et l'ordre (les noms des variables n'est pas important).

3-le msg d'erreur: - "...should have a prototype...." signifie oubien la fonction n'est pas declarée, oubien declarée aprés son appel, oubien le nom utilisé lors de l'appel ne coincide pas avec le nom de la fonction declarée, N.B: la casse est sensible.
- "..........extra parametre....." signifie que le nombre d'arguments n'est pas respecté.
0
zaratta Messages postés 19 Date d'inscription mardi 4 décembre 2007 Statut Membre Dernière intervention 15 août 2008 1
28 avril 2008 à 23:32
bon salut à tout lemonde...
je vous remercie tous pour vos précieuses réponses
ma solution était de declaré un prototype void fonction();
avant la fonction qui l'appelle c à d:

#les includes<.............h>
void fonction();
void fonction_appelante()
{ ...........................
fonction();
...........................
}
void fonction(char o,int p)
{ ...........................

...........................
}
main(){................................
.............................

}

et aussi ( et surtout ), les parametres du prototype..comme suit:

#les includes<.............h>
void fonction(char s(ou o,ou n'importe),int k);
void fonction_appelante()
{ ...........................
fonction();
...........................
}
void fonction(char o,int p)
{ ...........................

...........................
}
main(){................................
.............................

}
0