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 :

cmmnt utiliser ls pointeur générique comme argument dans une définition de fonction ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut cmmnt utiliser ls pointeur générique comme argument dans une définition de fonction ?
    Salut,

    je débute donc en C, vous vous en doutez, et je suis en train de lire le coours d'initiation au C par Melem

    voici un code qui fonctionne
    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
    #include <stdio.h>
    #define len(t) ( sizeof(t) / sizeof([0]) )
     
    void show(int *t, int t_len)
    {
        int i;
        for ( i=0 ; i < t_len ; i++ )
            printf("i : %d\n%x\n", i, *(t+i));
    }
     
    int main()
    {
        int tbl[] = { 10, 20, 30 };
        show(tbl, len(tbl));
        return 0;
    }
    Maintenant, ce que je voudrais faire, c'est faire en sorte que les arguments de show n'aient pas de type définis, ou plutôt que le premier argument de show prenne le même type que celui qui lui est passé lors d'un appel a show ; ce qui me permettrait de pouvoir passer aussi bien des tableaux de type char que des tableaux de type long en premier argument à show... Est-ce possible ? Si oui comment ?

    Edit: Bon, comme un couillon j'avais pas lu ne serait-ce qu'un peu plus loin le cours, sinon j'aurais vu l'histoire des pointeurs génériques, toutefois, je n'arrive pas pour autant à me servir de ces pointeur génériques en tant qu'argument lors de la définition de la fonction...

    J'ai bien crée une nouvelle fonction qui me permet l'affichage d'un élément d'un tableau dont le type n'est pas connu lors de la definition de la fonction, mais je me dis qu'il doit bien y avoir plus élégant quand même...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void * showE(char * p, int n, int size)
    {
    	int ad = ( p+((n-1)*size) );
    	printf("adress : %x\n", ad);
    	return *( p+((n-1)*size) );
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Sur ton code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define len(t) ( sizeof(t) / sizeof([0]) )
    devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define len(t) ( sizeof(t) / sizeof(t[0]) )
    mais il ne s'agit sans doute que d'une erreur de recopie (il est préférable de faire un copier coller que de recopier le code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("i : %d\n%x\n", i, *(t+i));
    s'écrit aussi avantageusement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("i : %d\n%x\n", i, t[i]);
    puisque par définition de l'opérateur [], *(t+i) est équivalent à t[i]

    ....sinon j'aurais vu l'histoire des pointeurs génériques, toutefois, je n'arrive pas pour autant à me servir de ces pointeur génériques en tant qu'argument lors de la définition de la fonction...
    La difficulté de passer un paramètre du type void * est lié au fait que pour utiliser les données, il faut des informations complémentaires sur le type exact. On peut distinguer deux cas :

    - la fonction n'a besoin pour travailler que de connaitre la taille d'un élément. On peut alors la passer en argument de la fonction. C'est par exemple le cas de la fonction standard de tri qsort() : les opérations impliquées sur les éléments du tableau par le tri demandent de situer les éléments du tableau et de pouvoir les déplacer. Le paramètre void* permet d'obtenir l'adresse du début du tableau et la taille des éléments permet de trouver la position du ieme élément du tableau. On n'a pas besoin d'en savoir plus sur le type des éléments du tableau.

    - La fonction a besoin de connaitre le type exact, par exemple si elle effectue des opérations sur les éléments du tableau (y compris l'affichage), autrement dit demandent d'utiliser p[i] ou *(p+i). Alors, l'utilisation du void * perd beaucoup de son intérêt, puisqu'il faut passer un indicateur du type exact des éléments du tableau et traiter chaque cas dans un gros switch sur cet indicateur. Ceci n'améliore pas forcément le code, mais a alors le seul intérêt de le "centraliser" dans une fonction.

    Dans le code de ta fonction showE, tu n'essayes pas d'afficher un élément du tableau dont le type est inconnu (sinon que mettre dans le printf ? %d, %f , ...), mais l'adresse de son dernier élément.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ad = ( p+((n-1)*size) );
    est incorrect : le second membre est une adresse de type char * et ad est un int : une adresse n'est pas un entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return *( p+((n-1)*size) );
    Non, le type de retour est void * soit une adresse. Or *( p+((n-1)*size) ) est du type char. Tu essayes cette fois de convertir un entier (char) en une adresse (void *) . Une adresse n'est pas un entier

  3. #3
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Merci beaucoup,

    J'ai vraiment du mal avec les pointeurs... même si je me dis qu'ils doivent êtres vraiments utiles... Je vais encore potasser ton post jusqu'a ce que je le digère bien , encore merci

Discussions similaires

  1. Mettre une variable comme argument dans une fonction
    Par djun1 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 04/09/2012, 10h44
  2. Réponses: 3
    Dernier message: 05/11/2009, 10h28
  3. [PHP-JS] Variable PHP comme argument dans l'appel d'une fonction Javascript
    Par The Molo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/04/2007, 09h00
  4. Réponses: 2
    Dernier message: 19/04/2007, 16h57
  5. fonction comme argument dans un str_replace
    Par kalash_jako dans le forum Langage
    Réponses: 7
    Dernier message: 10/04/2007, 12h15

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