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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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