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 :

Problème de classe


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Par défaut Problème de classe
    Bonjour,
    J'ai créé une classe "vector" mais je n'arrive pas à définir un vecteur vide dans cette classe, je suis obligé de le faire dans le main.

    Voici le fichier vector.h
    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
    #ifndef vector
    #define vector
     
    /* vecteur en dimension 2 */
    typedef struct _vect
    {
    	double x;
    	double y;
    } vect;
     
     
    double norme(vect v);
    vect vect_add(vect v1, vect v2);
    vect vect_sub(vect v1, vect v2);
    vect mul_scal(double a, vect v);
     
    #endif
    et le fichier vector.c
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include "vector.h"
    #include <math.h>
     
    //Classe sur les vecteurs de dimension 2
     
     
    /* norme d'un vecteur */
    double norme(vect v)
    {
    	return sqrt((v.x * v.x) + (v.y * v.y));
    }
     
    /* v1 + v2 */
    vect vect_add(vect v1, vect v2)
    {
    	vect res;
    	res.x = v1.x + v2.x;
    	res.y = v1.y + v2.y;
    	return res;
    }
     
    /* v1 - v2 */
    vect vect_sub(vect v1, vect v2)
    {
    	vect res;
    	res.x = v1.x - v2.x;
    	res.y = v1.y - v2.y;
    	return res;
    }
     
     
    /* a.v  (a réel) */
    vect mul_scal(double a, vect v)
    {
    	vect res;
    	res.x = a * v.x;
    	res.y = a * v.y;
    	return res;
    }
    Est-ce que c'est possible de définir vect vecteur_nul = {0,0}; ailleurs que dans le main ?

    Merci beaucoup.

  2. #2
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Salut a toi !

    Heu "classe" ? on va te fouetter

    Sinon tu peux tout simplement définir une fonction de ce style

    vecteur initVect()
    {
    vecteur v;
    v.x = 0;
    v.y = 0;

    ....
    }
    Non ? Mais j'ai peur de pas bien comprendre ton problème oO

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il faut faire attention, le renvoi de telles structures est possible mais assez lourd. En général, on renvoie l'adresse d'un élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    vecteur *initVect()
    {
        vecteur *v = malloc (sizeof *v);
        if (v != NULL)
        {
            v->x = 0;
            v->y = 0;
        }
     
        return v;
    }
    En n'oubliant pas de libérer par free la mémoire allouée à v lorsqu'on a terminé de s'en servir.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Par défaut
    Salut,
    Dans le main je réinitialise un tableau de vecteur avec le vecteur vide donc j'ai besoin de ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vect vecteur_nul = {0,0};
    mais le problème c'est que je ne peux pas le définir dans la classe () vector (il y a une erreur).

    Merci

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Ouais on est pas en C++, ya pas de classes.
    Ton probleme vient du fait qu'on peut pas utiliser les initialisations du genre "= {0.0, 0.0}" ailleurs que dans une declaration.
    Autrement dit on peut faire
    mais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vect v;
    v = {0.0, 0.0};
    Il te faut une "methode" set() ou init() à laquelle on passe un pointeur sur le vect à positionner. A la limite, un "constructeur" vect_create() qui retourne un vect initialisé (vu que t'as d'autres methodes qui retourne un vect, ça serait pas choquant)...

    Maintenant, si tu veux faire quelquechose qui se rapproche plus d'une vraie classe, faut voir du côté des "types abstraits de données" et utiliser l'allocation dynamique

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Sinon tu peux faire (non testé ici)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    vect vecteur_nul=
    {
      .x=0.,
      .y=0.,
    };

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par azertylr Voir le message
    Bonjour,
    J'ai créé une classe "vector" mais je n'arrive pas à définir un vecteur vide dans cette classe, je suis obligé de le faire dans le main.

    Voici le fichier vector.h
    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
    #ifndef vector
    #define vector
     
    /* vecteur en dimension 2 */
    typedef struct _vect
    {
    	double x;
    	double y;
    } vect;
     
     
    double norme(vect v);
    vect vect_add(vect v1, vect v2);
    vect vect_sub(vect v1, vect v2);
    vect mul_scal(double a, vect v);
     
    #endif
    Pour ma part, je préfère passer des pointeurs en arguments (il y a donc moins de copies temporaires). Les prototypes deviendraient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    double norme(vect v);
    vect vect_add(vect * v1, vect *v2);
    vect vect_sub(vect *v1, vect *v2);
    vect mul_scal(double a, vect *v);
    Donc dans ton fichier source, tu changes juste le point (v1.x) en -> (v1->x).
    Sinon, je ne suis pas sûr que ce soit une bonne idée de faire ce genre de fonction. Comment fais-tu la somme de 3 vecteurs ? Tu dois appeler deux fois ta fonction vect_add alors qu'avec une simple boucle for c'est gagné => le calcul se fait plus vite.

    Dans mon prgm, j'utilise des vecteurs et des matrices à gogo. Je fais toutes les opérations avec des boucles : c'est facile, un petit commentaire rend le code lisible, et c'est très rapide.

    Mais sinon c'est un très bon exercie pour manipuler les structures, les pointeurs etc... que de se faire une structre Vecteur et Matrice et d'y implémenter les fonctions d'algèbre linéaire...

  8. #8
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Par défaut
    Je ne fais pas d'ajout de plus de 2 vecteurs a la fois donc pour le moment tous va bien.
    salseropom : Comment passe tu tout les vecteurs à ajouter à ta fonction ?
    Est-ce qu'utiliser des pointeurs améliorera la vitesse du programme ?

    Je suis en train de faire un programme de modélisation de la trajectoire des planètes donc la vitesse d'exécution est primordiale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vect vecteur_nul=
    {
      .x=0.,
      .y=0.,
    };
    ne marche pas

    Si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vect vecteur_nul = {0.0, 0.0};
    dans vector.h le compilateur renvoit "multiple definition of `vecteur_nul'"

    Merci de toutes vos réponses.

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Si la vitesse d'exécution est primordiale, passe des adresses (pointeurs) plutôt que des valeurs.
    Ne définit jamais rien dans un .h
    Tu peux déclarer dans le .h "extern vect vecteur_nul;" et le définir dans le vecteur.c "vect vecteur_nul = {0.0, 0.0};"
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Ne définit jamais rien dans un .h
    Tu peux déclarer dans le .h "extern vect vecteur_nul;" et le définir dans le vecteur.c "vect vecteur_nul = {0.0, 0.0};"
    Je te remercie, maintenant ca marche.

    Si la vitesse d'exécution est primordiale, passe des adresses (pointeurs) plutôt que des valeurs.
    Je mets donc
    dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vect vect_add(vect *v1, vect *v2);
    dans le .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vect vect_add(vect *v1, vect *v2)
    {
    	vect res;
    	res.x = v1->x + v2->x;
    	res.y = v1->y + v2->y;
    	return res;
    }
    et j'utilise comment la fonction vect_add ?

    Edit : en fait je bloque pour utiliser un vect_add(&v1,mult_scal(a,&v2));
    et il n'accepte pas &mult_scal(a,&v2)

    Merci

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Bonjour,
    1. Déjà, les pointeurs devraient être const.
    2. Ici, je pense que tu es obligé de passer par une variable intermédiaire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    en fait je bloque pour utiliser un vect_add(&v1,mult_scal(a,&v2));
    et il n'accepte pas &mult_scal(a,&v2)
    Tu ne peux utiliser ce genre d'écriture avec des fonctions qui renvoie un vect avec des arguments en vect*. Le & ne peut s'appliquer qu'à un objet or tes fonctions renvoient des valeurs (de vect). Tu es alors obligé de passer par un objet vect intermédiaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vect v3= mult_scal(a,&v2);
    vect v4= vect_add(&v1,&v3);

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par azertylr Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vect vect_add(vect *v1, vect *v2)
    {
    	vect res;
    	res.x = v1->x + v2->x;
    	res.y = v1->y + v2->y;
    	return res;
    }
    et j'utilise comment la fonction vect_add ?

    Edit : en fait je bloque pour utiliser un vect_add(&v1,mult_scal(a,&v2));
    et il n'accepte pas &mult_scal(a,&v2)

    Merci
    modifie encore le prototype de ta fonction vect_add : tu renvoie une copie complète de ta strucutre. Si tu ne renvoyais qu'un pointeur, ça irait encore plus vite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void vect_add(vect * v1,vect * v2, vect * v3)
    {
      v3->x=v1->x+v2->x;
      v3->y=v1->y+v2->y;
    }
    ici tu ne renvoies rien. Tu peux aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    vect * vect_add(vect * v1,vect * v2,)
    {
      vect * v3=malloc(sizeof(*v3));
      if(v3==NULL) /* erreur */
     
      v3->x=v1->x+v2->x;
      v3->y=v1->y+v2->y;
     
     return v3;
    }
    mais là il faudra faire un free à chaque fois, donc ce n'est pas super. Je préfère donc la 1e proposition.

Discussions similaires

  1. Problème de classe.
    Par maminova77 dans le forum Langage
    Réponses: 5
    Dernier message: 30/01/2006, 21h39
  2. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20
  3. Problème de classe
    Par DeusXL dans le forum DirectX
    Réponses: 15
    Dernier message: 04/12/2005, 14h37
  4. Problème de classe
    Par tidou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/10/2005, 17h49
  5. [FLASH MX2004] Problème de classe
    Par JulPoWeR dans le forum Flash
    Réponses: 1
    Dernier message: 10/07/2005, 22h51

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