Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/02/2007, à 23:08

the_deus

[C] Problème assez gènant sous ubuntu 6.10

Bonsoir à tous,

Je vous soumets ici un problème qui m'est assez gènant.

Tout d'abord, je suis en première année d'informatique a l'université, dans le cadre d'un de mes cours (projet de programmation), je suis amené a coder des programmes assez peu compliqués en C.
Jusque la tout va bien.
Sauf que je me suis apercu d'un bug assez gènant:
Pour un meme programme (meme fichier .c) une débian ou une ubuntu 6.06 va me le compiler correctement et que son exécution ne posera pas de probleme et que compilé sous une ubuntu (ou kubuntu) 6.10, il me créera des "segmentations error" a l'éxécution du programme d'une certaine manière.

En gros, un meme programme compilé sous une 6.06 ou une 6.10 n'a pas le meme comportement!
Voici le code en question.

Précision, le code compilé sous une 6.06 ne provoque aucun bug d'execution sous une 6.10

#include <stdio.h>

int main ()
{
   float nbr1,nbr2;
   char operateur[2] = {0};
   int c;

   printf("Entrez le premier nombre ");
   //loop choise n°1
   /*User wil be asked to prompt a float number until he prompt one*/
   while (!scanf("%f",&nbr1))
   {
      //erase the buffer if wrong entry
      while ((c = getchar()) != '\n' && c != EOF); 
      printf("Veuillez entrer un nombre ");
   } 
   /*
    *This loop will:
    *  - Print the first number prompted before.
    *  - Ask the user for a valid operateur.
    *  - Ask the user for a second valid float number.
    *  - Make the requested operation.
    *Until the user prompt a 'q' instead of the operateur.
    *Result will be used for the next operation, 
    *as if it was prompted by the user as number n°1.
    */
   while (1)
   {
      printf("Entrez un opérateur (ou q pour quitter) "
	    "et un second nombre \n");
      printf("%f",nbr1);
      /*loop choise n°2
       *Ask the user until he prompts a valid operateur, or 'q' (quit)
       */
      while (!scanf(" %[q+*-/]", operateur))
	 {
	    while ((c = getchar()) != '\n' && c != EOF); 
	    printf("Veuillez entrer un opérateur valide " 
		  "(+,*,-,/) suivit d'un second nombre ");
	 } 

      if (*operateur == 'q')
	 return 0;//stop the program if the user prompt a 'q'
      //loop choise n°3
      //Same as loop n°1 but for the operateur
      while (!scanf("%f",&nbr2))
      {
	 while ((c = getchar()) != '\n' && c != EOF); 
	 printf("Veuillez entrer un nombre valide ");
      }
      while ((c = getchar()) != '\n' && c != EOF);
      /*Makes the requested operation, cannot be something else due to the second
       loop which make sure that theres a valid operateur prompted by the user*/
      switch(*operateur)
      {
      case '+': nbr1= nbr1 + nbr2;break;
      case '-': nbr1= nbr1 - nbr2;break;
      case '*': nbr1= nbr1 * nbr2;break;
      case '/': nbr1= nbr1 / nbr2;break;
      default: printf("... and god exist");break;
      }
   }
}

Je précise, le "problème" viendrait de la ligne
"while (!scanf(" %[q+*-/]", operateur))"
Je sais que cette utilisation de scanf est peu orthodoxe, mais ca n'explique pas les différences de comportement entre les versions de linux !
Mon professeur a regardé et compilé ce code sous sa debian et il n'arrive pas a créer ce bug
Nous utilisons tout les 2 gcc en version 4.1.2, lui sous debian, moi sous kubuntu 6.10
je précise aussi les "condition d'apparition" du bug:
une fois compilé (options de base), lancez le programme:
- a la première invite de commande, entrez un nombre quelquonque ("12" par ex)
- a la seconde, entrez lui 2 opérateur successifs suivit d'un autre entier ("//12")
- a la troisième invit de commande, tapper "q"
et la le programme doit afficher une erreur de segmentation tout en quittant.

Par dela ce bug mineur, je voudrais savoir si réellement je cours un risque, au niveau de la précision par exemple, en utilisant une version 6.10 de ubuntu dans le cadre de mon projet de programmation (tous mes paquets sont a jours via apt-get).

Dernière précision, un code compilé sous une 6.06 ne provoque aucun bug d'execution sous une 6.10

#2 Le 21/02/2007, à 23:14

best_friend_fr

Re : [C] Problème assez gènant sous ubuntu 6.10

Salut

Chez moi, ca marche.
Est-ce que si tu enlève l'expression régulière (en mettant un truc plus simple, ca bugge) ?


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#3 Le 21/02/2007, à 23:30

the_deus

Re : [C] Problème assez gènant sous ubuntu 6.10

en remplacant par un getchar() , ca marche tout a fait, mais bon, au dela de ce bug mineur, ce sont des réponses plus générales dont j'ai besoin.
Ces projets représentent quasiment 1/6 eme de mon annee hmm

#4 Le 21/02/2007, à 23:49

best_friend_fr

Re : [C] Problème assez gènant sous ubuntu 6.10

un

sudo apt-get install libpcre3

règle-t-il le problème ?


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#5 Le 21/02/2007, à 23:55

the_deus

Re : [C] Problème assez gènant sous ubuntu 6.10

Le paquet était déja installé

#6 Le 22/02/2007, à 00:41

lut!n

Re : [C] Problème assez gènant sous ubuntu 6.10

tu as essayé de le debugger avec gdb pour voir ce que ca donne ?

Hors ligne

#7 Le 22/02/2007, à 01:13

the_deus

Re : [C] Problème assez gènant sous ubuntu 6.10

Oui oui, gdb, valgrind touca.
Ca me donne une sortie de mémoire, compréhensible peut etre, mais pourquoi seulement sur les 6.10 ?

#8 Le 22/02/2007, à 01:14

best_friend_fr

Re : [C] Problème assez gènant sous ubuntu 6.10

ce qui est bizarre, c'est que chez moi, ca marche très bien...


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#9 Le 22/02/2007, à 01:28

the_deus

Re : [C] Problème assez gènant sous ubuntu 6.10

tu es en 6.10 aussi?

#10 Le 22/02/2007, à 01:33

best_friend_fr

Re : [C] Problème assez gènant sous ubuntu 6.10

oui, et gcc 4.1.2


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#11 Le 22/02/2007, à 01:50

the_deus

Re : [C] Problème assez gènant sous ubuntu 6.10

tes librairies libc6 et libc6-i686 sont en 2.4 ?

parceque ca le fait a un ami aussi, qui est en 6.10 hmm

#12 Le 22/02/2007, à 01:54

best_friend_fr

Re : [C] Problème assez gènant sous ubuntu 6.10

2.4-1ubuntu12.3


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#13 Le 22/02/2007, à 02:04

the_deus

Re : [C] Problème assez gènant sous ubuntu 6.10

Moi pareil hmm
pour la compilation, tu utilises bien:

gcc -o calc calc.c ?

#14 Le 22/02/2007, à 02:05

best_friend_fr

Re : [C] Problème assez gènant sous ubuntu 6.10

ben oui...


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#15 Le 22/02/2007, à 13:06

lut!n

Re : [C] Problème assez gènant sous ubuntu 6.10

J'ai plus l'impression que c'est au moment du return 0 que ca plante, au moment ou il recommence sa boucle et que tu tapes 'q'. Apres, de la a savoir pourquoi ....

Hors ligne

#16 Le 22/02/2007, à 16:40

Compte anonymisé

Re : [C] Problème assez gènant sous ubuntu 6.10

Salut

Il me semble que tu es dans un pb classique en c :
Tu réserves :  char operateur[2] = {0}; 2 caractères pour l'opérateur, dont un est la fin de chaine (\0) et tu ne vérifies pas la saisie (on peut te rentrer 20 "/" ou 20 "*" et tu dépasses allègrement la zone que tu as réservé. Quand tu quittes tu dumpes.
Soit tu réserves + ( char operateur[20] = {0}; ) soit tu vérifies que tu récupères un opérateur et un seul.

ps je te joins un pgm modifié (je ne sais pas si c'est le but).
@+

#include <stdio.h>

int main ()
{
   float nbr1,nbr2;
   char operateur[30] = {0};
   int c;

while (1)
   {   
   printf("Entrez le premier nombre : ");
   //loop choise n°1
   /*User wil be asked to prompt a float number until he prompt one*/
   while (!scanf("%f",&nbr1))
   {
      //erase the buffer if wrong entry
      while ((c = getchar()) != '\n' && c != EOF); 
      printf("\nVeuillez entrer un nombre :");
   } 
   printf("Premier nombre : %f \n",nbr1);      
   printf("Entrez un opérateur (ou q pour quitter) ");
   while (!scanf(" %[q+*-/]", operateur))
     {
        while ((c = getchar()) != '\n' && c != EOF); 
        printf("\nVeuillez entrer un opérateur valide : (+,*,-,/)");
     } 

   if (*operateur == 'q')
     	return 0;//stop the program if the user prompt a 'q'
     
   printf("Entrez le deuxième nombre : ");

   while (!scanf("%f",&nbr2))
      {
        while ((c = getchar()) != '\n' && c != EOF); 
        printf("\n Veuillez entrer un nombre valide ");
      }
   /* while ((c = getchar()) != '\n' && c != EOF); */
   switch(*operateur)
      {
      case '+': nbr1 +=  nbr2;break;
      case '-': nbr1 -=  nbr2;break;
      case '*': nbr1 *=  nbr2;break;
      case '/': nbr1 /=  nbr2;break;
      default: printf("... and god exist");break;
      }
   printf("Le résultat est : %f \n",nbr1);
   }

}

Dernière modification par Compte anonymisé (Le 22/02/2007, à 16:42)

#17 Le 22/02/2007, à 19:17

the_deus

Re : [C] Problème assez gènant sous ubuntu 6.10

Merci pour la modification, mais ce n'est pas le but, le but est de savoir pourquoi ca ne marche pas sur ma (et y a pas que la mienne) 6.10 alors que le prof n'a pas détecté d'erreurs quand je lui ai montré le code.

En gros (et la c'est plus l'avis d'un pro qu'il me faut), y a t'il des différences de comportements dans la compilation entre les versions de linux?

#18 Le 22/02/2007, à 19:26

Compte anonymisé

Re : [C] Problème assez gènant sous ubuntu 6.10

Salut

Mais il me semble que je t'explique pourquoi ça ne marche pas : Rappel

Il me semble que tu es dans un pb classique en c :
Tu réserves : ( char operateur[2] = {0}; ) 2 caractères pour l'opérateur, dont un est la fin de chaine (\0) et tu ne vérifies pas la saisie (on peut te rentrer 20 "/" ou 20 "*")  et tu dépasses allègrement la zone que tu as réservé. Quand tu quittes tu dumpes.
Soit tu réserves + ( char operateur[20] = {0}; ) soit tu vérifies que tu récupères un opérateur et un seul.

@+

Dernière modification par Compte anonymisé (Le 22/02/2007, à 19:29)

#19 Le 23/02/2007, à 04:46

gene69

Re : [C] Problème assez gènant sous ubuntu 6.10

En gros (et la c'est plus l'avis d'un pro qu'il me faut), y a t'il des différences de comportements dans la compilation entre les versions de linux?

Ce n'est pas le même gcc, ce n'est pas les mêmes entêtes ... dapper est en retard par rapport à Edgy. Et le noyeau est-ce le même? big_smile

Quelle étrange idée de penser qu'un programme se comporte différemment sur des plateforme différente. Non c'est faut. C'est juste une autre expérience pour l'utilisateur. Surtout sous linux, c'est quand même étrange d'avoir comme a priori que tous les environnements sont équivalent? combien de shells différents existe-ils? rien que ça...

Mais c'est faire preuve d'immodestie d'accuser gcc... sad


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne