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 :

Utiliser des adresses comme des valeurs entières ou hasher des adresses


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 53
    Points
    53
    Par défaut Utiliser des adresses comme des valeurs entières ou hasher des adresses
    Bonjour,
    J'aimerais pouvoir utiliser en C des adresses mémoires comme des valeurs entières. Par exemple si j'ai la ligne suivante :

    Char *p = "bonjour".

    J'aimerais pouvoir faire des opérations telles que : p * 2 ( Oui ! Je veux bien multiplier l'adresse de p par deux.) et obtenir un résultat en entier. (et si possible de façon portable)

    En fait, je travaille sur un projet dans lequel j'ai besoin de retrouver des indices d'objets rangés dans un tableau de pointeurs sur objets, à partir de l'adresse de ses objets. Et ce besoin est fréquent. par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //j'ai le tableau d'objet suivant
    Objet **tab = malloc(sizeof(Objet *) * 1000);
     
    for(i = 0; i < 1000; i++)
    {
    Objet *obj = creer_objet(...);
    tab[i] = obj;
     
    // Ensuite obj est aggrégé à d'autres structures de données (nombreuses) qui // sont en fait les structures métiers. Le tableau n'est qu'un outil.
    }
    J'aimerais pouvoir à partir d'une adresse d'objet (Objet *) obtenir l'indice i de cet objet dans le tableau. (ce besoin est récurrent...). J'ai donc envisagé d'utiliser une table de hashage pour associer les adresses aux indices et accéder dans les meilleurs délais aux indices plutôt que de parcourir tout le temps le tableau. Sauf que dans ma fonction de hashage, je fais des opérations sur entier (pour multiplier la clé , la diviser, décalage de bits...). Hors ces opérations sont impossibles sur des pointeurs (le compilo gueule). Je suis sur une machine 64 bits et j'aimerais que la solution puisse marcher indépendament de la plateforme matérielle/logicielle. Au cas ou ce serait impossible, j'aimerais savoir comment pourrais-je hasher des adresses sans multiplications et tout et tout. Ou comment pourrais je résoudre mon problème autrement.

    Merci.

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est sûr que tu ne peux pas faire ce genre d'opérations sur des adresses. La seule chose à laquelle je pense en ce qui concerne la manipulation directe des adresses serait de classer le tableau (les adresses supportent les opérateurs de comparaison(<,<=,...>=,>) et de faire une recherche dichotomique.

    Si tu veux passer par des entiers et une table de hashage, il faut que le compilateur supporte les types intptr et uintptr (types optionnels en C99) et passer de obj* -> void* -> (u)intptr. Le résultat de la conversion pointeur->entier est dépendant de l'implémentation et donc le résultat du hashage également. Mais comme il n'est utilisé ensuite que pour des comparaisons, le résultat de la recherche devrait être indépendant de l'implémentation.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 53
    Points
    53
    Par défaut
    Merci pour cette réponse (qui m'aide beaucoup).

    Je vais faire un cast effectivement telle qu'indiquée obj* -> void * -> uintptr * et au cas ou le compilo ne gère pas les uintptr* je ferai un cast en long je pense que çà ira..

    Merci

Discussions similaires

  1. [Toutes versions] Confusion de résultats dans recherche des occurrences d'une valeur avec Find sur des dates
    Par iperkut dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/11/2011, 19h07
  2. utiliser des touches comme déclencheur d'animation
    Par claque dans le forum Powerpoint
    Réponses: 1
    Dernier message: 30/05/2008, 10h39
  3. Utiliser des classes, comme en php ?
    Par Titi41 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 15/05/2008, 16h20
  4. Réponses: 2
    Dernier message: 22/05/2006, 16h48

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