Transmission par adresse en C

Résolu/Fermé
C&M - 11 mai 2010 à 17:46
 C&M - 14 mai 2010 à 02:50
Bonjour,
Le sous programme suivant est censé transmettre par adresse l'heure et les minutes rentrées par un utilisateur. Dans le Sous programme, l'affichage fonctionne correctement (printf("h : %d\n", *heure);printf("m : %d", *minute);)
Mais dans le main, quand je demande l'affichage de l'heure et des minutes, je n'ai qu'une suite de chiffres incohérents.
Y a t il un probleme dans la transmission par adresse dans ce sous programme ?

Merci d'avance


int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;

printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%s",horloge);
c=getchar();

*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);

return strlen(horloge);
}

A voir également:

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
11 mai 2010 à 20:41
Si dans le sous-programme ça fonctionne bien, le problème vient a priori de la fonction appelante (main dans ton cas()).
Pourrais-tu poster la fonction main() ?
0
voici le programme en sa totalite :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define DIMHEURE 4

int Saisie_Heure(int* minute, int* heure);
int Compare_Heure(int minute,int heure);

int main()
{
int longueur_horloge;
int min,h;
int erreur;

longueur_horloge=Saisie_Heure(&min, &h);
printf("m : %d\n", min);
printf("h : %d\n", h);
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
{
printf("a");
printf("\nErreur : Mauvais Format dans l'heure\n");
longueur_horloge=Saisie_Heure(&min, &h);
}
erreur=Compare_Heure(min,h);
printf("b");

while(erreur==1)
{ printf("c");

printf("\nErreur, l'heure saisie est d%cpass%ce\n",130,130);
longueur_horloge=Saisie_Heure(&min, &h);
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
{
printf("d");

printf("\nErreur : Mauvais Format dans l'heure\n");
longueur_horloge=Saisie_Heure(&min, &h);
}
erreur=Compare_Heure(min,h);
}
printf("e");

return 0;
}

int Compare_Heure(int minute,int heure)
{
int erreur=0;
time_t timestamp;//on recupere la date
struct tm * t;
timestamp = time(NULL);
t = localtime(×tamp);

if(heure>=t->tm_hour)
{
if(minute>t->tm_min)
erreur=0;
else erreur=1;
}
else erreur=1;

return erreur;
}


int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;

printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%s",horloge);
c=getchar();

*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);

return strlen(horloge);
}
0
while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23)
cette lignes est fausse mais plutot :
while(longueur_horloge!=DIMHEURE||min<0||min>59||h<0||h>23)
0
UP

Quelqu'un, une idée?
0

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

Posez votre question
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
Modifié par chuka le 13/05/2010 à 10:14
Salut,
je pense qu'avec cela ca devrait le faire....
#define DIMHEURE 5            


int Saisie_Heure(int* minute, int* heure)  
{  
char horloge[DIMHEURE];  
unsigned char error=0;  
do{  
    memset(horloge,0,DIMHEURE);  
    printf("Choisissez une heure de fermeture automatique (hhmm) :\n");  
    scanf("%s",&horloge[0]);  
    if (horloge[DIMHEURE-1]==0){  
        if (strlen(horloge)==DIMHEURE-1){  
            *heure=10*(horloge[0]-48)+(horloge[1]-48);  
            error=(*heure>=0 && *heure<24)? 0 :1;  
            if(!error){  
                *minute=10*(horloge[2]-48)+(horloge[3]-48);  
                error=(*minute>=0 && *minute<60)? 0 :1;  
                printf("h : %d\n", *heure);printf("m : %d", *minute);  
            }  
        }  
        else  
         error=1;  
    }  
    else  
        error=1;  
}while(error);  

return strlen(horloge);  
}  

ou
void Saisie_Heure(int* minute, int* heure)      
{      
    int horloge;      
    unsigned char error=0;      
    do      
    {      
        printf("Choisissez une heure de fermeture automatique (hhmm) :\n");      
        scanf("%d",&horloge);      
        if(horloge>99){      
            *heure=horloge/100;      
            error=(*heure>0 && *heure<25)? 0 :1;      
            if (!error){      
                *heure=(*heure==24)?0:*heure;    
                *minute=horloge%100;      
                error=(*minute>=0 && *minute<60)? 0 :1;      
            }      
        }      
        else      
            error=1;      
    }      
    while(error);      
}      

A mon avis le problème vient de la non initialisation du tableau char horloge[DIMHEURE]....strlen(horloge) attend un zéro terminal qu'il ne trouve pas... et apres je vois pas trop ce qui se passe....si quelqu'un peu eclairer ma lanterne aussi!!;)
@+
Ce n'est pas parce que certaines choses semblent inexplicables, qu'il faut faire semblant de les expliquer!
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
Modifié par chuka le 13/05/2010 à 11:20
#define DIMHEURE 4
int longueur_horloge;
int min,h;
printf("%X %X\n",&min,&h);//adresse de min et h
longueur_horloge=Saisie_Heure(&min, &h);
printf("%X %X\n",&min,&h);//adresse de min et h ont été modifiée.....


#define DIMHEURE 5
int longueur_horloge;
int min,h;
printf("%X %X\n",&min,&h);//adresse de min et h
longueur_horloge=Saisie_Heure(&min, &h);
printf("%X %X\n",&min,&h);//adresse de min et h identique a celle avant l'appel de la fonction....

Le probleme vient du scanf dans la fonction Saisie_Heure.....mais je vois pas pourquoi...
par ailleurs:
#define DIMHEURE 4
int Saisie_Heure(int* minute, int* heure)
{
char horloge[DIMHEURE];
int c;

printf("Choisissez une heure de fermeture automatique (hhmm) :\n");
scanf("%4c",&horloge[0]);
*heure=10*(horloge[0]-48)+(horloge[1]-48);
*minute=10*(horloge[2]-48)+(horloge[3]-48);
printf("h : %d\n", *heure);printf("m : %d", *minute);

return strlen(horloge);
}
fonctionne bien......
Certainement un buffer overflow.....mais je vois pas en quoi cela devrait affecter les adresses de min et h......
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
13 mai 2010 à 14:14
Bonjour,

Tu dois réserver une place de 5 caractères pour ta chaîne horloge.
En effet, le scanf("%s",...) va te stocker un \0 à la fin. De plus c'est un caractère indispensable pour l'évaluation de la longueur d'une chaîne (strlen).
De plus scanf() est une fonction très dangereuse lorsqu'elle mal utilisée. Je te conseille de mettre : scanf("%4s",horloge) (rajout du 4) pour éviter que l'utilisateur puisse entrer une chaîne plus grande que prévue et récrire dans la pile (surtout sur l'adresse de retour de la fonction) provoquant un segfault inévitable.
Du coup ton : while(longueur_horloge!=DIMHEURE+1||min<0||min>59||h<0||h>23) devra se transformer en longueur_horloge!=DIMHEURE-1...

Ensuite : horloge[1]-48, je te conseille de plutôt mettre horloge[1]-'0'. C'est plus portable et plus lisible.

Si t'as des autres questions, n'hésite pas.

Cdlt,
0
Genial, merci beaucoup vous avez été tres clair!

Par contre, que signifie horloge[1]-'0' ?
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
13 mai 2010 à 23:08
le caractere '0' = 48
pour le verifier:
char m='0';
printf("%c %d",m,m);
@+
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
13 mai 2010 à 23:15
La même chose que 'horloge[1]-48' ... Pour faire simple, disons que les codes ASCII prennent un valeur comprise entre 0 et 255 (prière de ne pas polémiquer); chaque valeur représente un caractère, et il se trouve que la valeur 48 correspond au caractère '0', la valeur 49 au caractère '1', la valeur 50 au caractère '2' ...
Bonne continuation.
0
ha okay, on soustrait la valeur en code ASCII de '0' ! Tres bien, un grand merci a tous pour ces explications :)

A la prochaine

C&M
0