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 R-Arbre et tuple id


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut structure R-Arbre et tuple id
    Bonjour, je travaille avec une bibliothèque implémentant la structure de R-arbre mais il me semble qu'il y a un problème. Dans un R-arbre, chaque noeud qui n'est pas une feuille contient plusieurs entrées de la forme (Rectangle R, Pointeur vers un noeud enfant P) et telles que le noeud enfant ne contient que des rectangles recouvert par le rectangle R. Pour les feuilles, le pointeur vers un noeud enfant est remplacé par un tuple identifier (un entier qui identfie un certain objets dans une liste par exemple) mais l'implémentation de la bibliothèque ne prend pas compte de cette différence. Ainsi, pour les feuilles, le tuple identifier est stocké dans un pointeur Node* et je récupère des warning du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Index.c:113:29: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
      113 |   b.child = (struct Node *) tid;
    Ici, tid est un entier passé à une fonction d'insertion dans le R-arbre. Quand on arrive au niveau des feuilles, la fonction d'insertion met le rectangle à insérer dans b.rect et tid dans b.child. Ici, b est de la forme (Rectangle, child pointer) donc bien adaptée aux entrées des noeuds avec enfant mais pas aux feuilles.
    Je ne sais pas si je suis très clair. Comment puis-je régler ce problème proprement ? Est-ce que c'est vraiment un problème en fait ? Merci d'avance pour vos réponses.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Oui il se peut que "struct Node*" occupe plus que 8 bytes en mémoire...

    Essaye d'afficher la taille d'un "int*" et la taille d'un "struct Node*" et vois si il y a une différence dans la taille réservée en mémoire (via sizeof()).

    ...j'ai pas la librairie en question, est-ce que les fonctions qui manipulent les éléments de l'arbre passent par un "pointeur générique" (void*) pour ajouter, rechercher, enlever, ..., les éléments dans les feuilles ?

    Ca me semble bizarre de faire des choses comme:

    b.child = (struct Node *) tid; si tid n'est pas un void*

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par wootwoot Voir le message
    BDans un R-arbre, chaque noeud qui n'est pas une feuille contient plusieurs entrées de la forme (Rectangle R, Pointeur vers un noeud enfant P) et telles que le noeud enfant ne contient que des rectangles recouvert par le rectangle R. Pour les feuilles, le pointeur vers un noeud enfant est remplacé par un tuple identifier (un entier qui identfie un certain objets dans une liste par exemple) mais l'implémentation de la bibliothèque ne prend pas compte de cette différence...Comment puis-je régler ce problème proprement ? Est-ce que c'est vraiment un problème en fait ? Merci d'avance pour vos réponses.
    Tu peux utiliser une union. C'est comme une structure sauf que tous les membres occupent la même place mémoire.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef union {
    	char c;
    	short s;
    	int i;
    } t_mix;
     
    t_mix toto;
    toto.c='a'; printf("%c\n", toto.c);
    toto.s=123; printf("%hd\n", toto.s);
    toto.i=123456; printf("%d\n", toto.i);

    Chaque membre "c", "s" et "i" sont en réalité une même zone mémoire. Tu peux remplir l'un mais tu ne pourras alors ensuite n'utiliser plus que lui à l'exclusion de tout autre jusqu'au remplissage suivant.

    Ca me semble approprié à ton histoire de pointeur vers le noeud enfant qui peut-être pointeur ou tuple selon les circonstances...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/01/2011, 03h58
  2. Generer des combinaisons - Structure en Arbre
    Par amgab2003 dans le forum VB.NET
    Réponses: 7
    Dernier message: 02/07/2010, 17h29
  3. Requête dans les cas de structures en arbres
    Par arutan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/09/2009, 08h41
  4. Numérotation structure d'arbre
    Par L1011 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 29/01/2009, 10h54
  5. probleme avec une "structure en arbre"
    Par kamouminator dans le forum C
    Réponses: 1
    Dernier message: 07/11/2006, 22h21

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