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 :

Langage C et pseudo objet.


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut Langage C et pseudo objet.
    Bonjours la communauté.
    Merci a tous ceux qui lise
    et surtout ceux qui participe à ses forums utiles en tous points.
    Enfin passons le lustrage des politesses, rentrons dans le vif du sujet.
    2 points, un déjà résolus mais demande débat.
    J'ai deux structure Log et LogChild suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct {
     Buffer *methode_name;
     Buffer *class_name;
     Buffer *info;
     Log    *parent;
     
     void (*write)();
    } LogChild;
     
    typedef struct {
     conf_params *params;
     
     LogChild* (*child)();
    } Log;
    dans ma structure Log, j'ai un pointeur de function
    qui renvoie un pointeur de LogChild (ici pour initialiser/construire un LogChild selon Log lui même)
    Un logChild lui meme contient un pointeur de Log dit la "parent".
    Ces deux functions je n'arrive a les faire cohabiter dans le même fichier header.
    raison simple soit LogChild est en premiere structure et le compilateur
    ne peu comprendre
    soit Log est en première structure et le compilateur ne peu comprendre
    Oui Le serpent mange sa queue. qu'est ce que l'on aime se genre de situation en programmation je crois que l'on fait exprès de les recherchés.
    GNU GNU....
    Pensez vous possible une solution avec un ligne tels que :
    extern Log ou extern LogChild, pour les faire cohabiter dans le même header?
    sinon la pseudo solution chacune des structures a son fichier header ensuite plus de soucis mais... j'appelle cela une solution incomplète.

    La deuxième la plus utile dans mon avancé.
    prototype de la function :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void darkdns_kernel_logger_write(LogChild *myLogChild,char *methode,char *info)
    En gros pour moi cette function est une methode,
    initialiser par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LogChild* darkdns_kernel_logger_child(Log *myLog,char *className)
    {
     LogChild* newChild =darkdns_kernel_memory_alloc(sizeof(LogChild));
     Buffer* bufClassName=darkdns_kernel_memory_alloc(sizeof(Buffer));
     newChild->parent=myLog;
     newChild->class_name=bufClassName;
     newChild->class_name->from_one(newChild->class_name,className,"\0",0);
     newChild->write=darkdns_kernel_logger_write;
     return newChild;
    }
    penser vous pour le pointer de function :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newChild->write=darkdns_kernel_logger_write;
    serait-il possible de lui renvoyer un pointer de function avec le premier parametre en lien.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newChild->write=LogChild* (*child)()darkdns_kernel_logger_write(newChild);
    Quelque chose dans le genre.
    je sais avoir des lacunes dans le système des macros.
    et peu être bien d'autre choses.
    si certain avais quelque lumière je suis preneur.
    Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Salut,

    Il faut que tu forward au moins une des 2 déclarations.
    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
     
    struct Log; // Je dis au compilo qu'une structure Log va existée, mais sera définie plus tard
     
    struct LogChild {
      Buffer *methode_name;
      Buffer *class_name;
      Buffer *info;
      Log *parent;
     
      void (*write)();
    };
     
    struct Log {
      conf_params *params;
     
      LogChild* (*child)();
    };

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut sans erreur de compilation
    cela donnerais :
    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
     
    struct Log;
     
    struct LogChild{
     Buffer *methode_name;
     Buffer *class_name;
     Buffer *info;
     struct Log *parent;
     
     void (*write)();
    } ;
     
    struct Log{
     conf_params *params;
     
     struct LogChild* (*child)();
    } Log;
    bon j'essaie de passez les typedef maintenant.
    merci.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut ça marche merci.
    En propre on as :
    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
     
    struct _Log;
    typedef struct _Log Log;
     
    typedef struct {
     Buffer *methode_name;
     Buffer *class_name;
     Buffer *info;
     Log *parent;
     
     void (*write)();
    } LogChild;
     
    struct _Log {
     conf_params *params;
     
     LogChild* (*child)();
    };
    merci beaucoup.
    maintenant le deuxième point.
    juste je doute sérieusement de sa faisabilité.
    si je trouve une réponse, je vous tiens au courant.

  5. #5
    Expert confirmé
    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
    Par défaut
    Si je comprend, tu aimerais stocker dans le pointeur de fonction write une fonction avec un de ses arguments déjà prédéterminé (pour avoir l'équivalent d'un this implicite en C++). Alors non (ce ne serait plus un paramètre de la fonction).

    A noter qu'on devrait avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct LogChild {
     Buffer *methode_name;
     Buffer *class_name;
     Buffer *info;
     Log    *parent;
     void (*write)(struct LogChild *,char *,char *);
    } LogChild;
    Note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct _Log;
    typedef struct _Log Log;
    La première ligne est inutile

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut Tu as tous compris.
    C'est exactement ça.
    je recherche à crée l’équivalent d'un this.
    Si cela est accessible le langage C aura pour moi
    une renouveau que les langages de haut niveau
    n'aurons jamais.

    aurais tu une idée pour procéder?
    les macros, est-ce que cela peu être une piste?

    sinon effectivement ma première ligne est inutile.

  7. #7
    Expert confirmé
    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
    Par défaut
    Tu devras mentionner explicitement le paramètre lors de l'appel à la fonction. Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LogChild * x = darkdns_kernel_logger_child(....);
    ....
    x->write(x,......)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Afin d'éviter des désagréments quand une fonction est accidentellement appelée avec un autre objet en paramètre, Microsoft recommande de faire des macros:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define LogChild_write(x, a, b) ((x)->write((x), (a), (b)))
     
    ....
     
    LogChild * x = darkdns_kernel_logger_child(....);
    ....
    LogChild_write(x, ......)
    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.

Discussions similaires

  1. VBA est-il un langage orienté objet ?
    Par Kcirtap dans le forum Général VBA
    Réponses: 5
    Dernier message: 06/12/2005, 09h46
  2. [POO] langage objet et php.
    Par FFF dans le forum Langage
    Réponses: 15
    Dernier message: 09/11/2005, 18h36
  3. [langage] Passage d objet entre deux fichiers
    Par Slippers dans le forum Langage
    Réponses: 2
    Dernier message: 28/04/2005, 14h45
  4. avantages des langages objets face au procéduraux ?
    Par airseb dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 10/12/2004, 16h26
  5. Apprendre un langage Objet
    Par samyl dans le forum Débuter
    Réponses: 6
    Dernier message: 23/06/2003, 11h42

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