[c++] Accés à une même case mémoire???

Fermé
usthb07 Messages postés 1 Date d'inscription samedi 30 juin 2007 Statut Membre Dernière intervention 30 juin 2007 - 30 juin 2007 à 20:42
 farfattou - 11 mars 2008 à 13:20
Bonjour.

Tous d'abord je suis entrain d'améliorer le protocole de routage AODV pour les réseaux mobiles Ad Hoc. Je travail sur LINUX, j'utilise le simulateur NS-2 et je programme avec le langage C++.

S'il vous plait, est ce que vous pouvez m'aider à résoudre le problème suivant:
J'ai déclaré une variable membre ("energy") de la classe AODV dans le fichier aodv.h (je l'ai utilisé bien sûr dans le fichier aodv.cc), le tous se trouve dans un dossier nommé "aodv".
Je veux récupérer cette variable " energy" pour l'utiliser dans une méthode ("recvDATA") d'une autre classe MAC802_11 se trouvant dans un fichier mac_802-11.cc, le tous est dans un autre dossier nommé "mac".
En d'autre terme, je veux accéder à la même variable "energy" depuis une autre méthode d'une autre classe se trouvant dans un fichier différent.
J'ai essayé cette solution mais ça n'a pas marché car j'ai eu un bug de type "Segmentation fault":


au niveau du fichier mac_802-11.h j'ai rajouté:
#include "aodv/aodv.h"
............
class Mac802_11 : public Mac {
...........
friend class aodv;
public:
................
AODV *thisaodv;
...............
}


au niveau du fichier mac_802-11.cc j'ai rajouté:
void Mac802_11::recvDATA(Packet *p)
{
.............
thisaodv->energy=thisaodv->energy-1;
..............
}
Où est le problème s'il vous plait. Si c'est possible, proposez-moi d'autres solutions.


Merci d'avance.

2 réponses

Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
1 juil. 2007 à 00:47
Bonjour,

Je ne connais absolument pas ce protocole de routage mais on va essayer de voir le problème de façon plus générale. Si on comprend bien tu as deux dossiers comme ceci au même niveau :

aodv : aodv.h, aodv.cpp
mac : mac_802-11.h, mac_802-11.cpp

La classe Aodv est "seule" tandis que la classe Mac802_11 dérive d'une classe Mac.

Dans Aodv tu as donc un truc genre : class Aodv {private : type energy;}

Pour commencer, au niveau du fichier mac_802-11.h, si tu fais référence à "aodv/aodv.h", ça veut dire que tu vas chercher la classe dans "mac/aodv/aodv.h" puisque le fichier mac_802-11.h se trouve dans un dossier "mac" tu as écrit. Donc déjà il faudrait plutôt inclure "../aodv/aodv.h".

Je n'ai pas l'habitude d'utiliser le mot clé friend mais d'après ce que j'en ai lu : "friend permet de déclarer une fonction ou une classe avec les droits d'accès complets aux membres privés et protégés de la classe, sans être un membre de cette classe. La classe externe dispose d’un accès complet à la classe qui la déclare friend."

Donc ça voudrait dire qu'en déclarant "friend class aodv; ", c'est la classe Aodv qui a accès aux membres de la classe Mac802_11 et pas l'inverse. On est d'accord ou j'ai mal compris la règle ?

Quoiqu'il en soit si j'avais une classe A avec une propriété "a" et que je voudrais y accéder via la méthode "bVeutA()" de la classe B je ferais comme ceci :

Programme principal :
#include <stdlib.h>
#include "a.h"
#include "b.h"

int main(int argc, char *argv[])
{
  A a(5);
  B b;
  b.bVeutA(a);

  system("PAUSE");
  return 0;
}


Classe A :
#ifndef _A
#define _A

class A
 {
  private: int a;
  public :
    A(const int);
    int getA(void) const;
  };

#endif
0
Bonjour,
Tout d'abord je vous remercie d'avoir répondu à ma question.
J'ai essayé d'apliquer ce que vous m'avez dit.
Le bug "segmentation fault" n'est pas apparu car ça ne pointe pas sur un objet NULL. Mais la valeur de la variable membre "energy" que j'ai récupérée n'est pas la même que celleque j'ai modifiée dans aodv.cc
car ça ne pointe pas sur le même objet AODV.
Merci
0
bonjour,
j'ai le même problème que vous avez posté le samedi 30 juin 2007.
La seule différence c'est que moi j'ai déclaré une variable dans la classe mac-802.11 et que j'en ai besoin dans la classe AODV.
Dons je me posais la question est ce que vous pourriez m'aider svp si c'est possible ?
je vous serai trés reconnaissante.
merci d'avance
0