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 :

Changer le préprocesseur


Sujet :

C

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut Changer le préprocesseur
    Bonjour,

    CPP me déçoit un peu de part son manque cruel de fonctionnalités.
    Or j'aimerais pouvoir faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    signal foo(int, float, char);
     
    slot mySlot(int, float, char)
    {
         //do some stuff
    }
     
    connect(foo, mySlot);
    // ou connect("API_NAME", "signal_name", "API_NAME", "slot_name");
    // + disconnect/disconnect_all_slots/disconnect_all_signals
     
    foo(45, 47.8, 'o'); //appelle tous les slots "connectés" au signal
    Ce qui est bien évidement impossible avec CPP qui ne permet même pas de parser les arguments reçus en paramètre des macro ><.

    Je cherche donc à exécuter mon propre préprocesseur avant CPP dans la chaîne de compilation.

    J'aimerais donc savoir si vous connaissiez une méthode "propre" de procéder.
    J'utilise gcc mais si une solution marche avec d'autres chaînes de compilations, ça m'arrangerais aussi.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Tu ne serais pas en train de recoder Qt ou alors un genre pattern Observateur / Observable ?

    En gros tu veux pouvoir appeler implicitement toutes les méthodes enregistrées en paramètre 2 de connect() quand la fonction en paramètre 1 est appelée ?

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Alors, oui le système de signaux/slots est similaire à Qt mais je dois rester dans une API "C" sans utiliser de bibliothèques (pour limiter au maximum les dépendances).

    En gros tu veux pouvoir appeler implicitement toutes les méthodes enregistrées en paramètre 2 de connect() quand la fonction en paramètre 1 est appelée ?
    Voilà.

    Sauf que je vais avoir des plugins chargés dynamiquement qui pourront ajouter des signaux ou des slots, donc je suis obligé d'avoir la liste des signaux et des slots dans une variable et de faire une translation "nom" -> "adresse" dans le "kernel" mais ça c'est une autre histoire.

    Là le but est vraiment de fournir une interface simple à l'utilisateur.
    Je pensais par exemple à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define SIGNAL(NAME, PARAMS) \
    void NAME PARAMS \
    { \
              //pour chaque slot dans slots \
                    slot(???) \
    } \
    // Enregistrer le slo
     
    SLOT(foo, (int, char) )
    Mais impossible de le faire correctement avec CPP

  4. #4
    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
    Je ne sais pas si j'ai mal compris ce qui te pose probleme, mais pourquoi ne pas conserver une variable globale (je vois pas quoi faire de mieux dans le cas present...) qui stockerait tous les signaux et les slots associes (une sorte de map quoi). Apres il te suffirait de declarer la fonction signal et a l'interieur de celle-ci, tu pourrais appeler tous tes slots.

    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
    typedef struct slot_list
    {
      void (*slot)();
      void (*signal)();
      struct slot_list  *next;
    } slot_list;
     
    void foo(int x, float y, float z)
    {
      slot_list l = g_list;
     
      while (slot_list) {
        if (&foo == slot_list->signal)
          slot_list->slot(x, y, z);
        slot_list = slot_list->next;
      }
    }
    Par-contre, pour un truc generique, a part les va_args je vois pas trop comment faire... Pas facile tout ca.

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Pour connecter un signal à un slot, je n'ai aucun problème.
    Il suffit juste, dans l'appel de la fonction "signal", parcourir l'ensemble des slots "enregistré" (complexité en O(1) ).

    Mais le problème, c'est bien pour la généricité.
    Les macro ne sont pas capables de "parser" les arguments qui leurs sont passé.

    Ainsi il est impossible de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    XXXX // déclare un signal
     
    YYYYYY //déclare un slot
    {
     
    }
     
    connect(....);
    De manière simple pour l'utilisateur sans rajouter une étape de préprocessing du code.

Discussions similaires

  1. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31
  2. TextOut : comment changer de font
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 15/07/2002, 20h46
  3. Réponses: 2
    Dernier message: 26/06/2002, 13h16
  4. changer de repertoire et situer
    Par chateau dans le forum C
    Réponses: 4
    Dernier message: 24/06/2002, 11h27
  5. changer l'adresse d'un fichier...
    Par cava dans le forum C
    Réponses: 6
    Dernier message: 05/06/2002, 12h22

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