[C] pointeur de structure

Résolu
Bonjour,

Voila j'ai un soucis avec un programme en C. J'ai une fonction diff() qui devrait retourner dans main() un pointeur de structure mais j'obtiens les erreurs suivantes:

D6.2C.c: In function ‘main’:
D6.2C.c:27: attention : assignment makes pointer from integer without a cast
D6.2C.c: In function ‘diff’:
D6.2C.c:73: attention : return makes integer from pointer without a cast

Voici le programme:

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

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

main()
{
int x;
struct temps t1;
struct temps t2;
struct temps *t3;
struct temps tx;
entree(&t1);
entree(&t2);
x=post(&t1,&t2);
if (x==-1)
{
tx=t1;
t1=t2;
t2=tx;
}
t3=diff(&t1,&t2); */1ere erreur*/
sortie(&t3);
}

entree(struct temps *t)
{
printf("Entrez un temps (hh:mn:sec) : ");
scanf("%i : %i : %i",&(t->heure),&(t->minute),&(t->seconde));
while (t->heure<0 || t->heure>23 || t->minute<0 || t->minute>59 || t->seconde<0 || t->seconde>59)
{
printf("Temps invalide...Veuillez recommencer...");
scanf("%i : %i : %i",&(t->heure),&(t->minute),&(t->seconde));
}
}

post(struct temps *t1,struct temps *t2)
{
int x;
if (t1->heure>t2->heure) x=-1;
if (t1->heure==t2->heure) x=0;
if (t1->heure<t2->heure) x=1;
if (x==0)
{
if (t1->minute>t2->minute) x=-1;
if (t1->minute==t2->minute) x=0;
if (t1->minute<t2->minute) x=1;
if (x==0)
{
if (t1->seconde>t2->seconde) x=-1;
if (t1->seconde==t2->seconde) x=0;
if (t1->seconde<t2->seconde) x=1;
}
}
return x;
}

diff(struct temps *t1,struct temps *t2)
{
struct temps *t3;
t3=malloc(sizeof(struct temps*));
t3->heure=t2->heure-t1->heure;
t3->minute=t2->minute-t1->minute;
t3->seconde=t2->seconde-t1->seconde;
return t3; */2eme erreur*/
}

sortie(struct temps *t3)
{
printf("La différence entre les deux temps est de : %i h %i mn %i sec\n",t3->heure,t3->minute,t3->seconde);
}

Merci d'avance de votre aide
Configuration: Linux Mandriva
Firefox 3.0.10

8 réponses

  1. Modérateur
    Salut,

    Ta fonction n'a pas de type de retour (voir aussi pour les autres fonctions)
    diff(struct temps *t1,struct temps *t2)
    Ce n'est pas plutôt?
    struct temps* diff(struct temps *t1,struct temps *t2) 

    1. Oui je sais j'ai déjà essayé de faire ça mais ça donne les mêmes erreurs...
      1. Modérateur
        Re,

        t3=(struct temps*) malloc(sizeof( struct temps )); 
        --
        106485010510997108
        1. Ok je te remercie, je peux pas la mais je vais essayer ça ce soir , par contre je ne comprends pas pourquoi il y a besoin de caster alors que j'ai mis dans diff():

          struct temps *t3;

          La, je capte pas... t3 est bien déclaré en pointeur sur une structure non ?
        2. Modérateur
          @JamsssRe,

          t3 c'est un pointeur de structure temsp donc de type struct temps*
          Quand tu alloues de la mémoire c'est la taille de la structure temps que tu alloues pas celle de pointeur comme tu l'as fait.
          Peut être que tu n'est pas obligé de caster et tester tout simplement
          t3 = malloc (sizeof (struct temps));
        3. @lami20jÇa ne fonctionne pas... avec ou sans le cast ça me met toujours les mêmes erreurs
      2. Bah déjà, mets un type de retour. :D
        Puis il manque le cast en effet. :)
        1. Modérateur
          Salut,

          Voici ton code compilé sous
          Linux debian 2.6.26-2-686 #1 SMP Wed Aug 19 06:06:52 UTC 2009 i686 GNU/Linux
          gcc (Debian 4.3.2-1.1) 4.3.2
          Copyright (C) 2008 Free Software Foundation, Inc.
          This is free software; see the source for copying conditions.  There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          

          Plus bas tu as la compilation et un exemple d'exécution.

          #include <stdio.h>
          #include <stdlib.h>
          
          struct temps{
            int heure;
            int minute;
            int seconde;
          };
          
          void entree(struct temps *t);
          int post(struct temps *t1,struct temps *t2);
          struct temps* diff(struct temps *t1,struct temps *t2);
          void sortie(struct temps *t3);
          
          int main()
          {
            int x;
            struct temps t1;
            struct temps t2;
            struct temps *t3;
            struct temps tx;
            entree(&t1);
            entree(&t2);
            x=post(&t1,&t2);
            if (x==-1){
              tx=t1;
              t1=t2;
              t2=tx;
            }
            t3=diff(&t1,&t2);
            sortie(t3);
            return 0;
          }
          
          void entree(struct temps *t){
            printf("Entrez un temps (hh:mn:sec) : ");
            scanf("%i : %i : %i",&(t->heure),&(t->minute),&(t->seconde));
            while (t->heure<0 || t->heure>23 || t->minute<0 || t->minute>59 || t->seconde<0 || t->seconde>59){
              printf("Temps invalide...Veuillez recommencer...");
              scanf("%i : %i : %i",&(t->heure),&(t->minute),&(t->seconde));
            }
          }
          
          int post(struct temps *t1,struct temps *t2){
            int x;
            if (t1->heure>t2->heure) x=-1;
            if (t1->heure==t2->heure) x=0;
            if (t1->heure<t2->heure) x=1;
            if (x==0){
              if (t1->minute>t2->minute) x=-1;
              if (t1->minute==t2->minute) x=0;
              if (t1->minute<t2->minute) x=1;
              if (x==0){
                if (t1->seconde>t2->seconde) x=-1;
                if (t1->seconde==t2->seconde) x=0;
                if (t1->seconde<t2->seconde) x=1;
              }
            }
            return x;
          }
          
          struct temps* diff(struct temps *t1,struct temps *t2){
            struct temps *t3;
            t3=(struct temps*) malloc(sizeof(struct temps));
            t3->heure=t2->heure-t1->heure;
            t3->minute=t2->minute-t1->minute;
            t3->seconde=t2->seconde-t1->seconde;
            return t3; 
          }
          
          void sortie(struct temps *t3){
            printf("La différence entre les deux temps est de : %i h %i mn %i sec\n",t3->heure,t3->minute,t3->seconde);
          } 
          
          compilation et exécution
          lami20j@debian:~$ gcc c.c
          lami20j@debian:~$ ./a.out
          Entrez un temps (hh:mn:sec) : 10:05:20
          Entrez un temps (hh:mn:sec) : 11:02:30
          La différence entre les deux temps est de : 1 h -3 mn 10 sec
          
          1. Je te remercie mais je viens justement de trouver la solution, enfin ! Pas simple ces pointeurs quand on débute en C, encore merci pour ton aide

            A bientôt

            Jamsss
            1. Modérateur
              Re,

              Pour moi, à part les prototypes et le type des fonctions, la seule erreur que j'ai trouvé c'était ici

              sortie(&t3);

              En fait t3 dans main étant déjà un pointeur &t3 c'est l'adresse d'un pointeur.
              La fonction sortie demande un pointeur de fonction en argument donc il fallait écrire
               sortie(t3);

              1. Oui oui j'ai vu ça aussi mais le probleme de cast venait surtout de la:

                t3=diff(&t1,&t2);

                j'ai fais à la place :

                struct temps *diff();
                t3=diff(&t1,&t2);

                En fait j'avais déjà essayé mais en faisant:

                t3=struct temps *diff(&t1,&t2);

                ce qui ne fonctionne pas