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

  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;

  7. #7
    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
    nan, ca donne rien, et j'ai essayé plein de mix de code et ca donne rien.

    et meme en rajoutant avant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    param = (struct maStruct *) malloc(sizeof(struct maStruct));
    ce que j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OSTaskCreate ((void *)TaskReader, (void *)param, (void *)Stack, STK_SIZE, 14);
    OSTaskCreate ((void *)TaskReader, param, (void *)Stack, STK_SIZE, 14);
    OSTaskCreate ((void *)TaskReader, &param, (void *)Stack, STK_SIZE, 14);
    ...

    Dans la fonction OSTaskCreate, tu fais ceci:
    J'y ai pas acces, c'est une fonction qui appartient à une librairie proprietaire, je code en embarque dans un terminal de lecture de code barre portatif

  8. #8
    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
    Ce que j'ai fait tout à l'heure(transmettre par référence), ca doit fonctionner, sinon tu peux faire ainsi:
    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 = malloc(sizeof(maStruct));;
    
    param->a = 321;
    strcpy(param->s, "test");
    
    OSTaskCreate ((void *)TaskReader, param, (void *)Stack, STK_SIZE, 14);
    Puis dans OSTaskCreate (...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned char OSTaskCreate(...,void* param1,...)
    {
        maStruct *param = param1;
        ...
    }

  9. #9
    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 n'ai pas acces aux sources de OSTaskCreate.

  10. #10
    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
    Je n'ai pas acces aux sources de OSTaskCreate.
    Oui j'ai lu ta remarque après mon post...
    Hum hum, en fait, dans ce cas là, je ne sais pas vraiment.
    Perso, je tenterais ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int tab[3] = {0};
    OSTaskCreate ((void *)TaskReader, (void*)tab, (void *)Stack, STK_SIZE, 14);
    Ce que je trouve bizarre, c'est que tu ne peux même pas voir le code de la tâche que tu crées...Car les paramètres que tu décides de transmettre sont en fonction de ce qu'elle a besoin de recevoir.

  11. #11
    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
    Note: De manière habituelle, on évite de caster un pointeur de fonction. La fonction pointée DOIT avoir le bon prototype, sinon c'est la porte ouverte aux erreurs comme celle vue avec deux paramètres.

    Et aussi, on évite de caster les retours de malloc et on évite de caster en void* : Un cast n'est nécessaire que dans des cas particuliers (passage par un intptr_t, etc.)

    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
    struct maStruct{
    	int a;
    	char s[10];
    };
     
    void TaskReader(void *pVoid)
    {
    	struct maStruct *pParam = pVoid;
     
    	//Utilisation de la structure
    	//...
     
    	//À la fin, on la libère
    	free(pParam);
    }
     
    void Fonction(void)
    {
    	struct maStruct const param = { 321, "test" };
    	struct maStruct *pParam = malloc(sizeof(*pParam));
     
    	memcpy(pParam, &param, sizeof(param));
     
    	OSTaskCreate(TaskReader, pParam, Stack, STK_SIZE, 14);
    }
    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.

  12. #12
    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
    Medinoc, dans son cas, il ne peut modifier le code de la tâche qu'il veut lancer... C'est à dire faire cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void TaskReader(void *pVoid)
    {
    	struct maStruct *pParam = pVoid;
    
    	//Utilisation de la structure
    	//...
    
    	//À la fin, on la libère
    	free(pParam);
    }

  13. #13
    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
    Si, il a parfaitement accès aux sources de sa tâche puisqu'il y avait ajouté un paramètre.
    C'est la fonction OSTaskCreate dont il ne possède pas les sources, ce qui - je pense - est normal.
    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.

  14. #14
    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
    Yes, le code de Médinoc fonctionne nickel, c'est pas con du tout ca !

    Medinoc, dans son cas, il ne peut modifier le code de la tâche qu'il veut lancer... C'est à dire faire cela:
    Si si, TaskReader c'est ma fonction que j'appel, c'etait OSTaskCreate que je ne pouvais modifier.

    Merci à vous deux !

    edit :
    C'est la fonction OSTaskCreate dont il ne possède pas les sources, ce qui - je pense - est normal.
    Ouep, c'est normal, c'est une fonction de mon terminal, c'est comme si je voulais modifier le printf du c

  15. #15
    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
    Arf, sourire, c'est moi dès le début qui t'es mal renseigné, c'était bien dans cette fonction qu'il fallait faire la modif...
    Hum hum, je sais ce qu'il me reste à faire, partir en we!

    Bon we

  16. #16
    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
    lol

    merci encore et bon we

+ 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