[C] local function definitions are illegal

Fermé
spacy Messages postés 14 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 22 août 2006 - 19 janv. 2006 à 23:15
spacy Messages postés 14 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 22 août 2006 - 23 janv. 2006 à 01:37
bonsoir à tous
J'ai fait un programme simple pour un agenda de contacts en C, mais lors de la compilation j'ai eu 4 messages d'erreur : local function definitions are illegal .

Celà veut dire quoi au juste ? (je suis encore débutante en programmation, veuillez m'aider s'il vous plait)

Voici le code :

#include <stdio.h>
#include<stdlib.h>
/**variables globales**/

int i ;
int k;
/**declaration des structures et fonctions***/

void creation(struct individu contact);
void tri(struct individu tab[], int N);
void suppression(struct individu tab[],int i);
int recherche(struct individu tab[], int p, char nom) ;
void ajout(struct individu contact);
void edition();

/**definition des variables globales**/


/**definition des structures**/
typedef struct adr
{ int Nr;
int rue;
char ville;
};

typedef struct individu
{ char nom[20];
char prenom[20];
char phone[20];
adr adresse;
};

/**definition de variables**/

struct individu agenda[100];




void main()
{ int i;
int p;
char nom;
struct individu tab[100];
struct individu contact;
struct individu aucun;
agenda[0]=aucun;

printf("\t\t\tChoix:\n");
scanf("%d",i);
switch(i)
{case 1: creation(contact);
break ;
case 2: tri(agenda,p);
break;
case 3: recherche(tab,p,nom);
break;
case 4: ajout(contact);
break;
case 5: suppression (agenda,i);
break;
case 6: edition();
break;
case 7: exit(1);



}
/***Creation***/

void creation(struct individu contact)
{
if (agenda[0]==aucun)
{
printf("saisir le nom\n");

scanf("%d",agenda[0].nom);

printf("saisir le prenom\n");

scanf("%d",agenda[0].prenom);

printf("saisir l'adresse\n");

printf("la rue:\n");

scanf("%s",&agenda[0].adresse.rue);

printf("Nr :\n");

scanf("%d",&agenda[0].adresse.Nr);

printf("la ville:\n");

printf("%d",agenda[0].adresse.ville);
};
else printf("il y a deja un contact, voulez vous en ajouter?[o/n]\n");
scanf("%c",ch);
if(ch=='o')
ajout();



}

/***Tri on utilise un tri à bulles**/
void tri(struct individu tab[], int N)
{
int ok,i;
struct individu tampon;
do
{
ok=1; /* vrai */
for(i=1;i<N;i++)
if(tab[i-1].nom>tab[i].nom)
{
ok=0;
tampon=tab[i-1];
tab[i-1]=tab[i];
tab[i]=tampon;
}
}
while(!ok);
}

/***suppression***/
void suppression(struct individu tab[],int i);
{
int k,j;
j=recherche(agenda,p,nom);
for (k=j;k<p;k++)
agenda[k]=agenda[k+1];
p=p-1;
}

/***Recherche***/
int recherche(struct individu tab, int p, char nom)
/**c'est une recherche sequetielle**/

{
int i;
for(i=0;i<N;i++)
if(tab[i].nom==nom)
return(i);
printf("Ce contact n'existe pas");

}


/****Ajout***/
void ajout(struct individu contact)
{
char ch;
int p;

if (agenda[0]==aucun)
{printf("il n'ya aucun contact dans l'agenda, voulez vous en creer?[o/n]\n")
scanf("%c",ch);
if(ch==0)
{creation(contact);
p=1;
printf("voulez vous continuer?[o/n]\n");
scanf("%c",ch);
if (ch='o')
{
do{
printf("saisir le nom\n");
scanf("%d",agenda[p].nom);

printf("saisir le prenom\n");

scanf("%d",agenda[p].prenom);

printf("saisir l'adresse\n");

printf("la rue:\n");

scanf("%s",&agenda[p].adresse.rue);

printf("Nr :\n");

scanf("%d",&agenda[p].adresse.Nr);

printf("la ville:\n");

scanf("%d",agenda[p].adresse.ville);
p++; /****on y stocke le nombre de contact***/

printf("voulez vous continuer?[o/n]\n");
scanf("%c",ch);
}
}
while (ch=!o);
}
}

/***Edition***/
void edition()
{
int j;
for(j=0;j<p;j++)
{
printf("%d",&agenda[j].nom);
printf("%d",&agenda[j].prenom);
printf("%d",&agenda[j].phone);
printf("%d",&agenda[j].adresse.Nr);
printf("%d",&agenda[j].adresse.rue);
printf("%d",&agenda[j].adresse.ville);
}
}
A voir également:

12 réponses

Utilisateur anonyme
20 janv. 2006 à 08:08
Salam,
Il y a beaucoup de faute que vous devez corriger, d'abord mettez les déclarations des structures avant celles des fonctions.
2-Vous utilisez des variables sans les déclarer (exp: aucun et ch ...)
3-Appels de fonctions avec paramètres incorrects
4- quelques ';' dans le mauvais endroit.
.
.
.
Essayer de corriger les erreurs, puis executer.
A propos, quel compilateur C vous utilisez ?

Allah mo3ine
0
spacy Messages postés 14 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 22 août 2006
20 janv. 2006 à 13:05
D'abord merci pour l'aide, à vrai dire je suis encore débutante en C donc j'ai pas encore aquis le reflexe de saisir les erreur

Moi j'utilise visual studio 6.0

S'il te plait tu peux m'indiquer les endroits ou il y a le mauvais virgule et les appels de fonctions qui ne vont pas car j'arrive pas à les localiser

Merci d'avance
0
Utilisateur anonyme
20 janv. 2006 à 17:26
Si votre compilateur ne vous aide pas à localiser les erreurs, je vous conseille de travailler avec Turbo C++ que vous pouvez télécharger depuis : http://bdn.borland.com/article/0,1410,21751,00.html
Je vous conseille aussi de visiter le site http://www.pise.info/algo/introduction.htm
pour mieux comprendre comment réaliser un algorithme.

Si vous voulez que je vous envoi la correction du programme en entier donnez moi votre adresse e-mail pour que je puisse vous l’envoyer en pièce jointe.
Et puisque les messages ici sont publiques et tous le monde peut voir votre adresse, il vaut mieux que vous m’envoyez un e-mail à l’adresse hhhyyy@hotmail.fr
0
hibou57 Messages postés 130 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 4 juillet 2010 61
20 janv. 2006 à 17:51
Bonjour Spacy,

J'ai connu cette deception au début aussi. J'ai commencer à programmer en pascal, avant de programmer en C. Et en pascal, j'utilisait beaucoup les procédure locales.

Malheureusement, elles ne sont pas possibles en C, ni en C++ (contrairement au précédent qui te conseil de passer à C++, ça ne résoudra rien).

Il n'y a pas de solutions malheureusement à ce problème, et c'est decevant, je le sais, je suis tout à fait de ton avis.

Il faut savoir une chose au sujet du C. Si beaucoup de gens programme en C, c'est seulement parce qu'il est répandu, et non pas parce que c'est un bon langage. C est même un trés mauvais langage. Le pascal est nettement supérieur au C, et permet de faire autant de chose que le C.

Ce n'est pas parce que le C est répandu que c'est un bon langage. Pas du tout.

Si tu peu te le permettre, je te conseil plutôt de programmer en pascal, qui est bien conçu.

La possibilité de créer des procédures locales, est en effet un trés bon moyen de structuré un programme. En effet, pourquoi donc déclaré un procédure comme global, si elle n'est utilisé que par une seule fonction, et n'a pas de sens en dehors de cette fonction. Tu n'es pas au bout de tes mauvaises surprises avec le C... tu en aura beaucoup encore. Idem avec le C++.

Si d'ailleurs un jour tu veux faire de la programmation Objet, je te conseil le langage Eiffel plutôt que le C++.

Les langages qui sont répandu, ne le sont que pour des raisons commercial, et non pas pour des raisons de qualité. Les décideur font des choix commerciaux, et non pas des choix technique intelligents.

Voilà pour les explications (et pour l'expression de la deception que je partage avec toi).

P.S. Je prévoit un jour de travailler à la diffusion du langage pascal. Serais-tu interessée d'être informé quand je le ferai ? Si oui, alors dis moi, et je te laisse ici un e-mail (pas mon vrai, parce que c'est public ici), sur lequel tu pourra m'enoyer le tiens, et alors je t'enverrai mon vrai mail, que tu laissera en attente (peut-être assez longtemps, parce que je ne prévois pas d'y travailler tout de suite).

Je projète aussi de travailler sur une ammélioration de Eiffel, qui bien qu'étant le meilleur langage objet, est malheureusement trés déficient sur ses aspect procéduraux (mais l'aspect objet est trés bon).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
20 janv. 2006 à 19:06
Bonjour

désolé de t'interrompre dans ton grand discours, mais je suis pas trop d'accord avec toi. les classes sont un point fort du langage c++,ca peut devenir également un outil assez puissant. Puis autre chose personnelement j'aime bien le c++ et la tu te permets de dire que c'est nul alors non la pas d'accord que tu critiques. Au moins donne plutot les avantages du pascal, et je te rappelle que le c++ est concu comme langage objet. Sinon moi aussi je vais chercher les inconvénients du pascal et je les colle ici.

D'avance merci
0
hibou57 Messages postés 130 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 4 juillet 2010 61
21 janv. 2006 à 02:22
Houla... ce que c'est agressif un mec dès qu'il veut épater une nana... (mais c'est vrai que les nanas aiment ça aussi... donc ils s'y sentent encourager)

Pour commencer note qu'à un message argumenté de ma part, tu répond dans aucun argument (l'ennervement est l'apanage de ceux/celles qui n'ont rien à dire)

Que penser d'un langage qui permet des conversion implicite d'un type 32 bits vers un type 16 bits par exemple ? Ce qui a tout de même couté un lancement ariane (et couté quelque milliards au passage), c'est une de ces abération de ce langage. Aucun compilateur pascal n'aurait laissé passer une erreur pareil.

On se demande bien pourquoi le langage le plus répandu dans la pédagogie de l'algoritmique est pascal (je parle toute filière confondu). On ne compte plus les faq et les forums dédiés à la difficulté de lecture des programme... et au mauvaises surprise que cela reserve.

Quel sont les conseils donnés à cela par les concepteur du langage ? Hé bien tout simplement d'évité certaines construction du langage Comme les affectation incluse dans une expression de teste, les pre et post incrément (la liste est longue). Bref, quand les conseil donné sur un langage, en arrive à être d'éviter d'évité d'utiliser certaines caractéristique du langage, c'est que quelque chose ne tourne pas rond quand même.

Parce que excuse moi, je ne critique pas le C parce que je ne le connais pas, mais au contraire parce que j'en connais les moindre recoin.

D'ailleurs l'artiste... tu pourra jeter un oeil à un topic que j'ai laissé dans ce forum, et auquel aucun réponse ne semble possible.. et qui concerne justement le C. Encore dommage tiens... ;)

Au sujet du C++, même commentaire que pour le C, puisqu'il en a tous hérité.

On pourra parler par exemple de la syntax abscon pour déclarer qu'un routine ne modifie pas un objet (const = 0, ou même const = « n'importe quoi »). On parlera aussi de la clause de virtualité qui doit être décidé avant même la conception des descendantes d'une classe (ou comment prendre la conception objet à son contresens), etc, etc ... la liste serait aussi.

Au fait l'artiste... tu connais le pascal pour en parler comme ça ? J'attend tes arguments.

Et Eiffel... tu connais ? (j'en doute encore plus).

S'il te plait, avant de répondre : je ne parle pas que de connaitre de nom.

Tu connais quoi au juste ? Surement pas assez pour te permettre de faire des comparaisons.

Allez, je te laisse draguer... (ça lui epargnera d'apprendre des choses)

A+ ?
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
20 janv. 2006 à 20:08
Et au fait ce programme fonctionne, il suffit juste de comprendre et de corriger les erreurs.

Par exemple lorsque vous mettez if (agenda[0]==aucun),vous essayer de comparer deux structures et cela n'est pas possible. Vous devez comparer les champs des deux structures.

de meme lorsque vous déclarez une nouvelle fonction, ne mettez pas de " ; " après celle ci , comme par exemple :

void main(void)
{
}

C'est comme cela que se déclare chaque nouvelle fonction.
il est aussi préférable de mettre les autres fonctions, telles que ajout,recherche,etc.. au dessus de la fonction main() .

Autre chose encore, dans la fonction creation(), vois mettez "ajout();" . Le problème ici est que le prototype de la fonction ajout est : "void ajout(struct individu contact); ". Si aucun argument (je pense que c'est un oubli) ne lui est passé, cela génère une erreur.

Mais au vu de la fonction ajout(), je pense que c'est une erreur .
quand vous ajouter quelqu'un, vous demandez toutes les informations, qui normalement se trouvent dans une structure de type individu. Donc passer en argument une structure ne sert ici à rien ; il faudrait mieux faire comme suit :

void ajout()
{
struct individu contact;
......//suite du programme
......
}

pour disposer d'une fonction avec plusieurs constructeurs différents, il vous faudrait alors utiliser les classes ; par exemple avec les classes, vous pouvez avoir deux fois voire plus la même fonction mais définie différement.

Par exemple on peut avoir :

void ajout();
void ajout(struct individu contact);
void ajout(int statut);
etc...

J'aurais quand meme une question : le programme va t'il tourner sans etre arrêté?? car ici, lorsque le programme s'arretera, pus aucune données ne sera présentes. les espaces mémoires alloués pour le stockage des structures seront libérés.

Je vais essayer de finir de débugger le programme.

Au revoir
0
spacy Messages postés 14 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 22 août 2006
20 janv. 2006 à 21:12
Merci beaucoup à vous tous pour l'aide, et à vous spécialement arth, j'ai beaucoup appris de ton intervention, je vais essayé de corriger certaines erreurs et s'il vous plait si vous arrivez à une version finale du programme qui marche prière de me la poster afin que j'apprenne à mieux programmer en C.

Merci beaucoup encore une fois
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
20 janv. 2006 à 21:33
oki je n'y manquerais point .
0
spacy Messages postés 14 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 22 août 2006
21 janv. 2006 à 00:03
En fait je suis parvenue à corriger tous les erreurs et compiler le programme, mais j'ai eu un autre problème lors de l'exécution, c'est que j'ai atteint apparemment une zone mémoire qui ne peut pas etre "written", normalement c'est le système d'exploitation qui gère l'accès à la mémoire, comment puis je savoir si j'ai atteint une zone à accès interdit ou non ?? je comprends pas trop ce qui se passe ! pourriez vous m'aider svp
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
21 janv. 2006 à 12:16
Bonjour

oula la .. mais bon ca m'a bien fait rire ce matin. Alors le précise je ne connais rien au eiffel ni au pascal, je ne m'en cache pas d'ailleurs. Mais je n'ai rien dit dessus qui soit négatif si tu lis bien mon post.

Cependant dire de quelqu'un qui aide quelqu'un d'autre qu'il drague cette personne, la j'avoue ca me dépasse. M'enfin je dois être trop stupide pour comprendre, vu que j'utilise en plus un langage qui ne devrait pas être.

Etant étudiant en génie des télécoms et réseaux, on nous apprend le c et le java (hmm mais ou est passé ce pascal??) . La phrsae "Houla... ce que c'est agressif un mec dès qu'il veut épater une nana... (mais c'est vrai que les nanas aiment ça aussi... donc ils s'y sentent encourager) " , franchement ca m'a mis de bonne humeur. mais que vient -elle faire la?

Ah oui aussi,en cherchant un minimum, on trouve AUSSI des faq et des forums sur le c++. La encore je suis perplexe sur ce que tu me dis.

De plus cette personne veut de l'aide sur un programme en c++, elle n'attend pas qu'on lui dise de se mettre à un autre langage, et que celui sur lequelle elle créée cette apllication ne sert à rien.

Ton post ne sert à rien il me semble, étant donné que cela n'apporte rien. Je n'ai pas proposé non plus de donner mon mail à cette personne (pourtant pour toi je draguais non??), et qui lui propose de maider dans la diffusion d'un langage. Alors la c'est moi qui te demande de réflechir avant d'ecrire.

Et pourquoi m'appelles tu l'artiste? on ne se connait pas il me semble. Un minimum de respect donc.

Sur ce je m'en vais essayer de trouver ton post, je vais surement y trouver encore un long discours.

Bonne journée
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
21 janv. 2006 à 12:22
Pour spacy colle ton nouveau code ici.
0
spacy Messages postés 14 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 22 août 2006
23 janv. 2006 à 01:37
En fait arth voici le code (merci à hamzafes au passage), il ne contient aucune erreur mais j'arrive quand meme pas à l'executer, à chaque fois j'ai le message " L'instruction à "0X00402df4"emploie l'adreese memoire "0x00000000".La mémoire ne peut pas etre "written".) je ne sais pas comment regler le problème :


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



/**declaration des procedures et fonctions***/

void tri();
void suppression(char nom[]);
int recherche(char nom[]) ;
void ajout();
void edition();

/**definition des structures**/
typedef struct adr
{ int Nr;
int rue;
char ville;
};

typedef struct individu
{ char nom[20];
char prenom[20];
char phone[20];
adr adresse;
};


/**variables globales**/

int i ;
int k;
struct individu agenda[100];
int p=0;




/**********************************Tri****************************************/

/**on utilise un tri à bulles**/
void tri()
{
int ok,i;
struct individu tampon;
do
{
ok=1; /* vrai */
for(i=1;i<p;i++)
if(agenda[i-1].nom>agenda[i].nom)
{
ok=0;
tampon=agenda[i-1];
agenda[i-1]=agenda[i];
agenda[i]=tampon;
}
}
while(!ok);
}

/************************************Suppression*******************************/
void suppression(char nom[])
{
int k,j;
j=recherche(nom);
for (k=j;k<p;k++)
agenda[k]=agenda[k+1];
p--;
}

/************************************Recherche********************************/
int recherche(char nom[]) /**c'est une recherche sequetielle**/

{
int p, i;
while (i<p && strcmp(nom,agenda[i].nom))
i++;

if(i<p)
return i;
else
return -1;
}





/************************************Ajout********************************/
void ajout()
{

char ch; //ok


do
{ printf("\nIndividu No %d",p);
printf("\nsaisir le nom\t:");
scanf("%s",agenda[p].nom);
printf("\nsaisir le prenom:");
scanf("%s",agenda[p].prenom);
printf("\nsaisir l'adresse\t");
printf("\n\tla rue\t:");
scanf("%s",agenda[p].adresse.rue);
printf("\n\tNr\t:");
scanf("%d",agenda[p].adresse.Nr);
printf("\n\tla ville\t:");
scanf("%s",agenda[p].adresse.ville);
p++; /****on y stocke le nombre de contact***/
printf("\nvoulez vous continuer?[o/n]\t");
scanf("%c",&ch);

}while (ch=='o' || ch=='O');

}

/********************************Edition*********************************/
void edition()
{
int j;
for(j=0;j<p;j++)
{
printf("\n-Individu nr %d",j);
printf("\n\t%s",agenda[j].nom);
printf("\n\t%s",agenda[j].prenom);
printf("\n\t%s",agenda[j].phone);
printf("\n\t%d",agenda[j].adresse.Nr);
printf("\n\t%s",&agenda[j].adresse.rue);
printf("\n\t%s",agenda[j].adresse.ville);

}
}
/****************************************************************************/
int main()
{ int j,Choix;
int p;
char nom[20];




/**mise en forme**/
printf("\t\tAGENDA\n");
for(k=0;k<40;k++)
printf("_");
printf("\n");




printf("1- Tri\n");
for(k=0;k<40;k++)
printf("_");
printf("\n");

printf("2- Recherche\n");
for(k=0;k<40;k++)
printf("_");
printf("\n");

printf("3- Ajout\n");
for(k=0;k<40;k++)
printf("_");
printf("\n");

printf("4- Suppression\n");
for(k=0;k<40;k++)
printf("_");
printf("\n");

printf("5- Edition\n");
for(k=0;k<40;k++)
printf("_");
printf("\n");

printf("6- Fin\n");
for(k=0;k<40;k++)
printf("_");
printf("\n");
printf("\n");


printf("\t\t\tChoix:");
scanf("%d",&Choix);
switch(Choix)
{
case 1: tri();
break;
case 2:
{ printf("\nentrer le nom a rechercher\n");
scanf("%s",nom);
j= recherche(nom);
if(j!=-1)
printf("\n\tce contact existe et porte le nombre %d",j);
else
printf("le contact que vous cherchez n'existe pas\n");
}
break;
case 3: ajout();
break;
case 4: printf("entrez le nom de l'individu à suprimer\t:");
scanf("%s",nom);
suppression(nom);
break;
case 5: edition();
break;
case 6: exit(1);
}


}
0