Mon programme redemmare dans l'utilisation de saisie caractères

develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 10 juin 2007 à 17:52
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 - 12 juin 2007 à 14:21
Bonjour

voici un programme qui permet de faire une saisie de mot de passe jusqu'à 8 caractères, il fonctionne très bien avec DevC++ mais j'utilise un système embarqué donc un compilateur dedié aux microcontrolleurs et j'ai des soucis à cause de ça, voici mon code :


<hr />

#include <string.h>
#include <stdio.h>
 
#define BEL 7
#define BS 8
 
int verifie_passe (char const tentative[])
{
   char const passe[] = "sesame";
   return strcmp (tentative, passe) == 0;
}
 
void lire_mp (char *tampon, size_t size)
{
   size_t i = 0;
   char lettre;
 
   while ((lettre = getch ()) != '\r')
   {
      if (lettre == BS)
      {
         if (i > 0)
         {
            putch (lettre);
            putch (' ');
            putch (lettre);
            i--;
         }
         else
         {
            putchar (BEL);
         }
      }
      else
      {
         if (i < size - 1)
         {
            tampon[i] = lettre;
            i++;
            putch ('*');
         }
         else
         {
            putchar (BEL);
         }
      }
   }
 
   tampon[i] = 0;
}
 
void Users_mode (void)
{
   unsigned char choiceuser;
   int typeutil = 0;
   printf ("Would you like to enter in administrator mode (Y/N) ?\n\n");
 
   choiceuser = getchar ();   if ((choiceuser 'Y') || (choiceuser 'y'))
   {
      char pwd[8];
      do
      {
         printf ("\nEntrez le mot de passe :\n");
         lire_mp (pwd, sizeof pwd);
      }
      while (verifie_passe (pwd) == 0);
      printf ("\nbienvenue\n");
 
      typeutil = 1;
      printf ("You are in administrator mode \n");
 
   }
    if ((choiceuser 'N') || (choiceuser 'n'))
   {
      typeutil = 0;
      //printf("You aren't in administrator mode \n");
   }
}
 
int main (void)
{
   Users_mode ();
   return 0;
}
 
<hr /> 

Avec mon compilateur C51 Keil µVision 2 lorsque la fonction lire_mp() est appelée ( je l'ai verifié avec debug ) mon prgramme redemarrait?
C'est je crois un problème de code dans le getch du while de la fonction lire_mp():

<hr />
while ((lettre = getchar ()) != '\r')
   {
      if (lettre == BS)
      {         if (i > 0)
         {
            putchar (lettre);
            putchar (' ');
            putchar (lettre);
            i--;
         }
         else
         {
            putchar (BEL);
         }
      }
      else
      {

         if (i < size - 1)
         {
            tampon[i] = lettre;
            i++;
            putchar ('*');
         }
         else
         {
            putchar (BEL);
         }
      }

   }

<hr />en effet en ayant mis getchar à la place de getch, ça va deja mieux car le programme ne redemarre pas mais enfait il ne faut
sans doute pas utliser getchar mais getch() mais mon compilateur Keil C51 redemarre quand j'arrive a cet endroit du code
et le resultat sur capture d'écran est bizarre :

Would you like to enter in administrator mode (Y/N) ?
 
y
Entrez le mot de passe :
se*s*a*s*m*e*s*s
sesmed
 
seememds
s
sme
e
e
 

On ne sort plus de la saise et après le 7 ème étoile on entend le beep à chaque saisie sur le clavier indefiniment je ne voit pas comment faire ?

DevelDelphi :)

6 réponses

Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
11 juin 2007 à 14:59
salut,

je voulais savoir ce que sont BS et BEL et pourquoi est ce que ta fonction lire_mp est de cette forme ? que cherches tu à faire d'autre que lire les caractères ?

Loki
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
12 juin 2007 à 00:32
En fait ce que je veux c'est :


1)

d'abord lancer la fonction Users_mode au lancement du programme afin de
demander si on veut entrer en mode administrateur. si on repond yes on
doit rentrer un mot de passe sinon on sort et on continu normalement
dans le reste du programme.


2)

donc si on repond yes j'appelle une autre fonction (lire_mp()) qui elle
permet de masquer le caractère saisie par des "*" et deplus permet de
beeper si il y a plus de 8 caractères saisies.


Et ce 2 eme paragraphe avec la fonction lire_mp() se repetera tant que

ce qu'on aura tapé au clavier ne correspond pas au mot de passe valide
et ce via un while qui appelle la fonction verifie_passe().


voila plus concretement.

#define BEL 7
#define BS 8

BEL c'est pour beeper si le nombre de caracteres depasse 8  (BS).

mon compilateur genere un warning  car ne reconnait pas le conio.h. 
Que dois je faire pour que mon programme ne reboot pas ?

Merci
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
12 juin 2007 à 08:02
ben écoute, j'ai créé un projet console et mis ton code et tout marche nickel...

Loki
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
12 juin 2007 à 08:05
ça te dit quoi à propos de conio.h ? d'habitude, ça met une erreur plutôt qu'un warning quand ça ne trouve pas le fichier.

Loki
0

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

Posez votre question
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
12 juin 2007 à 11:25
Salut Loki,

Moi aussi avecDevC++ je vois que ça marche nickel.
Voila mon compilateur Keil C51 µVision2 me donne un warning seulement et il compile bien mais donc c'est à cause du conio.h et donc du getch().

Il faut que je fasse un autre algorithme plus simple avec les meêms options, focntionnalités mais comment ?
Ou bien implementer une autre routine tel que le getch() ??

Merci
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
12 juin 2007 à 14:21
scanf ? avec ca seul stdio.h est nécessaire il me semble

Loki
0