IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Structure et fonctions


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Par défaut Structure et fonctions
    Bonsoir,

    J'ai déclaré une structure de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     typedef struct{
        float x;
        float y;
        float a;
        float b;
        float x_result;
        float y_result;
        float length_result;
      } vector;
      vector pt_rec;
    .


    Ensuite, je désire simplement créer une fonction effectuant certaines opérations sur les variables de cette structure; par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static float DoSth(float pt_rec.x, float pt_rec.a, float pt_rec.y, float pt_rec.b){
    (...)
    return x_result;
    }
    .
    Seulement, j'obtiens, à la compilation:
    error: expected ‘;’, ‘,’ or ‘)’ before ‘.’ token
    1) Comment puis-je faire?
    En effet, d'habitude, j'accède à un élément d'une structure par structure.élément.

    2) Je souhaiterais simplement que la fonction calcule x_result et y_result. Est-il ``mieux'' de déclarer la fonction comme static float, et de lui faire retourner x_result et y_result (si cela est possible), ou vaut-il mieux la déclarer ne retournant rien (void)?

    Merci.

  2. #2
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     typedef struct{
        float x;
        float y;
        float a;
        float b;
        float x_result;
        float y_result;
        float length_result;
      } vector;
      vector pt_rec;
    .
    pt_rec.x etc ... est un float, donc tu peux declarer ta fonction comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static float DoSth(float x, float a, float y, float b) {
    Et l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoSth(pt_rec.x,pt_rec.a, pt_rec.y, pt_rec.b);
    Tu peux aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static float DoSth(vector rec) {
    /* tu peux acceder aux aux membres rec.x rec.y etc... */
    }
     
    DoSth(pt_rec);
    Ceci dit, les operations de copie de structures sont assez cheres. Moi je ferais avec des pointeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static float DoSth(vector *p_rec) {
    /* tu peux acceder aux aux membres p_rec->x p_rec->y etc... */
    }
     
    DoSth(&pt_rec);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Par défaut
    Merci.
    J'en arrive donc à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
      typedef struct{
        float x;
        float y;
        float a;
        float b;
        float x_result;
        float y_result;
        float length_result;
      } vector;
      vector pt_rec;
     
    static vector DoSth(float, float, float, float); // declaration
     
    static vector DoSth(float x, float a, float y, float b){
    (...)
    return pt_rec;
    }
    Le problème est que je reçois:

    foo.c:71: warning: unused parameter ‘x’
    foo.c:71: warning: unused parameter ‘a’
    foo.c:71: warning: unused parameter ‘y’
    foo.c:71: warning: unused parameter ‘b’
    , bien que le programme fonctionne (et retourne les bonnes valeurs).

    Que faire? Merci.

  4. #4
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    La a priori il n'y a pas de probleme donc il va falloir que tu postes le code en entier

    Ah et je n'avais pas vu cette question:
    2) Je souhaiterais simplement que la fonction calcule x_result et y_result. Est-il ``mieux'' de déclarer la fonction comme static float, et de lui faire retourner x_result et y_result (si cela est possible), ou vaut-il mieux la déclarer ne retournant rien (void)?
    Une fonction ne peut retourner qu'une seule valeur. Mais il y a des astuces:
    - retourner une structure (ce que tu as fait)
    - passer les variables en parametres via des pointeurs
    - retourner un pointeur vers un structure
    - et surement d'autres
    Personnellement je prefere la deuxieme solution pour pouvoir retourner un code d'erreur.

Discussions similaires

  1. Probleme avec structures et fonctions
    Par isaac727 dans le forum Débuter
    Réponses: 2
    Dernier message: 01/04/2008, 00h01
  2. Passage d'une structure en fonction
    Par god_enel dans le forum C
    Réponses: 11
    Dernier message: 15/04/2007, 21h55
  3. structures et fonctions
    Par olivier1209 dans le forum C
    Réponses: 11
    Dernier message: 10/12/2006, 15h53
  4. Structure et fonction
    Par progfou dans le forum C
    Réponses: 7
    Dernier message: 04/07/2006, 15h23
  5. structures et fonctions
    Par kendras dans le forum C
    Réponses: 15
    Dernier message: 14/06/2006, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo