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 :

structures et fonctions


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut structures et fonctions
    j'ai défini des structures ainsi :
    struct tfile
    {
    char *filename;
    };

    struct twmq
    {
    char *machine;
    char *canal;
    char *queue;
    char *qManager;
    };

    struct tSource{
    char *connector;
    struct twmq wmq;
    struct tfile file;
    };

    struct tTarget{
    char *type;
    struct twmq wmq;
    struct tfile file;
    };

    struct tTransmission{
    char *id;
    struct tSource source;
    struct tSource target;
    };
    j'aimerai déclarer une fonction qui prend en paramètre par référence et par valeur, deux variables de type d'une de ses structures

    un truc du genre :

    void ma_proc(tTransmission v_transmission, tTransmission &r_transmission)
    {
    r_transmission.type = v_transmission.type;
    }

    int main()
    {
    struct tTransmission A;
    struct tTransmission B;

    A.type= "toto";

    ma_proc(A,B);
    return 0;
    }
    Ainsi, je voudrais pouvoir copier les propriétés de A vers B.

    Une idée ?
    (merci d'avance)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 26
    Par défaut
    Salut kendras,

    As-tu regardé dans les tutos ?

    http://c.developpez.com/cours/#tutos-c

    Il y a la réponse à tes questions…

  3. #3
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Tu es en train de chercher les ennuis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    r_transmission.type = v_transmission.type;
    là, tu ne copies pas des valeurs mais des adresses... Si tu modifies la chaine pointée par r_transmission.type, tu modifieras aussi v_transmission.type

    Tu charges dans A.type l'adresse du const char* "toto"....
    A ta place, je ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A.type = malloc(strlen("toto") + 1);
    strcpy(A.type, "toto");
    Ta fonction doit allouer les champs avec la bonne taille et recopier les contenus.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Vince : j'ai la tête dans les documentations, si si, je t'assure
    Ceci dit, entre le C et le C++, je m'y perds

    Joelle, je note bien le
    A.type = malloc(strlen("toto") + 1);
    strcpy(A.type, "toto");
    Ceci s'applique t-il aussi à ceci ?
    char *toto;
    toto="mon toto";
    pour au final faire un
    toto= malloc(strlen("mon toto") + 1);
    strcpy(toto, "mon toto");
    A noter que je vois régulièrement des procédures free pour nettoyer la mémoire.
    devrais-je faire un free(toto) à la fin de mon programme ?

  5. #5
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Tu peux toujours faire au moment de la déclaration et seulement à ce moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *toto="mon toto";
    Il faut bien savoir que tu ne pourras plus modifier ta chaine de caractère après.
    Autrement, il faut bien faire le malloc().
    Quand au free() , tu le feras quand tu ne te serviras plus de toto.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Ok.

    Et pour passe une variable structure en paramètre d'une fonction ?

    Lorsque j'essaye :
    MQLONG WMQ_MQConn(struct tTransmission transmission, MQHCONN &Hcon, MQHOBJ &Hobj, MQLONG &CReason)
    {
    MQCD ClientConn = {MQCD_CLIENT_CONN_DEFAULT}; // Client connection channel

    strncpy(ClientConn.ConnectionName,
    transmission.source.wmq.machine,
    MQ_CONN_NAME_LENGTH);
    }
    Je veux copier le contenu de transmission.source.wmq.machine dans ClientConn.ConnectionName.

    il me répond à la compilation
    wmq.h:27: error: `transmission' undeclared (first use in this function)

    idem pour &Hcon, &Hobj et &CReason

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Pour info, voici ma fonction :
    /*----------------------------------------------------------------------------
    fonction : WMQ_MQConn
    comment : Connexion à un queue manager
    ---------------------------------------------------------------------------- */
    MQLONG WMQ_MQConn(tTransmission transmission,
    MQHCONN &Hcon, MQHOBJ &Hobj, MQLONG &CReason)
    {

    MQLONG CompCode = 0;

    // Declare MQI structures needed
    MQCNO Connect_options = {MQCNO_DEFAULT}; // MQCONNX options
    MQCD ClientConn = {MQCD_CLIENT_CONN_DEFAULT}; // Client connection channel

    // definition
    MQOD od = {MQOD_DEFAULT}; // Object Descriptor
    char *p_argQMgrName = NULL; // q manager name
    char *p_argConnName = NULL; // connection name
    char *p_argChannelName = NULL; // channel name

    MQCHAR QMName[MQ_Q_MGR_NAME_LENGTH];


    // Initialisation du canal
    strncpy(ClientConn.ConnectionName,
    transmission.source.wmq.machine,
    MQ_CONN_NAME_LENGTH);

    strncpy(ClientConn.ChannelName,
    transmission.source.wmq.canal,
    MQ_CHANNEL_NAME_LENGTH);

    strncpy(QMName, transmission.source.wmq.qManager, MQ_Q_MGR_NAME_LENGTH);


    /* Point the MQCNO to the client connection definition */
    Connect_options.ClientConnPtr = &ClientConn;

    /* Client connection fields are in the version 2 part of the
    MQCNO so we must set the version number to 2 or they will
    be ignored */
    Connect_options.Version = MQCNO_VERSION_2;


    // Connexion au Queue Manager
    MQCONNX(QMName, // queue manager
    &Connect_options, // options for connection
    &Hcon, // connection handle
    &CompCode, // completion code
    &CReason); // reason code

    if (CompCode == MQCC_FAILED)
    {
    printf("MQCONNX ended with reason code %d\n", CReason);
    exit( (int)CReason );
    }
    printf("MQCONNX\n");
    return CompCode;

    }
    voici mes structures :
    struct tfile
    {
    char *filename;
    };

    struct twmq
    {
    char *machine;
    char *canal;
    char *queue;
    char *qManager;
    };

    struct tSource{
    char *connector;
    struct twmq wmq;
    struct tfile file;
    };

    struct tTarget{
    char *type;
    struct twmq wmq;
    struct tfile file;
    };

    struct tTransmission{
    char *id;
    struct tSource source;
    struct tSource target;
    };
    et voici l'erreur
    In file included from hosaflow.c:32:
    wmq.h:5: error: parse error before "transmission"
    wmq.h: In function `WMQ_MQConn':
    wmq.h:26: error: `transmission' undeclared (first use in this function)
    wmq.h:26: error: (Each undeclared identifier is reported only once
    wmq.h:26: error: for each function it appears in.)
    wmq.h:48: error: `Hcon' undeclared (first use in this function)
    wmq.h:50: error: `CReason' undeclared (first use in this function)
    wmq.h: At top level:
    wmq.h:67: error: parse error before "transmission"
    make: *** [hosaflow] Error 1

  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
    en C, il faut rajouter le mot-clé struct devant son nom (ou utiliser un typedef)

    Edit: Une fonction dans un .h ??
    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.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    utiliser typedef à quel niveau ?


    oui, .h ... mais au final, qu'importe l'extension, l'important est que cela se compile

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kendras
    oui, .h ... mais au final, qu'importe l'extension, l'important est que cela se compile
    Codage de chacal...

    http://emmanuel-delahaye.developpez.com/goret.htm

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Sympa ta page

    mais à ce stade de développement, l'extension de mes fichiers m'importe peu.

    je jouerais à Madame Propre lorsque le programme sera fonctionnel

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par kendras
    Sympa ta page
    Force 10, désolé !
    mais à ce stade de développement, l'extension de mes fichiers m'importe peu.

    je jouerais à Madame Propre lorsque le programme sera fonctionnel
    Erreur. L'expérience prouve que si on ne code pas propre dès la première ligne, on code comme un(e) goret(te) toute sa vie...

    L'expérience montre aussi que les codes bien écrits fonctionnent mieux.

  13. #13
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Sauvage! Je n'avais pas vu que c'était dans un .h
    A part ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MQLONG WMQ_MQConn(struct tTransmission transmission, 
    MQHCONN &Hcon, MQHOBJ &Hobj, MQLONG &CReason)
    ou alors, lors de la création de ton type, tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct Transmission{
    char *id;
    struct tSource source;
    struct tSource target;
    }tTransmission;
    Tu pourras ensuite faire sans problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MQLONG WMQ_MQConn(tTransmission transmission, 
    MQHCONN &Hcon, MQHOBJ &Hobj, MQLONG &CReason)

  14. #14
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Erreur. L'expérience prouve que si on ne code pas propre dès la première ligne, on code comme un(e) goret(te) toute sa vie...

    L'expérience montre aussi que les codes bien écrits fonctionnent mieux.
    S'il en est besoin, je confirme

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    roooooh, ne jugez pas trop vite les loulous.
    Oui d'accord, je suis en mode gorette sur ce coup là, j'avoue

    Ceci dit, s'il m'etait permis de jouer à la maniaque, je le ferai bien volontier, prenant le temps qu'il faut à mettre en forme le code, avec les bonnes extensions etc et etc...
    Mais le C sous Unix, ça n'a jamais été mon domaine de prédilection.

    Soit dit en passant, that's not work at all
    j'ai opté pour la soluce 1
    MQLONG WMQ_MQConn(struct tTransmission transmission,
    MQHCONN &Hcon, MQHOBJ &Hobj, MQLONG &CReason)
    Et toujours le même message d'erreur...

    aller, il y a bien une ame charitable qui voudrait regarder l'intégralité de mes fichiers ? (et ce n'est pas si crade que ça, je le promets...)

  16. #16
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Allez, envoie!!!

Discussions similaires

  1. Probléme structure pointeur fonction
    Par babouoles dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 14/05/2008, 17h34
  2. Probleme avec structures et fonctions
    Par isaac727 dans le forum Débuter
    Réponses: 2
    Dernier message: 31/03/2008, 23h01
  3. Passage d'une structure en fonction
    Par god_enel dans le forum C
    Réponses: 11
    Dernier message: 15/04/2007, 20h55
  4. structures et fonctions
    Par olivier1209 dans le forum C
    Réponses: 11
    Dernier message: 10/12/2006, 14h53
  5. Structure et fonction
    Par progfou dans le forum C
    Réponses: 7
    Dernier message: 04/07/2006, 14h23

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