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 :

Retourner un tableau en paramètre d'une fonction


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Retourner un tableau en paramètre d'une fonction
    Bonjour à tous,
    Retourner un tableau en paramètre d'une fonction c'est pas sorcier et pourtant... !!

    Voila, j'ai un main principal où je lance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    start_timer(Delta, (void*)maFonction_A, &MesInfo);
    Cette fonction exécute maFonction_A toutes les 100ms et prend en paramètre MesInfo qui est une structure.

    La Fonction_A fait elle appel à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void *maFonction_A(void * MesInfo)
    {
     maFonction_B(Disobs_Obs_File, &obs_string, obs, (s_thread*)MesInfo);
    }
    Maintenant j'ai besoin de récupérer le tableau obs dans maFonction_A mais pas moyen les valeur du tableau sont les bonnes dans la mafonction_B mais pas dans maFonction_A.

    -----------Mon Code----------
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /*main function*/
    int main(
        int argc,
        char *argv[])
    {
        double delta = 100.0;
        s_thread MesInfo;
     
        start_timer(Delta, (void*)maFonction_A, &MesInfo);
        return 0;
    }
     
    /* maFonction_A function */
    void *maFonction_A (void * MesInfo)
    {
        long obs[510];
        FILE * Disobs_Obs_File = NULL;
        char obs_string;
     
        maFonction_B(Disobs_Obs_File, &obs_string, obs, (s_thread*)MesInfo);
     
     
        for (i = 0; i <((s_thread*)MesInfo)->obs_nbr; i++)
        {
            printf("OBS Removed  [%d] = %ld\n", i, obs[i]);
        }
     
        return 0;
    }
     
     
    /* maFonction_B qui rempli un tableau obs[] */
     
    void maFonction_B(FILE *Disobs_Obs_File, char *obs_string, long *obs,
                      s_thread *MesInfo)
    {
        obs = malloc(510 * sizeof(long));
     
        for (i=0; i<MesInfo->obs_nbr; i++)
        {
            obs[i] = /*fonction de recuperation d'un index de type long*/
                printf("OBS Upload->  OBS[%d] = %ld\n", i, obs[i]);
        }
    }
    Voici ce que j'obtiens en sorti :

    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
    26
    27
    28
    /*
    obs[0] =  : 77
    obs[1] =  : 78
    obs[2] =  : 79
    obs[3] =  : 80
    obs[4] =  : 81
    obs[5] =  : 82
    obs[6] =  : 83
    obs[7] =  : 84
    obs[8] =  : 85
    obs[9] =  : 86
    obs[10] =  : 87
    obs[11] =  : 88
    obs[12] =  : 89
    OBS Removed  [0] = 0
    OBS Removed  [1] = 0
    OBS Removed  [2] = 0
    OBS Removed  [3] = 0
    OBS Removed  [4] = 0
    OBS Removed  [5] = 0
    OBS Removed  [6] = 0
    OBS Removed  [7] = 0
    OBS Removed  [8] = 0
    OBS Removed  [9] = 0
    OBS Removed  [10] = 0
    OBS Removed  [11] = 0
    OBS Removed  [12] = 0
    */
    Alors que je souhaite obtenir les mêmes valeurs pour obs[i] = OBS Removed[i]
    obs[1] = : 78
    OBS Removed [1] = 0 et non pas "78" !!

    Merci d'avance pour votre aide !

  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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Si tu veux modifier un char dans une fonction, tu lui passes l'adresse de ce char, donc un char*. OK avec ça ?

    Maintenant, tu souhaites modifier un char*. Que vas-tu lui passer à ta fonction ?

    Si le terme de char, char* te dérange, alors raisonnons avec TOTO. Je veux modifier une variable une variable de type TOTO, je passe une variable de type pointeur sur TOTO.

    Remplace TOTO par ce que tu veux maintenant

  3. #3
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Salut,

    (BKtero désolé, je suis à côté de la plaque et dans ma précipitation ma réponse l'est encore plus...)
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  4. #4
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il n'y a pas de déclaration dans maFonction_B()...
    Le & ne s'applique pas un obs mais à une variable de type char pour créer un paramètre de type char*.
    Je ne vois pas trop ce que tu veux dire deletme : /

    --> il semble y avoir eu une édition de message.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Merci BKTzero, mais j'avoue ne pas comprendre car j'ai un problème pour le renvoi du tableau long *obs = long obs[].

    Il n'y a pas de déclaration dans maFonction_B()...
    ?


    Merci pour ton aide

  6. #6
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Il n'y a pas de déclaration dans maFonction_B()...
    Il faisait référence à mon précédent post (avant edit)
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Ok, mais je ne vois toujours pas mon erreur sur obs !

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Le problème provenait de la déclaration de long *obs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long obs[510];
    maFonction_B(Disobs_Obs_File, &obs_string, &obs, (s_thread*)MesInfo);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void maFonction_B(FILE *Disobs_Obs_File, char *obs_string, long (*obs)[510],
                      s_thread *MesInfo)




    Soit le code 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /*main function*/
    int main(
        int argc,
        char *argv[])
    {
        double delta = 100.0;
        s_thread MesInfo;
     
        start_timer(Delta, (void*)maFonction_A, &MesInfo);
        return 0;
    }
     
    /* maFonction_A function */
    void *maFonction_A (void * MesInfo)
    {
        long obs[510];
        FILE * Disobs_Obs_File = NULL;
        char obs_string;
     
        maFonction_B(Disobs_Obs_File, &obs_string, &obs, (s_thread*)MesInfo);
     
     
        for (i = 0; i <((s_thread*)MesInfo)->obs_nbr; i++)
        {
            printf("OBS Removed  [%d] = %ld\n", i, obs[i]);
        }
     
        return 0;
    }
     
     
    /* maFonction_B qui rempli un tableau obs[] */
     
    void maFonction_B(FILE *Disobs_Obs_File, char *obs_string, long (*obs)[510], s_thread *MesInfo)
    {
        obs = malloc(510 * sizeof(long));
     
        for (i=0; i<MesInfo->obs_nbr; i++)
        {
           (*obs)[i] = /*fonction de recuperation d'un index de type long*/
                printf("OBS Upload->  OBS[%d] = %ld\n", i, (*obs)[i]);
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/12/2007, 18h49
  2. Section d'un tableau en paramètre d'une fonction
    Par ZeLL dans le forum Fortran
    Réponses: 5
    Dernier message: 18/04/2007, 14h49
  3. Retourner un tableau d'entier avec une fonction ?
    Par Seb33300 dans le forum C++
    Réponses: 10
    Dernier message: 05/04/2007, 16h25
  4. Réponses: 6
    Dernier message: 24/07/2006, 15h22
  5. retourné un tableau de valeur d'une fonction
    Par hoaxpunk dans le forum Oracle
    Réponses: 2
    Dernier message: 24/01/2006, 17h36

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