[ C ] Archi-debutant segfault sur petit programme :-(

Archi-debutant segfault sur petit programme :-( [ C ] - C - Programmation

Marsh Posté le 15-03-2005 à 13:45:42    


Mon programme (un petit exo que j'avait fait en perl que je refait en C pour m'apprendre) fonctionne mais il ya une erreur de segmentation des que je le quitte.
(je n'ose pas poster le code car je débute ...sic)
 
Que veut dire ce genre de backtrace ??
 

Code :
  1. 0x00000000 in ?? ()


 


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 13:45:42   

Reply

Marsh Posté le 15-03-2005 à 13:50:15    

NiQoZ1 a écrit :

Mon programme (un petit exo que j'avait fait en perl que je refait en C pour m'apprendre) fonctionne mais il ya une erreur de segmentation des que je le quitte.


Donc il ne fonctionne pas.
 

Citation :

Que veut dire ce genre de backtrace ??
 

Code :
  1. 0x00000000 in ?? ()



Rien il faut poster le code.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-03-2005 à 14:00:02    

tu a tout a fait raison.
C'est un programme tout simple de calcul de moyenne le programme demande le prenom et une note en boucle jusqu'a la saisie de 'q' et renvoi les moyennes des prenoms. On peut rentrer plusieur fois le même prenom (c'est la seule difficulté...enfin pour moi).
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define BIGMAX 80
  5. #define MAX 20
  6. #define FAIL 1
  7. void RempliList(char *un_prenom, char prenom[]);
  8. void Affiche(char **liste, float tabnote[], short int tab_multi[], unsigned int max);
  9. int
  10. main(void) {
  11. char *listprenoms[MAX];
  12. float tab_notes[MAX];
  13. short int tab_multi[MAX];
  14. float note;
  15. char prenom[BIGMAX];
  16. unsigned int existe, test, i, j = 0;
  17. size_t s;
  18. for (i = 0; i < BIGMAX; i++) {
  19.  listprenoms[i] = NULL;
  20.  tab_multi[i] = 0;
  21. }
  22. i = 0;
  23. while (1) {
  24.  existe = 0;
  25.  printf("Saissisez le prenom ?\n" );
  26.  scanf("%s", prenom);
  27.  /* Sort si 'q' est pressé */
  28.  if ((prenom[0] == 'q') && (prenom[1] == '\0')) break;     s = strlen(prenom);
  29.  if (prenom[s - 1] == '\n') prenom[s - 1] = '\0';
  30.  printf("Saississez la note ?\n" );
  31.  scanf("%f", &note);
  32.   /* Teste dans la liste "listprenoms" si "prenom" existe    et, si oui  modifie sa note. "tab_multi" enregistre le     nombre de notes pour chaque prenom afin d'extraire     ensuite la moyenne...*/
  33.   for(j = 0; j < i; j++) {
  34.    if (listprenoms[j] != NULL) {
  35.     if ((test = strcmp(prenom, listprenoms[j])) == NULL) {
  36.      tab_notes[j] += note;
  37.      tab_multi[j]++;
  38.      existe = 1;
  39.      break;
  40.     }
  41.    }
  42.   }
  43.   /*Allocation dynamique */
  44.   if (!existe) {
  45.   if ((listprenoms[i] = malloc(strlen(prenom) + 1)) == NULL) {
  46.    perror("malloc()" );
  47.    exit(FAIL);
  48.   }
  49.   /* Mise en memoire */
  50.   RempliList(listprenoms[i], prenom);
  51.   tab_notes[i] = note;
  52.   tab_multi[i]++;
  53.   }
  54.   i++; /*incremente i a chaque boucle while */
  55. }
  56.  Affiche(listprenoms, tab_notes, tab_multi, i); /*Affiche les moyennes */
  57. for (j = 0; j < i ; j++) {
  58.  free(listprenoms[j]);
  59.  tab_notes[j] = '0';
  60.  tab_multi[j] = '0';
  61. }
  62. return(0);
  63. }
  64. void RempliList(char *un_prenom, char prenom[])
  65. {
  66. char *ptr;
  67. if ((ptr = strcpy(un_prenom, prenom)) == NULL) {
  68.  perror("strcpy!" );
  69.  exit(1);
  70. }
  71. }
  72. void
  73. Affiche(char **liste, float tabnote[], int short tab_multi[],unsigned int max)
  74. {
  75. int i;
  76. for (i = 0; i < max; i++)
  77.  if (liste[i] != NULL)
  78.   printf("\nPrenom = %s\nNote moyenne =%2.2f\n", liste[i], tabnote[i] / tab_multi[i]);
  79. }


 
Je suis sous linux pour info... Je reprécise que je débute en programmation et c'est mon premier programme en c.


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 14:12:56    

scanf("%s", prenom);
 
beurk, utilise fgets
 
#  if ((ptr = strcpy(un_prenom, prenom)) == NULL) {
#         perror("strcpy!" );
#         exit(1);
#     }
 
tu peux t'accrocher là ... tu nous appelle si ça arrive un jour
 
tab_notes[j] = '0';
 
'0' != '\0'
 
 
(test = strcmp(prenom, listprenoms[j])) == NULL
 
man strcmp

Reply

Marsh Posté le 15-03-2005 à 14:23:05    

Merci de donner de ton temp.
 
#  if ((ptr = strcpy(un_prenom, prenom)) == NULL) {
#         perror("strcpy!" );
#         exit(1);
#     }
 
comment effecturait tu la copie alors ?   :??:  
 
même question pour la comparaison strcmp.  
 


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 14:25:48    

man strcpy
man strcmp
 
tu te vautres complet sur les valeurs de retour

Reply

Marsh Posté le 15-03-2005 à 14:31:06    

NiQoZ1 a écrit :


C'est un programme tout simple de calcul de moyenne le programme demande  


strcmp() retourne un int et non un pointeur. Lire la doc.
 


Message édité par Emmanuel Delahaye le 15-03-2005 à 14:36:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-03-2005 à 14:31:19    

(test = strcmp(prenom, listprenoms[j])) == NULL)
 
serai:  
 
(test = strcmp(prenom, listprenoms[j])) == '0')
 
mais ça ne fonctionne plus à la comparaison ...


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 14:33:31    

man strcmp !

Reply

Marsh Posté le 15-03-2005 à 14:37:08    

strcmp prend deux pointeurs en parametre.. est ce là mon erreur car moi c'est des tableau de catactere (chaines)...
Mais je croyai qu'une chaine de caractère etait un pointeur sur le premier caractere ?


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 14:37:08   

Reply

Marsh Posté le 15-03-2005 à 14:46:34    

bon j'ai compris mon erreur sic...sic( un peu boulet le bonhomme) :heink:  
 
donc  
 
(test = strcmp(prenom, listprenoms[j])) == NULL)
 
devien
 
(test = strcmp(prenom, listprenoms[j])) == '\0')
 
et là plus d'erreurs de type mais toujour le segfault à la fin


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 14:49:50    

on va faire comme si j'avais rien lu.
 
strcmp retourne une valeur < 0, == 0 ou > 0
 
strcpy(a, b) retourne a

Reply

Marsh Posté le 15-03-2005 à 14:53:12    

d'accord sorry Taz !
 
(test = strcmp(prenom, listprenoms[j])) == '0')
mais il ne trouve jamais le prenom ?


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 15:00:20    

pourquoi cette comparaison ne fonctionne pas ?  
car man strcmp dit:
-Elle renvoie un entier negatif, nul, ou positif, si s1  est  respectivement inferieure, egale ou superieure a s2
donc si mon entier test est nul c'est que la comparaison est égale.  
Mais ça ne fonctionne pas...
Je pense que ma chaine comparée doit avoir un retour chariot en trop, ou quelque chose comme ça ?


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 15:00:55    

'0' ce n'est pas 0.
'0' ça doit faire 48 si je ne me trompe pas (Caractère '0').


---------------
Slack powa | http://www.racingpneu.com
Reply

Marsh Posté le 15-03-2005 à 15:01:50    

NiQoZ1 a écrit :

d'accord sorry Taz !
 
(test = strcmp(prenom, listprenoms[j])) == '0')
mais il ne trouve jamais le prenom ?


allez dégage ...

Reply

Marsh Posté le 15-03-2005 à 15:03:47    

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define BIGMAX 80
  5. #define MAX 20
  6. #define FAIL 1
  7. void RempliList(char *un_prenom, char prenom[]);
  8. void Affiche(char **liste, float tabnote[], short int tab_multi[], unsigned int max);
  9. int
  10. main(void) {
  11. char *listprenoms[MAX];
  12. float tab_notes[MAX];
  13. short int tab_multi[MAX];
  14. float note;
  15. char prenom[BIGMAX];
  16. unsigned int existe, test, i, j = 0;
  17. size_t s;
  18. for (i = 0; i < BIGMAX; i++) {
  19.  listprenoms[i] = NULL;
  20.  tab_multi[i] = 0;
  21. }
  22. i = 0;
  23. while (1) {
  24.  existe = 0;
  25.  printf("Saissisez le prenom ?\n" );
  26.  scanf("%s", prenom);
  27.  /* Sort si 'q' est pressé */
  28.  if ((prenom[0] == 'q') && (prenom[1] == '\0')) break;     s = strlen(prenom);
  29.  if (prenom[s - 1] == '\n') prenom[s - 1] = '\0';
  30.  printf("Saississez la note ?\n" );
  31.  scanf("%f", &note);
  32.   /* Teste dans la liste "listprenoms" si "prenom" existe       et, si oui  modifie sa note. "tab_multi" enregistre le       nombre de notes pour chaque prenom afin d'extraire       ensuite la moyenne...*/
  33.   for(j = 0; j < i; j++) {
  34.    if (listprenoms[j] != NULL) {
  35.     if ((test = strcmp(prenom, listprenoms[j])) == '0') {
  36.      tab_notes[j] += note;
  37.      tab_multi[j]++;
  38.      existe = 1;
  39.      break;
  40.     }
  41.    }
  42.   }
  43.   /*Allocation dynamique */
  44.   if (!existe) {
  45.   if ((listprenoms[i] = malloc(strlen(prenom) + 1)) == NULL) {
  46.    perror("malloc()" );
  47.    exit(FAIL);
  48.   }
  49.   /* Mise en memoire */
  50.   strcpy(listprenoms[i], prenom);
  51.   tab_notes[i] = note;
  52.   tab_multi[i]++;
  53.   }
  54.   i++; /*incremente i a chaque boucle while */
  55. }
  56.  Affiche(listprenoms, tab_notes, tab_multi, i); /*Affiche les moyennes */
  57. for (j = 0; j < i ; j++) {
  58.  free(listprenoms[j]);
  59.  tab_notes[j] = '\0';
  60.  tab_multi[j] = '\0';
  61. }
  62. return(0);
  63. }
  64. void
  65. Affiche(char **liste, float tabnote[], int short tab_multi[],unsigned int max)
  66. {
  67. short int i;
  68. for (i = 0; i < max; i++)
  69.  if (liste[i] != NULL)
  70.   printf("\nPrenom = %s\nNote moyenne =%2.2f\n", liste[i], tabnote[i] / tab_multi[i]);
  71. }


 
ma comparaison ne fonctionne pas et j'ai un segfault à la fin....


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 15:07:04    

c'est pas la peine d'^etre impoli je debute... vieux j'ai 30 balais et forcément c'est plus dur qua 18...
Donc mon 'strcmp' est faux encore, je n'ai donc toujours pas compris. Et bien désolé.


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 15:14:02    

NiQoZ1 a écrit :

c'est pas la peine d'^etre impoli je debute... vieux j'ai 30 balais et forcément c'est plus dur qua 18...
Donc mon 'strcmp' est faux encore, je n'ai donc toujours pas compris. Et bien désolé.


Remplace ton '0' par 0 ;)
Ca ira mieux.


---------------
Slack powa | http://www.racingpneu.com
Reply

Marsh Posté le 15-03-2005 à 15:16:29    

((test = strcmp(prenom, listprenoms[j])) == 0)
 
voila ca marche pour la comparaison les '' etait en trop.
Mais le segfault est toujour là à la fin.
(effectivement avec les cotes sa change tout)


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 15:17:45    

merci vinx je venai de m'en rendre compte mais j'ai toujour un segfaut à la fin.


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 15:20:54    

gcc -g fichier.c
 
gdb ./a.out
run
bt
list

Reply

Marsh Posté le 15-03-2005 à 15:25:24    

(gdb) run
Starting program: /home/gnoniqoz/tmp/a.out
Saissisez le prenom ?
toto
Saississez la note ?
12
Saissisez le prenom ?
q
 
Prenom = toto
Note moyenne =12.00
 
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) bt
#0  0x00000000 in ?? ()
(gdb) list
13
14
15      int
16      main(void) {
17              char *listprenoms[MAX];
18              float tab_notes[MAX];
19              short int tab_multi[MAX];
20              float note;
21              char prenom[BIGMAX];
22              unsigned int existe, test, i, j = 0;
(gdb)  


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 15:53:20    

NiQoZ1 a écrit :

d'accord sorry Taz !
 
(test = strcmp(prenom, listprenoms[j])) == '0')
mais il ne trouve jamais le prenom ?


On te dit que c'est 0 (la valeur zéro), pas '0' (le caractère 0) ...


if (strcmp(prenom, listprenoms[j])) == 0)
{
   /* j'ai trouve'... */
}


Message édité par Emmanuel Delahaye le 15-03-2005 à 15:54:51

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-03-2005 à 16:04:57    

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define BIGMAX 80
  5. #define MAX 20
  6. #define FAIL 1
  7. void CalculEtAffiche(char **liste, float tabnote[], short int tab_multi[], unsigned int max);
  8. int
  9. main(void) {
  10. char *listprenoms[MAX];
  11. float tab_notes[MAX];
  12. short int tab_multi[MAX];
  13. float note;
  14. char prenom[BIGMAX];
  15. unsigned int existe, test, i, j = 0;
  16. size_t s;
  17. for (i = 0; i < BIGMAX; i++) {
  18.  listprenoms[i] = NULL;
  19.  tab_multi[i] = 0;
  20. }
  21. i = 0;
  22. while (1) {
  23.  existe = 0;
  24.  printf("Saisissez le prenom ?\n" );
  25.  fgets(prenom, BIGMAX, stdin);
  26.  prenom[BIGMAX - 1] = 0;
  27.  /* Sort si 'q' est pressé */
  28.  if ((prenom[0] == 'q') && (prenom[1] == '\n')) break;
  29.  s = strlen(prenom);
  30.  if (prenom[s - 1] == '\n') prenom[s - 1] = '\0';
  31.  printf("Saisissez la note ?\n" );
  32.  scanf("%f", &note);
  33.  getchar();
  34.   /* Teste dans la liste "listprenoms" si "prenom" existe       et, si oui  modifie sa note. "tab_multi" enregistre le       nombre de notes pour chaque prenom afin d'extraire       ensuite la moyenne...*/
  35.   for(j = 0; j < i; j++) {
  36.    if (listprenoms[j] != NULL) {
  37.     if ((test = strcmp(prenom, listprenoms[j])) == 0) {
  38.      tab_notes[j] += note;
  39.      tab_multi[j]++;
  40.      existe = 1;
  41.      break;
  42.     }
  43.    }
  44.   }
  45.   /*Allocation dynamique */
  46.   if (!existe) {
  47.   if ((listprenoms[i] = malloc(strlen(prenom) + 1)) == NULL) {
  48.    perror("malloc()" );
  49.    exit(FAIL);
  50.   }
  51.   /* Mise en memoire */
  52.   strcpy(listprenoms[i], prenom);
  53.   tab_notes[i] = note;
  54.   tab_multi[i]++;
  55.   }
  56.   i++; /*incremente i a chaque boucle while */
  57. }
  58.  CalculEtAffiche(listprenoms, tab_notes, tab_multi, i); /*CalculEtAffiche les moyennes */
  59. for (j = 0; j < i ; j++) {
  60.  free(listprenoms[j]);
  61.  tab_notes[j] = '\0';
  62.  tab_multi[j] = '\0';
  63. }
  64. return(0);
  65. }
  66. void
  67. CalculEtAffiche(char **liste, float tabnote[], int short tab_multi[],unsigned int max)
  68. {
  69. short int i;
  70. for (i = 0; i < max; i++)
  71.  if (liste[i] != NULL)
  72.   printf("\nPrenom = %s\nNote moyenne =%2.2f\n", liste[i], tabnote[i] / tab_multi[i]);
  73. }


 
oui oui, comme ecrit dans les posts précédents les cotes sont enlevées, mais j'ai toujours un segfault.


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 16:11:49    

ce qui est beau sur mon powerpc, c'est que ce joli programme tourne indéfininment, pile corrompue oblige.
 
char *listprenoms[MAX];
...
 
 
    for (i = 0; i < BIGMAX; i++) {
       listprenoms[i] = NULL;
 
ça fait plein de jolis trucs :)

Reply

Marsh Posté le 15-03-2005 à 16:17:43    

il se moque... Bon alors donc c'est tout faux il faut que je le reprenne totalement ou quelques parties sont "juste" ?
t'en pense quoi monsieur Taz...


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 16:20:40    

en fait je ne sait pas comment effectuer une recherche de chaine dans un tableau de pointeur sur chaine de caractère...


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 16:21:58    

si tu commençais par pendre en compte les remarques, ça serait déjà un grand pas. alors tu corrige ce problème de borne, et tu reprends le topic depuis le début, et tu corriges, surtout les farces genre scanf("%s" :)

Reply

Marsh Posté le 15-03-2005 à 16:24:31    

ya plus de cotes et scanf(%s est enleve au benefice de fgets.
regarde le dernier code posté à 16h04 c'est corrigé...
MAis toujours mon probleme de segfault


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 16:26:03    

et le fait que ca tourne indefiniment sur le Ppc j'espere que ton systeme n'est pas corrompu à cause de moi (ppc c'est stable ...)


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 16:51:16    

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define BIGMAX 80
  5. #define MAX 20
  6. #define FAIL 1
  7. void CalculEtAffiche(char **liste, float tabnote[], short int tab_multi[], unsigned int max);
  8. int
  9. main(void) {
  10. char *listprenoms[MAX];
  11. float tab_notes[MAX];
  12. short int tab_multi[MAX];
  13. float note;
  14. char prenom[BIGMAX];
  15. unsigned int existe, test, i, j = 0;
  16. size_t s;
  17. for (i = 0; i < BIGMAX; i++) {
  18. /* listprenoms[i] = NULL;*/
  19.  tab_multi[i] = 0;
  20. }
  21. i = 0;
  22. while (1) {
  23.  existe = 0;
  24.  printf("Saisissez le prenom ?\n" );
  25.  fgets(prenom, BIGMAX, stdin);
  26.  prenom[BIGMAX - 1] = 0;
  27.  /* Sort si 'q' est pressé */
  28.  if ((prenom[0] == 'q') && (prenom[1] == '\n')) break;
  29.  s = strlen(prenom);
  30.  if (prenom[s - 1] == '\n') prenom[s - 1] = '\0';
  31.  printf("Saisissez la note ?\n" );
  32.  scanf("%f", &note);
  33.  getchar();
  34.   /* Teste dans la liste "listprenoms" si "prenom" existe       et, si oui  modifie sa note. "tab_multi" enregistre le       nombre de notes pour chaque prenom afin d'extraire       ensuite la moyenne...*/
  35.   for(j = 0; j < i; j++) {
  36.    if (listprenoms[j]) {
  37.     if ((test = strcmp(prenom, listprenoms[j])) == 0) {
  38.      tab_notes[j] += note;
  39.      tab_multi[j]++;
  40.      existe = 1;
  41.      break;
  42.     }
  43.    }
  44.   }
  45.   /*Allocation dynamique */
  46.   if (!existe) {
  47.   if ((listprenoms[i] = malloc(strlen(prenom) + 1)) == NULL) {
  48.    perror("malloc()" );
  49.    exit(FAIL);
  50.   }
  51.   /* Mise en memoire */
  52.   strcpy(listprenoms[i], prenom);
  53.   tab_notes[i] = note;
  54.   tab_multi[i]++;
  55.   }
  56.   i++; /*incremente i a chaque boucle while */
  57. }
  58.  CalculEtAffiche(listprenoms, tab_notes, tab_multi, i); /*CalculEtAffiche les moyennes */
  59. for (j = 0; j < i ; j++) {
  60.  free(listprenoms[j]);
  61.  tab_notes[j] = '\0';
  62.  tab_multi[j] = '\0';
  63. }
  64. return(0);
  65. }
  66. void
  67. CalculEtAffiche(char **liste, float tabnote[], int short tab_multi[],unsigned int max)
  68. {
  69. short int i;
  70. for (i = 0; i < max; i++)
  71.  if (liste[i] != NULL)
  72.   printf("\nPrenom = %s\nNote moyenne =%2.2f\n", liste[i], tabnote[i] / tab_multi[i]);
  73. }


 
chez moi ça fonctionne parfaitement...ouf
pour saisir des nombre entiers ou flottants faut t'il utiliser scanf ? si non quelle fonction ?


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 16:55:50    

Merci à tous pour vos réponses, je peut comprendre que j'agace les puristes. Mais je ne le fait pas expres. D'ailleur je me suis posé la question si je postait ce code ou pas. Mais parfois il faut un peu de courage temp pis pour le phrases assasines et le ridicule.


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 18:02:26    

NiQoZ1 a écrit :

chez moi ça fonctionne parfaitement...ouf
pour saisir des nombre entiers ou flottants faut t'il utiliser scanf ? si non quelle fonction ?


Voici une version plus industrielle de ton code. On peut faire mieux avec un tableau de structures plutôt que 3 tableaux de même taille...
 

  • Réduction de la portée des variables
  • simplification du code et des types
  • fonctions de saisie solide.



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
void CalculEtAffiche (char **liste
                      ,double tabnote[]
                      ,int tab_multi[]
                      ,size_t max)
{
   size_t i;
 
   for (i = 0; i < max; i++)
   {
      if (liste[i] != NULL)
      {
         printf ("\nPrenom = %s\n"
                 "Note moyenne =%2.2f\n"
                 ,liste[i]
                 ,tabnote[i] / tab_multi[i]);
      }
   }
}
 
void get_s (char *s, size_t size)
{
 
   fgets (s, size, stdin);
   {
      /* search ... */
      char *p = strchr (s, '\n');
 
      if (p != NULL)
      {
         /* ... and kill... */
         *p = 0;
      }
      else
      {
         /* ... or clean. */
         int c;
 
         while ((c = getchar ()) != '\n' && c != EOF)
         {
         }
      }
   }
}
 
double get_d (void)
{
   double val;
   char s[32];
 
   get_s (s, sizeof s);
 
   val = strtod (s, NULL);
 
   return val;
}
 
 
int main (void)
{
#define MAX 20
 
   int tab_multi[MAX] =
   {0};
   char *listprenoms[MAX] =
   {0};
   double tab_notes[MAX] =
   {0};
 
   size_t i = 0;
 
   while (1)
   {
      int existe = 0;
      char prenom[80];
 
      printf ("Saisissez le prenom ?\n" );
 
      get_s (prenom, sizeof prenom);
 
      /* Sort si 'q' est presse */
      if (strcmp (prenom, "q" ) == 0)
      {
         break;
 
      }
 
      printf ("Saisissez la note ?\n" );
 
      {
         double note = get_d ();
 
         /* Teste dans la liste "listprenoms" si "prenom" existe        
          * et, si oui  modifie sa note. "tab_multi" enregistre le        
          * nombre de notes pour chaque prenom afin d'extraire        
          * ensuite la moyenne...  
          */
         {
            size_t j;
 
            for (j = 0; j < i; j++)
            {
               if (listprenoms[j])
               {
                  if (strcmp (prenom, listprenoms[j]) == 0)
                  {
                     tab_notes[j] += note;
                     tab_multi[j]++;
                     existe = 1;
                     break;
                  }
               }
            }
         }
 
         /* Allocation dynamique */
         if (!existe)
         {
            if ((listprenoms[i] = malloc (strlen (prenom) + 1)) == NULL)
            {
               perror ("malloc()" );
               exit (EXIT_FAILURE);
            }
            /* Mise en memoire */
            strcpy (listprenoms[i], prenom);
            tab_notes[i] = note;
            tab_multi[i]++;
         }
         i++;                   /* incremente i a chaque boucle while */
      }
   }
 
   /* CalculEtAffiche les moyennes */
   CalculEtAffiche (listprenoms, tab_notes, tab_multi, i);
 
   {
      size_t j;
 
      for (j = 0; j < i; j++)
      {
         free (listprenoms[j]);
         tab_notes[j] = 0;
         tab_multi[j] = 0;
      }
   }
   system ("pause" );
 
   return 0;
}


Message édité par Emmanuel Delahaye le 15-03-2005 à 21:54:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-03-2005 à 18:04:10    

NiQoZ1 a écrit :

Merci à tous pour vos réponses, je peut comprendre que j'agace les puristes. Mais je ne le fait pas expres. D'ailleur je me suis posé la question si je postait ce code ou pas. Mais parfois il faut un peu de courage temp pis pour le phrases assasines et le ridicule.


Le problème n'est pas ton code intial qui est ce qu'il est, mais plutôt quand tu lis mal les réponses, et ça, ça énerve...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-03-2005 à 18:30:49    

merci beaucoup pour ton exemple je vais de ce pas l'etudier en detail .


---------------
NiQoZ
Reply

Marsh Posté le 15-03-2005 à 19:19:39    

Emmanuel > Franchement arrête de faire les corrigés. Tu vois bien que certaines personnes ne font pas d'effort. Je lui fait une remarque sur la borne sup d'un tableau ... il commente l'instruction au petit bonheur la chance, ET à la ligne en dessous, c'est exactement le même problème : dépassement de capacité ...
C'est vraiment pas bien de faire des corrigés, surtout quand la personne ne comprend rien et n'a pas envie de.

Reply

Marsh Posté le 16-03-2005 à 08:53:21    

il a manger quoi le bisounours pour être aussi con. Car si la ligne d'en dessou ne lui plai pas c'est peu être que l'apprenti codeur n'a pas compri la 'remarque'...
Alors heureusement qu'il y a des gars comme emmanuel sinon les débutants ne feraient que de ce heurter à des remarques de ce genre et ne progresserai pas d'un yota.  
A bon entendeur (mais à mon avis il est sourd) salut...


---------------
NiQoZ
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed