Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1149 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1013303
NiQoZ1
Posté le 15-03-2005 à 13:45:42  profilanswer
 


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
mood
Publicité
Posté le 15-03-2005 à 13:45:42  profilanswer
 

n°1013309
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2005 à 13:50:15  profilanswer
 

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/
n°1013322
NiQoZ1
Posté le 15-03-2005 à 14:00:02  profilanswer
 

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
n°1013345
Taz
bisounours-codeur
Posté le 15-03-2005 à 14:12:56  profilanswer
 

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

n°1013356
NiQoZ1
Posté le 15-03-2005 à 14:23:05  profilanswer
 

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
n°1013359
Taz
bisounours-codeur
Posté le 15-03-2005 à 14:25:48  profilanswer
 

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

n°1013362
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2005 à 14:31:06  profilanswer
 

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/
n°1013364
NiQoZ1
Posté le 15-03-2005 à 14:31:19  profilanswer
 

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


---------------
NiQoZ
n°1013366
Taz
bisounours-codeur
Posté le 15-03-2005 à 14:33:31  profilanswer
 

man strcmp !

n°1013369
NiQoZ1
Posté le 15-03-2005 à 14:37:08  profilanswer
 

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
mood
Publicité
Posté le 15-03-2005 à 14:37:08  profilanswer
 

n°1013382
NiQoZ1
Posté le 15-03-2005 à 14:46:34  profilanswer
 

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
n°1013386
Taz
bisounours-codeur
Posté le 15-03-2005 à 14:49:50  profilanswer
 

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

n°1013394
NiQoZ1
Posté le 15-03-2005 à 14:53:12  profilanswer
 

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


---------------
NiQoZ
n°1013402
NiQoZ1
Posté le 15-03-2005 à 15:00:20  profilanswer
 

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
n°1013404
Vinx
Posté le 15-03-2005 à 15:00:55  profilanswer
 

'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
n°1013405
Taz
bisounours-codeur
Posté le 15-03-2005 à 15:01:50  profilanswer
 

NiQoZ1 a écrit :

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


allez dégage ...

n°1013408
NiQoZ1
Posté le 15-03-2005 à 15:03:47  profilanswer
 

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
n°1013412
NiQoZ1
Posté le 15-03-2005 à 15:07:04  profilanswer
 

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
n°1013424
Vinx
Posté le 15-03-2005 à 15:14:02  profilanswer
 

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
n°1013426
NiQoZ1
Posté le 15-03-2005 à 15:16:29  profilanswer
 

((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
n°1013428
NiQoZ1
Posté le 15-03-2005 à 15:17:45  profilanswer
 

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


---------------
NiQoZ
n°1013432
Taz
bisounours-codeur
Posté le 15-03-2005 à 15:20:54  profilanswer
 

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

n°1013439
NiQoZ1
Posté le 15-03-2005 à 15:25:24  profilanswer
 

(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
n°1013488
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2005 à 15:53:20  profilanswer
 

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/
n°1013506
NiQoZ1
Posté le 15-03-2005 à 16:04:57  profilanswer
 

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
n°1013516
Taz
bisounours-codeur
Posté le 15-03-2005 à 16:11:49  profilanswer
 

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 :)

n°1013524
NiQoZ1
Posté le 15-03-2005 à 16:17:43  profilanswer
 

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
n°1013530
NiQoZ1
Posté le 15-03-2005 à 16:20:40  profilanswer
 

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


---------------
NiQoZ
n°1013535
Taz
bisounours-codeur
Posté le 15-03-2005 à 16:21:58  profilanswer
 

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" :)

n°1013538
NiQoZ1
Posté le 15-03-2005 à 16:24:31  profilanswer
 

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
n°1013540
NiQoZ1
Posté le 15-03-2005 à 16:26:03  profilanswer
 

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
n°1013588
NiQoZ1
Posté le 15-03-2005 à 16:51:16  profilanswer
 

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
n°1013606
NiQoZ1
Posté le 15-03-2005 à 16:55:50  profilanswer
 

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
n°1013713
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2005 à 18:02:26  profilanswer
 

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/
n°1013715
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-03-2005 à 18:04:10  profilanswer
 

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/
n°1013761
NiQoZ1
Posté le 15-03-2005 à 18:30:49  profilanswer
 

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


---------------
NiQoZ
n°1013800
Taz
bisounours-codeur
Posté le 15-03-2005 à 19:19:39  profilanswer
 

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.

n°1014161
NiQoZ1
Posté le 16-03-2005 à 08:53:21  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Programmation d'un programme de détection d'attaque réseau[Débutant] wxStyledTextCtrl
modification d'un programme[RECH] Jeu de foot pour programme de tracking
Programme de pic[C++]Mon programme compile mais plante.
Modifier les bordures d'un tableau PHP (débutant inside)debutant pb structure
Programme C++ utilisant une base de donnéemon programme fonctionne t il chez vous?
Plus de sujets relatifs à : [ C ] Archi-debutant segfault sur petit programme :-(


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR