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 :

passage de fonction en parametre


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 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut passage de fonction en parametre
    Bonjour,

    j'ai un soucis avec le passage en parametre d'une fonction,
    la doc de la fonction est :
    OSTaskCreate
    -------------

    Purpose To create a task.

    Syntax :

    unsigned char OSTaskCreate (void (*task) (void * pd), void *pdata, unsigned char *pstk, unsigned long stk_size, unsigned char prio);


    where, task is a pointer to the task's code.

    pdata is a pointer to an optional data area, which can be used to pass parameters to the task when it is created.

    pstk is a pointer to the task's top of stack. The stack is used to store local
    variables, function parameters, return addresses, and CPU registers during an
    interrupt. The size of this stack is defined by the task requirements and the
    anticipated interrupt nesting. Determining the size of the stack involves
    knowing how many bytes are required for storage of local variables for the task itself, all nested functions, as well as requirements for interrupts (accountingfor nesting).

    prio is the task priority. A unique priority number must be assigned to each
    task; the lower the number, the higher the priority.
    Example OSTaskCreate (beep_task, (void *)0, beep_stk, 256, 10);

    /* create a beep_task with priority 10 */
    static unsigned char beep_stk [256];
    Description This function allows an application to create a task. The task is managed by
    μC/OS. Tasks can be created prior to the start of multitasking or by a running
    task. Note that a task cannot be created by an ISR.
    Lorsque j'essai d'appeler une fonction simple, avec un seul parametre, pas de probleme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void TaskReader(char ch[10]);
    .....
    .....
    char s[]="test";
    OSTaskCreate ((void *)TaskReader, (void *)(s), (void *)Stack, STK_SIZE, 14);
    ce code marche nickel,

    par contre avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void TaskReader(int a, char ch[10]);
    ....
    ....
    int a = 3;
    char s[]="test";
    OSTaskCreate ((void *)TaskReader, (void *)(a, s), (void *)Stack, STK_SIZE, 14);
    ca, ca plante completement et je vois pas comment l'ecrire, j'ai essayé de passer par une structure qui contiendrai mes 2 parametres, erreur !

    merci.

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Tu peux passer un tableau de tes paramètres. Puis récupérer dans ta fonction l'adresse du premier élément.
    Je pense qu'avec une structure, ca devrait aussi bien fonctionner.
    Pourrais tu montrer comment tu t'y es pris?

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Par défaut
    je m'y suis pris comme je l'ai mis en code dans moi precedent post,

    pour la structure, j'avais fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct maStruct{
        int a;
        char s[10];
    };
     
    struct maStruct param;
     
    param.a = 321;
    strcpy(param.s, "test");
     
    OSTaskCreate ((void *)TaskReader, (void *)param, (void *)Stack, STK_SIZE, 14);
    Tu peux passer un tableau de tes paramètres.
    Comment ca ?

  4. #4
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Faut que tu déclares ta structure à passer en paramètre en tant que pointeeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct maStruct{
        int a;
        char s[10];
    };
    
    struct maStruct *param;
    
    param->a = 321;
    strcpy(param->s, "test");
    
    OSTaskCreate ((void *)TaskReader, (void *)param, (void *)Stack, STK_SIZE, 14);
    Je pense que ca devrait le faire!

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par homeostasie
    Je pense que ca devrait le faire!
    En utilisant un pointeur non-initialise? Ca m'etonnerait...

  6. #6
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    En utilisant un pointeur non-initialise? Ca m'etonnerait...
    Oui oui, pardon, c'est clair!

    Plutot cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct maStruct{
        int a;
        char s[10];
    };
    
    struct maStruct param;
    
    param.a = 321;
    strcpy(param.s, "test");
    
    OSTaskCreate ((void *)TaskReader, &param, (void *)Stack, STK_SIZE, 14);
    Dans la fonction OSTaskCreate, tu fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct maStruct *param = pData;

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

Discussions similaires

  1. Passage de structure en parametre fonction : Pointeur
    Par apicard3 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/10/2013, 08h29
  2. passage d'une fonction en parametre
    Par fabricen26 dans le forum MATLAB
    Réponses: 1
    Dernier message: 04/02/2013, 02h09
  3. Passage de données en parametre dans une fonction javascript
    Par mcdelay dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/08/2012, 14h19
  4. passage d'une fonction en parametre d'une fonction
    Par psylox dans le forum Langage
    Réponses: 5
    Dernier message: 06/10/2008, 16h40
  5. [Reflection][Method] Passage de int en parametre
    Par seb_fou dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 28/07/2004, 17h47

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