Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appel de structure dans des fonctions en C

    10 août 2017 à 12:01:27

    Bonjour à tous,

    Je ne suis pas très bonne en C et je gère encore très mal les structures. Mon projet est ici de récupérer des données via un capteur et de mettre ces données au format CSV. 

    Voici ma structure et mon main

    struct cvp { 
        float current;        
        float power;
        float voltage;
    };
    
    int main(int argc, char **argv)
    { 
        struct i2c_slave s; 
        struct cvp c;
       /* … */
       Measurements (s.fd, s.s_addr, &c);
        return 0;
    }
    

    La partie commentée concerne la communication i2C et n'est pas intéressante pour ma question.

    Et mes fonctions : 

    void Measurements (int fd, unsigned int s_addr, struct cvp *cvp)
    {
        Read_I_P_V(fd, s_addr, cvp.&current, cvp.&power, cvp.&voltage);
       LTC2947_Export_CSV(cvp.current, cvp.power, cvp.voltage);
    }
    void Read_I_P_V(int fd, unsigned int s_addr, float *I, float *V, float *P){...}
    void Export_CSV(float current, float power, float voltage){...};
    

    J'ai pas mal d'erreur et je ne vois pas ce qui bloque, je fais des mauvais appels de structure je pense ... 

    Pouvez vous m'aider s'il vous plait ?

    -
    Edité par Kakooo 10 août 2017 à 13:18:58

    • Partager sur Facebook
    • Partager sur Twitter
      10 août 2017 à 13:22:04

      Hello, et quelles sont ces erreurs ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 août 2017 à 14:43:59

        DiscorverMynewlife a écrit:

        Hello, et quelles sont ces erreurs ?

        Voici mes erreurs à la compilation :
        error : conflicting types for 'Measurements'
        Measurements(int fd, unsigned int s_addr, struct cvp *cvp)
        
        error : expected identifier before '&' token 
        Read_I_P_V(fd,s_addr,cvp.&current,cvp.&power,cvp&voltage);
        
        error : request for member 'current' in something not a structure or union printf("%f,%f,%f\n", cvp.current, cvp.power, cvp.voltage);
        
        
        error : request for member 'power' in something not a structure or union printf("%f,%f,%f\n", cvp.current, cvp.power, cvp.voltage);
        
        
        error : request for member 'voltage' in something not a structure or union printf("%f,%f,%f\n", cvp.current, cvp.power, cvp.voltage);
        


        • Partager sur Facebook
        • Partager sur Twitter
          10 août 2017 à 15:36:48

          As-tu déclaré la fonction Measurements avant de l'appeler ?

          Measurements(int fd, unsigned int s_addr, struct cvp *cvp);

          L'address-of operator se place à l'identificateur et non aux champs de celui-ci :

          Read_I_P_V(fd, &s_addr, cvp.current, &cvp.power, &cvp.voltage);

          Et concernant les trois dernières erreurs. Tu t'es trompé d'identifiant, ce n'est pas cvp, mais c.

          printf("%f,%f,%f\n", c.current, c.power, c.voltage);

          -
          Edité par DiscorverMyfuckinglife 10 août 2017 à 15:50:10

          • Partager sur Facebook
          • Partager sur Twitter
            10 août 2017 à 15:46:37

            Hello,

            En complément, cvp est, dans Measurements(), un pointeur. Donc, lignes 3 et 4:

            Read_I_P_V(fd, s_addr, cvp->current, cvp->power, cvp->voltage);
            LTC2947_Export_CSV(cvp->current, cvp->power, cvp->voltage);

            -
            Edité par edgarjacobs 10 août 2017 à 15:47:05

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              10 août 2017 à 15:52:37

              C'est bizarre ces fonctions, on travail avec des structures et on envoie en paramètre les éléments un par un de cette structure... Autant leur balancer uniquement un pointeur vers cette structure. Enfin ça limite le nombre de paramètres ça me parait plus simple, mais je peux me tromper...

              -
              Edité par LChalam 10 août 2017 à 16:28:49

              • Partager sur Facebook
              • Partager sur Twitter
                10 août 2017 à 16:24:48

                Merci à tous pour vos réponse !!! 

                DiscorverMyfuckinglife a écrit:

                As-tu déclaré la fonction Measurements avant de l'appeler ?

                Measurements(int fd, unsigned int s_addr, struct cvp *cvp);

                Oui j'ai bien déclaré la fonction, cependant l'erreur subsiste. J'ai également testé avec ta réponse aux dernières erreurs mais ça ne marche pas.

                edgarjacobs :

                void Measurements (int fd, unsigned int s_addr, struct cvp *cvp)
                {
                        Read_I_P_V(fd, s_addr, cvp->current, cvp->power, cvp->voltage);
                        Export_CSV(cvp->current, cvp->power, cvp->voltage);
                
                }
                

                Voici mon code actuel et j'ai toujours les erreurs et warnings suivants (mon main n'a pas bougé) :

                warning : 'struct cvp' declared inside parameter list void Measurements(int fd, unsigned int s_addr, struct cvp *cvp)
                
                warning : passing argument 3 of 'Measurements' from incompatible pointer type Measurements(s.fd, s.s_addr, &c);
                
                error: conflicting types for 'Measurements' void Measurements(int fd, unsigned int s_addr, struc cvp * cvp)
                
                error : incompatible type for argument 3 of 'Read_I_P_V' Read_I_P_V(fd, s_addr, cvp->current, cvp->power, cvp-> voltage)

                la dernière erreur pour argument 3, 4, 5 également.





                -
                Edité par Kakooo 14 août 2017 à 11:33:39

                • Partager sur Facebook
                • Partager sur Twitter
                  14 août 2017 à 11:34:03

                  Quelqu'un s'il vous plait ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 août 2017 à 12:04:32

                    Salut.

                    Ta structure est déclarée à un endroit, tu as un include juste au dessus ? Comment se termine le fichier inclus ?

                    Déjà, quand je lis ça :

                    void Export_CSV(float current, float power, float voltage){...};

                    Il n'y a pas besoin du ; (mais ça ne devrait pas être ça le soucis).

                    Il est possible qu'au contraire, tu n'ais pas fermé un truc dans le fichier inclus du dessus, et donc il considère que tu n'as pas fermé un truc avant de déclarer ta structure.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      14 août 2017 à 14:40:35

                      Fvirtman a écrit:

                      Salut.

                      Ta structure est déclarée à un endroit, tu as un include juste au dessus ? Comment se termine le fichier inclus ?

                       Alors effectivement j'ai un fichier .h avec toutes mes déclarations de fonctions, et j'inclus ce fichier dans mon .c.

                      J'ai bien vérifié que chaque fonction et prototype de fonction correspondaient. Mon fichier h termine par ma dernière déclaration de fonction à savoir 

                      void Measurements (
                      	int fd, 
                      	unsigned int s_addr, 
                      	struct cvp *cvp
                      );


                      Je ne trouve rien de pas fermé également :( Je n'arrive pas à trouver l'origine de l'erreur.

                      j'ai une note en + de l'erreur qui me dit : 

                      test.h:64:6:note : previous declaration of 'Measurements' was here void Measurements (int fd, unsigned int s_addr, struct cvp *cvp);

                      sauf que les deux prototypes sont bien identiques...


                      -
                      Edité par Kakooo 14 août 2017 à 14:52:47

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 août 2017 à 15:32:56

                        J'ai écris une grosse bêtise !

                        -
                        Edité par edgarjacobs 14 août 2017 à 15:36:16

                        • Partager sur Facebook
                        • Partager sur Twitter

                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                          14 août 2017 à 15:48:49

                          Est-ce que lors de la déclaration de Measurements, la structure struct cvp est connu ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 août 2017 à 10:38:18

                            edgarjacobs a écrit:

                            J'ai écris une grosse bêtise !

                            -
                            Edité par edgarjacobs 14 août 2017 à 15:36:16


                            Avec les -> ?

                            rouloude a écrit:

                            Est-ce que lors de la déclaration de Measurements, la structure struct cvp est connu ?


                            J'ai implémenté ma structure au début de mon fichier .c avant mon main 
                            struct cvp {
                                float current;       
                                float power;
                                float voltage;
                            };

                            La déclaration de Measurements se fait dans le .h.

                            En déplaçant l'implémentation de la structure dans le .h je n'ai effectivement plus l'erreur de "conflicting type" pour Measurement.  Parcontre j'ai toujours :

                            error incompatible type for argument 3, 4, 5 of Read_I_P_V

                            -
                            Edité par Kakooo 16 août 2017 à 11:03:30

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 août 2017 à 17:55:26

                              Ta fonction attend un pointeur sur float, tu lui envois un float ce n'est donc pas compatible !
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Appel de structure dans des fonctions en C

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown