Comparaison de structures

Résolu
mal0506 Messages postés 7 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 28 février 2012 - 26 févr. 2012 à 22:30
mal0506 Messages postés 7 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 28 février 2012 - 28 févr. 2012 à 19:00
Salut à tous!

Je veux écrire une fonction post(t1,t2) de deux arguments de type struct temps testant si le temps t1 est postérieur au temps t2. Elle renverra un entier:
1 si t1 est postérieur à t2
0 si les temps sont exactement égaux
-1 si t2 est postérieur à t1

le programme principal permettant de tester et d'afficher un message indiquant l'antériorité des temps et ci-dessous. Le resultat que j'attends n'est pas ça. Si quelqu'un pouvait m'aider. Merci

#include <stdio.h>
#include <stdlib.h>
#include <mem.h>

struct temps
{
int heure;
int minute;
int seconde;
};
struct temps t1, t2;

void entree(struct temps *a)
{
a->heure=0; a->minute=0; a->seconde=0;

do
{

scanf("%d:%d:%d", &a->heure, &a->minute, &a->seconde);
if ((a->heure>23)||(a->minute>59)||(a->seconde>59))
printf("Temps invalide...Veuillez recommencer...\n");
else
printf("\n");

}
while ((a->heure>23)||(a->minute>59)||(a->seconde>59));
}
int post(t1,t2)
{

int test=0;

if(memcmp(&t1,&t2,sizeof(struct temps))==0)
test=0;
if(memcmp(&t1,&t2,sizeof(struct temps))==1)
test=1;
if(memcmp(&t1,&t2,sizeof(struct temps))==-1)
test=-1;
return test;
}
int main()
{
int test2=0;
struct temps t1 = {0,0,0};
struct temps t2 = {0,0,0};
printf("Entrez un temps t1:\n");
entree(&t1);
printf("Entrez un temps t2:\n");
entree(&t2);
test2=post(t1,t2);
if(test2==0)
printf("Les temps sont egaux\n");
if(test2==1)
printf("Le temps t1 est posterieur au temps t2\n");
if(test2==-1)
printf("le temps t2 est posterieur au temps t1\n");
return 0;
}
A voir également:

11 réponses

mal0506 Messages postés 7 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 28 février 2012
28 févr. 2012 à 10:25
Salut!

Merci, j'ai retrouver mon erreur. Plus d'erreur de compilation. Le resultat est bon. Encore une fois merci. Mais j'aurai encore votre aide pour finaliser mon problème sans abuser de votre gentillesse.
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
27 févr. 2012 à 01:37
salut,

Tu ne peux pas comparer une structure de cette manière avec le processeur intel (little endian). Cette architecture impose que les bits les plus éloignés de l'adresse de depart sont ceux qui ont le plus d'importance (poids fort) dans la comparaison.

Tu es obligé de tester valeur par valeur comme tu as fait pour les limites.

@++
0
mal0506 Messages postés 7 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 28 février 2012
27 févr. 2012 à 10:15
Salut!
Comment tester valeur par valeur?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 févr. 2012 à 10:43
Bonjour.

Au lieu d'utiliser un memcmp, tu vérifies chacun des membres, un par un.

Par exemple ceci:
if (memcmp(&t1,&t2,sizeof(struct temps))==0)

deviendrait:
if (t1.heure t2.heure && t1.minute t2.minute && t1.seconde == t2.seconde)


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

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

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 févr. 2012 à 13:30
Salut,

c'est peut être hors sujet si tu ne veux que du C, mais en c++ on peut faire simplement ceci afin d'utiliser les opérateurs:

struct temps 
{ 
int heure; 
int minute; 
int seconde; 

int operator==(temps& t)
{
return (heure==t.heure && minute==t.minute && seconde==t.seconde);
}
int operator<(temps& t)
{
return( heure<t.heure || (heure==t.heure && minute<t.minute) || (heure==t.heure && minute==t.minute && seconde<t.seconde) );
}
int operator>(temps& t)
{
return( heure>t.heure || (heure==t.heure && minute>t.minute) || (heure==t.heure && minute==t.minute && seconde>t.seconde) );
}
}; 




t1.heure=12; t1.minute=55; t1.seconde=13;
t2.heure=12; t2.minute=56; t2.seconde=13;

if(t1 == t2)
puts("temps égaux");
else if( t1<t2 )
puts("t1 < t2");
else if( t1>t2 )
puts("t1 > t2");
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2012 à 16:23
On réorganise correctement, ET avec struct = 32 bits.
struct temps 
{ 
  BYTE seconde;
  BYTE minute;
  WORD heure;
};

DWORD A, B;
A = *(DWORD*) &t1);
B = *(DWORD*) &t2);
Maintenant toutes comparaisons peuvent se faire en 1 cycle.
if(A != B) ...
if(A > B) ...

etc...


ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2012 à 16:24
OUPS, manque 1 '('

A = *((DWORD*) &t1);
B = *((DWORD*) &t2);

ciao...
BruNews, MVP VC++
0
mal0506 Messages postés 7 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 28 février 2012
28 févr. 2012 à 00:01
Salut!

Encore merci de votre aide qui me met sur la voie. Mais j'ai quelques soucis. J'ai suivi vos conseils de comparaison champ par champ dans la fonction post(t1,t2) mais le compilateur me renvoie des erreurs.Que faire?


#include <stdio.h>
#include <stdlib.h>


struct temps
{
int heure;
int minute;
int seconde;
};
struct temps t1, t2;

void entree(struct temps *a)
{
a->heure=0; a->minute=0; a->seconde=0;

do
{

scanf("%d:%d:%d", &a->heure, &a->minute, &a->seconde);
if ((a->heure>23)||(a->minute>59)||(a->seconde>59))
printf("Temps invalide...Veuillez recommencer...\n");
else
printf("\n");

}
while ((a->heure>23)||(a->minute>59)||(a->seconde>59));
}
int post(t1,t2)
{

int test=0;

if((t1.heure==t2.heure)&&(t1.minute==t2.minute)&&(t1.seconde==t2.seconde))
test=0;
if((t2.heure<t1.heure)||(t2.minute<t1.minute)||(t2.seconde<t1.seconde))
test=-1;
if((t1.heure<t2.heure)||(t1.minute<t2.minute)||(t1.seconde<t2.seconde))
test=1;
return test;
}
int main()
{
int test2=0;
struct temps t1 = {0,0,0};
struct temps t2 = {0,0,0};
printf("Entrez un temps t1:\n");
entree(&t1);
printf("Entrez un temps t2:\n");
entree(&t2);
test2=post(t1,t2);
if(test2==0)
printf("Les temps sont egaux\n");
if(test2==1)
printf("Le temps t1 est posterieur au temps t2\n");
if(test2==-1)
printf("le temps t2 est posterieur au temps t1\n");
return 0;
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
28 févr. 2012 à 01:18
int post(t1,t2)

Où sont les types des arguments de ta fonction ?

Par exemple plus haut dans ton code, tu as:
void entree(struct temps *a) 


Tu as maintenant suffisamment d'indices pour remarquer ton erreur :).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
mal0506 Messages postés 7 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 28 février 2012
28 févr. 2012 à 12:30
SALUT!

Maintenant je doit écrire une fonction diff(t1,t2)renvoyant une valeur de type struct temps calculant un troisième temps t3 différence de t1 et t2. Comment faire? Merci d'avnce.
0
mal0506 Messages postés 7 Date d'inscription mercredi 9 juin 2010 Statut Membre Dernière intervention 28 février 2012
28 févr. 2012 à 19:00
Salut!

Je suis à terme de mon code en c qui a pour objectif de calculer la différence entre deux temps. Voici le code final ci-dessous. Le test est bon pour certains temps mais mauvais pour d'autres(testez-le vous même pour voir). Je demande votre aide quant à la modification de mon code. Merci d'avance.




#include <stdio.h>
#include <stdlib.h>


struct temps
{
int heure;
int minute;
int seconde;
};


void entree(struct temps *a)
{
a->heure=0; a->minute=0; a->seconde=0;

do
{

scanf("%d:%d:%d", &a->heure, &a->minute, &a->seconde);
if ((a->heure>23)||(a->minute>59)||(a->seconde>59)||(a->heure<0)||(a->minute<0)||(a->seconde<0))
printf("Temps invalide...Veuillez recommencer...\n");
else
printf("\n");

}
while ((a->heure>23)||(a->minute>59)||(a->seconde>59)||(a->heure<0)||(a->minute<0)||(a->seconde<0));
}

void sortie(struct temps b)
{
printf("\nLa difference entre les deux temps est:\n");
printf("%d:%d:%d", b.heure, b.minute, b.seconde);
}

int post(struct temps *t1, struct temps *t2)
{

int test=0;

if((t1->heure==t2->heure)&&(t1->minute==t2->minute)&&(t1->seconde==t2->seconde))
test=0;
else if((t2->heure<t1->heure)||(t2->minute<t1->minute)||(t2->seconde<t1->seconde))
test=-1;
else if((t1->heure<t2->heure)||(t1->minute<t2->minute)||(t1->seconde<t2->seconde))
test=1;
return test;
}
struct temps diff(struct temps t1, struct temps t2)
{
struct temps t3={};
struct temps temps1={}, temps2={};

if(t1.heure < t2.heure)
{
temps1 = t1;
temps2 = t2;
}
else
{
temps1 = t2;
temps2 = t1;
}

if(t1.seconde<t2.seconde)
{
t3.seconde=(60+t1.seconde)-t2.seconde;
t1.minute=t1.minute-1;
}
else
{
t3.seconde=t1.seconde-t2.seconde;
}

if(t1.minute<t2.minute)
{
t3.minute=(60+t1.minute)-t2.minute;
t1.heure=t1.heure-1;
}
else
{
t3.minute=t1.minute-t2.minute;
t3.heure=t1.heure-t2.heure;
}
return t3;

}
int main()
{
int test2=0;
struct temps t1 = {};
struct temps t2 = {};
struct temps t3 = {};
printf("Entrez un temps t1 (heure:minute:seconde):\n");
entree(&t1);
printf("Entrez un temps t2 (heure:minute:seconde):\n");
entree(&t2);
test2=post(&t1,&t2);
if(test2==0)
printf("Les temps sont egaux\n");
if(test2==1)
printf("Le temps t1 est posterieur au temps t2\n");
if(test2==-1)
printf("le temps t2 est posterieur au temps t1\n");
t3=diff(t1,t2);
sortie(t3);
getch();
return 0;
}
0
Rejoignez-nous