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

GTK+ avec C & C++ Discussion :

Typage des données/manipulation des données


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut Typage des données/manipulation des données
    Bonjour à tous,

    Je reviens avec une nouvelle difficulté.
    En fait, je cherche à représenter/dessiner une sorte de diagramme dans mon projet. Je dispose déjà de fonctions de dessin grâce à la bibliothèque Cairo, là n'est pas le problème. Le souci est plutôt comment gérer les données pour pouvoir le faire. Le diagramme doit être constitué ainsi :
    - il est constitué de plusieurs cases.
    - chaque case porte un nom et un id unique.
    - chaque case renferme un nombre connu à l'avance de "connecteurs" en entrée (à gauche de la case) et en sortie (à droite de la case) ; ils disposeront d'un nom et d'un "id" qui ne sera pas unique (voir plus bas).

    Cela serait simple ainsi sauf qu'il y a une précision importante : chaque connecteur peut être connecté avec un ou des autres opposés, càd un connecteur en sortie ne peut être connecté qu'avec un ou plusieurs connecteurs en entrée d'une autre case, et vice versa. Les connecteurs qui auront le même id (comme énoncé) seront alors connectés entre eux.

    Il faut donc lors de l'affichage que j'arrive à représenter les connexions par les lignes, il faut donc que je gère les données proprement et rapidement pour ne pas altérer les performances d'affichage.

    Je sollicite donc votre aide pour savoir quelle est la meilleure solution. Mon problème me fait penser à l'utilisation de la programmation orientée objet, mais je souhaite rester en C/GTK. Il y aussi ce tutoriel http://nicolasj.developpez.com/gobject/classe/#LV mais je trouve l'utilisation de GObject assez rebutante. Est-ce possible d'utiliser le typage abstrait classique des données ici ?

  2. #2
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Bon voilà comment j'essaie de me débrouiller en typage abstrait classique des données :

    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
    typedef struct
    {
        gchar    *BoxName;
        gchar    *ID;
        GList    *pIN;
        GList    *pOUT;
    } stBox;
     
    typedef struct
    {
        gchar                          *BoxParent;
        gchar                          *ID;
        gchar                          *Name;
        guint                           X;
        guint                           Y;
    } stIN;
     
    typedef struct
    {
        gchar                          *BoxParent;
        gchar                          *ID;
        gchar                          *Name;
        guint                           X;
        guint                           Y;
    } stOUT;
    En gros, je place chaque Box dans une structure qui sont tous ensuite regroupé dans une GList. J'ai crée aussi une structure pour les petits connecteurs, une pour les entrées, une pour les sorties, qui seront eux aussi placés dans une GList. Ça fait beaucoup de GList et j'ai un peu peur que cela soit lourd et complexe à gérer en plus d'impacter les performances. Quelqu'un aurait peut-être une solution plus élégante ?

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par Moravski Voir le message
    Mon problème me fait penser à l'utilisation de la programmation orientée objet, mais je souhaite rester en C/GTK.
    GTK est en C et orienté objet. Tu peux faire de la POO en C, avec ou sans GObject. C'est sûr que sans GObject tu es assez limité, mais le programmation orienté objet, ce n'est pas que l'héritage. Avoir une structure où tu rassembles des données cohérentes entre elles et des fonctions qui manipulent cette structure, c'est déjà de la programmation orienté objet.

    Bon, pour ton problème, il est clair que les listes chaînées c'est sympa un moment, mais c'est très long à parcourir quand tu as beaucoup d'éléments. Il est en revanche très rapide de supprimer un élément.

    Les tableaux sont rapides pour ajouter un élément, mais lents pour en supprimer un quand ce n'est pas le dernier. A parcourir, c'est moins long que la liste, mais c'est pas encore la panacée.

    Les tables de hachage sont rapides pour chercher un élément, mais moins rapides à parcourir que les tableaux.

    Je te conseille tout de même de regarder du côté des projets gstreamer et conduit. GStreamer a cette notion d'éléments (tes boites) et de pads (tes connecteurs). Conduit fait à peu près ce que tu veux faire au niveau graphique.

    J'ai des commentaires à faire sur tes structures et sur ce que tu pourrais adopter comme solution, mais je n'ai pas trop le temps là, je ferai ça plus tard.

  4. #4
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    OK c'est déjà sympa de m'aider. En fait je me rend compte que j'ai déjà manipuler GObject... en ayant crée un widget perso ! Du coup, je vois comment cela fonctionne, même si le problème est différent. Je tenterai probablement les deux voies (celle en cours et celle de GObject). et voir quelles est la solution la plus idéale.
    J'ai déjà décortiqué Conduit, mais c'est du Python, j'en ai qu'une vague connaissance... mais promis, j'apprendrai le Python quand j'aurai plus le temps !
    Pour Gstreamer, je ne savais pas, je vais consulter ça.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Pour gstreamer, c'est plus pour le principe: tu n'auras pas de code à en tirer, mais ce que tu veux faire ressemble furieusement aux concepts d'éléments, pads et sinks de gstreamer. D'ailleurs, tu as gst-editor qui est une application graphique (jamais fiinie, elle est restée en version 0.0.2) de configuration de pipeline gstreamer. Voici ce que ça donne:



    C'est en python aussi, mais ça se lit facilement car du gtk en python ou en C, ça reste du GTK. Les noms de fonctions et d'object sont quasi identiques.

  6. #6
    Membre averti
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Par défaut
    Hello,

    J'ai fait un schéma de mes données avec leurs typages pour que ce soit plus clair :



    Mes structures stIN et stOUT ont été modifiées, j'ai mis une variable type pointrices pour X et Y. Je vais m'expliquer progressivement pourquoi.

    Voici comment je m'oriente pour procéder à ce que je veux, et le stade d'avancement :
    1. Listage des box ------------------------------> fait
    2. Listage des connecteurs de chaque box -------> fait
    3. Dessin des box -------------------------------> fait, mais à modifier pour que l'étape suivante puisse marcher
    4. Liaison des connecteurs avec une ligne --------> pas encore possible

    A l'étape 1, je récupère les noms, id etc. de chaque box. A l'étape 2, ce sont les connecteurs. Attention, à ce stade, je ne peux pas savoir à l'avance quelle sera la position x et y sur le plan de dessin.
    A l'étape 3, c'est la fonction de dessin, et même si je ne l'ai pas encore fait, je peux récupérer les données x et y de chaque connecteur qui seront nécessaire pour pouvoir dessiner la ligne de connexion. C'est justement là où j'ai des soucis. Vu que je fait appel à une fonction extérieure pour dessiner, il faut que je puisse modifier la structure du ou des connecteurs pour leur attribuer une valeur x et y, une fois chaque box dessinée. Donc j'ai pensé à utiliser des variables pointrices. Est-ce la bonne idée, puisque je n'y arrive pas ?
    Images attachées Images attachées  

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Je pense que tu devrais passer plus de temps à réfléchir à tes structures de données et remettre ton problème à plat, sans penser à ce que tu as déjà fait...

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/05/2014, 11h47
  2. Manipuler des TDateTime comme des entiers?
    Par toufou25 dans le forum C++Builder
    Réponses: 8
    Dernier message: 22/06/2006, 15h52
  3. Réponses: 1
    Dernier message: 27/11/2005, 14h30
  4. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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