1- La présence de ces trois variables globales
1 2
| theme *T[TAILLE];
int n=0,code=1; |
me décourage complétement d'aller explorer le code (aller chercher tous les n dans le code...).
De plus la présentation du code (indentation aléatoire) ne facilite pas la lecture.
2- Quelques remarques faites par mon compilateur et qui auraient dû être faites par le tien si il était bien réglé.
- Appels de fonctions sans prototype : il faut savoir que, par exemple
void afficher_msg_hierar();
ne constitue pas un prototype puisque le type des arguments n'est pas spécifié. On doit écrire :
void afficher_msg_hierar(void);
- Une erreur
1 2 3 4
| void menu_deposer_sujet()
{
.....
while(choix==1) |
Même erreur dans void menu_after_afficher()
- La fonction msg* trouver_message(int code_msg) doit renvoyer une valeur , ce qui n'est pas toujours le cas
1 2
| if(msg_rech==NULL) {printf("ce message n'existe pas");menu_after_afficher();}
else return msg_rech; |
idem pour main() qui doit retourner un int
3- Toutes ces fonctions qui n'ont pas de paramètres! Il faut les utiliser au lieu de passer par des variables globales
4- Il y a d'autres erreurs après un coup d'oeil rapide.
- Dans la première fonction appelée :
1 2 3 4 5
| void debut()
{
char choix;
....
scanf("%d",&choix); |
choix n'est pas un int, comme le suppose le format "%d" --> plantage.
Avec scanf, il faut que la variable de destination soit parfaitement en accord avec le format.
Pourquoi cette construction baroque pour cette fonction au lieu d'avoir :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void debut()
{
int choix;
do
{
MenuPrincipal();
scanf("%d",&choix);
switch(choix)
{
case 1: menu_ajout_theme();
break;
case 2: menu_deposer_sujet();
break;
case 3: menu_afficher();
break;
}
getch();
}while(choix!=0);
} |
- void afficher_theme_ordre_alphabetique() :
1 2 3 4
| char *copie[n];
if(n==0) printf("aucun theme n'a encore ete saisi");
else
{ |
Le test est trop tard : si n==0 on a essayé de créer un tableau de taille nulle ce qui n'est pas permis
1 2 3 4
| if(n==0) printf("aucun theme n'a encore ete saisi");
else
{
char *copie[n]; |
Ceci ne peut pas marcher :
1 2
| char *p=(char *)malloc(sizeof(char));
strcpy(p,T[i]->nomdetheme); |
On n'a réservé que 1 char avec le malloc(), juste de quoi mettre le '\0' terminal. Le strcpy() va faire planter sauf si la chaine à copier est...vide
-
1 2 3 4
| void tri_nom(char *tab[]) :
char *ech;
....
strcpy(ech,tab[i]); |
va planter : on n'a réservé cette fois aucune place pour faire la copie
etc.
Partager