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 :

Alias sur une adresse


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 29
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Alias sur une adresse
    Bonjour.

    Je me demandais comment faire dans le cas abstrait (je ne veux rien faire de particulier, je me posais la question telle quelle) suivant :

    J'ai un entier n qui correspond numériquement à une adresse.
    Je veux mettre un alias sur cette adresse.

    Genre la mémoire :
    Adresse Valeur
    0 45
    1 14225
    2 5
    Je veux créer un alias sur l'adresse 1. Définir &a comme 1 donc a comme 14255.



    J'ai essayé en faisant comme avec les pointeurs, vu que ça marche avec les pointeurs cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 5;
    int n = (int)&i; // n prend l'adresse de i en changeant le type de &i en int
    int* p = (int*)n; // change le type de n pour l'assigner à p

    En faisant avec les alias :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 5;
    int n = (int)&i; // n prend l'adresse de i en changeant le type de &i en int
    int& a = (int&)n; // change le type de n pour l'assigner à a
    Mais ça ne marche visiblement pas.

    Je me demande donc comment faire, merci beaucoup de me répondre, bonne journée .

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Je suis pas vraiment sur de comprendre la question, qu'est ce que tu entend par alias ?
    Avoir plusieurs pointeurs sur la même adresse ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = 5;
    int *n1 = &i;
    int *n2 = n1;
     
    i = 6;
    assert(*n1 == 6);
    assert(*n2 == 6);
     
    *n1 = 7;
    assert(i == 7);
    assert(*n2 == 7);
    Ou donner un identifiant à une adresse ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int i = 5;
    std::map<int, int*> mapAddr;
    mapAddr.insert(std::make_pair(0, &i)); // on assigne l'id 0 à l'adresse de i
     
    i = 6;
    assert(*mapAddr[0] == 6);

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 29
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Non, ça n'est pas mettre deux pointeurs sur la même adresse.
    C'est, je suppose ce que fait votre code ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int i = 5;
    std::map<int, int*> mapAddr;
    mapAddr.insert(std::make_pair(0, &i)); // on assigne l'id 0 à l'adresse de i
     
    i = 6;
    assert(*mapAddr[0] == 6);
    Je ne sais pas si c'est ça, je suis entrain de regarder les objets que vous utilisez, mais je précise ma question au cas où :

    Je voudrais créer une variable a qui a l'adresse que j'ai choisie pour elle.
    D'où mon tableau dans le premier message :
    Adresse Contenu
    0x22ff3 23
    0x22ff8 12
    Je veux créer a telle que &a=0x22ff8 et donc a=12.

    J'étudie mieux votre code, peut-être fait-il cela mais je ne connais pas vos objets =).

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ca correspond quasiment à la référence.
    Il faut cependant oublier la notion d'adresse explicite. C'est quasiment impossible à manipuler correctement.

    Ca s'écrit ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i= 12;
    int& ref = i;
    Tout se passera comme si ref est i.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 29
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    leternel : Je sais comment déclarer un alias sur une variable, je ne sais pas si vous avez bien lu ma question ^^.

    Les données du problème :
    j'ai une adresse de variable dans un int n. (je n'ai pas la variable, juste son adresse dans un int)

    L'objectif du problème :
    Créer une variable qui a comme adresse le contenu de n.

    Merci beaucoup =)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n = 3;
    int* p = (int*)NULL + n;
    non ?

    Sinon j'ai absolument rien compris au charabia initial
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Comment peux-tu avoir une adresse dans un int. Ca sent la très grosse magouille.

    En général, je m'arque-boute contre un code qui contient ce genre de chose.
    La position exacte en mémoire n'est pas du ressort du programmeur. (les tailles, peut-être, mais pas la position absolue)

    Il n'est pas possible de dire "Soit k une variable entière dont l'adresse est 17", en dehors du pointeur.
    C'est même la raison d'être du pointeur.

    La solution de Bousk est ce que je vois de plus proche de ton problème. Encore que le "+ n" ajoutera n fois la taille du type pointé, je crois.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ca me choque pas, c'est de l'arithmétique des pointeurs, c'est rare mais ça arrive.
    Faut trouver la bonne formule en cast etc
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Une adresse, c'est dans un pointeur, uniquement.
    Dans un entier, je comprends volontiers un décalage (en nombre d'éléments, dans un tableau, par exemple), mais pas une adresse.

    Après, je suis peut-être un chouilla extrémiste, mais j'estime que, me si c'est envisageable, si on a besoin d'aide, on ne devrait pas essayer ce genre de choses.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Une adresse, c'est uniquement dans un pointeur ou à la rigueur un intptr_t (et encore, en C++ avec la programmation générique un tel besoin apparaît bien moins souvent qu'en C).

    Hexbinmos, ne cherches-tu pas simplement à créer une référence sur variable pointée?

    Code C++ stupide : 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
    //Beaucoup de travail pour passer un intptr_t là où une référence suffirait
    void f(intptr_t ip)
    {
    	double* p = reinterpret_cast< double* >(ip);
    	double& refd = *p;
     
    	refd = 42.0;
    }
     
    void g()
    {
    	double d = 1.0;
    	double* p = &d;
    	intptr_t ip = reinterpret_cast< intptr_t >(p);
    	f(ip);
    	std::cout << d << std::end;
    }
    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.

  11. #11
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Ce qu'il demande je vois ca un peu comme les alias de GLU avec opengl. Cependant stocker une adresse dans un int ressemble plus a quelque chose qu'on croiserait en C... Ca ne marche que sur quelque chose dont l'adresse ne changera jamais...

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Dans ce cas, les alias, c'est plutôt une map cachée au fond de la bibliothèque (singleton qui ne dit pas son nom)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. tous les sites hébergés sur une adresse IP
    Par ver_for dans le forum Serveurs (Apache, IIS,...)
    Réponses: 4
    Dernier message: 21/07/2008, 10h30
  2. Réponses: 1
    Dernier message: 30/04/2008, 16h25
  3. Faire un test sur une adresse IP
    Par 01211983 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 24/07/2007, 14h11
  4. Réponses: 8
    Dernier message: 23/06/2007, 10h38
  5. Quel langage pour envoyer un fichier sur une adresse
    Par dai.kaioh dans le forum Développement
    Réponses: 2
    Dernier message: 02/04/2004, 16h38

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