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 :

La généricité en langage C [Tutoriel]


Sujet :

C

  1. #1
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut La généricité en langage C
    Bonjour,

    Vous pouvez postez ici vos avis, remarques, suggestions sur l'article suivant :

    http://rperrot.developpez.com/articles/c/genericite/

    NB: Merci de lire ce message avant de poster.

  2. #2
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 6
    Points
    6
    Par défaut Super !!!
    Un super tutorial pour aborder ce point si difficile pour ne pas dire pénible du language C

  3. #3
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Merci, ça fait plaisir

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Merci
    Merci pour votre tutoriel, je sens qu'il va m'être très utile

  5. #5
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Lecture intéressante, bravo et merci.
    Je m'étais un peu frotté à la généricité, ou un truc approchant, j'avais trouvé le C assez peu adapté et surtout l'effort coûteux. J'avais décidé de prendre une approche crocolion, par exemple uniquement sur les formats de pixels, en transformant un uint8_t en uint8_t[1].
    On demande souvent à un programme écrit en C d'aller vite. Imaginons des fonctions agissant sur des T[n], n connu à l'exécution, ces fonctions intégrant des boucles lourdes (sinon la question de performance n'a pas à être posée). n n'étant pas connu à la compilation, ni le compilateur ni le programmeur ne pourront optimiser en développant les boucles "courtes", par exemple. Si dans la vraie vie, n ne peut prendre que 3 valeurs, 1, 2 et 4, éventuellement une 4eme dans une future version, il sera souvent objectivement plus performant de multiplier les fonctions. Le gros problème, et dans le cas vécu il était réel, c'est que ça casse la centralisation du code. Le préprocesseur peut être une solution. Mais il me semble qu'il est limité, et de toutes façons il me donne des boutons. J'avais préféré utiliser un script (python) pour générer la source C. Ça marche, et même bien, mais il faut dire que j'utilise python au quotidien, que je travaille seul et que j'utilise le plus souvent possible scons. Bon, je m'égare...

    J'ai peut-être constaté une imprécision, dans le paragraphe II-B. Je lis "Ainsi, pour notre fonction, ce ne sont pas les variables a et b que nous échangeons mais leur copie". En fait, ce sont des copies des adresses de a et b qui arrivent dans la fonction, et les variables locales correspondantes (paramètres formels ?) qui sont échangées, à toutes fins inutiles.
    Egalement, pour la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void swap( void * d1 , void * d2 ){...}
    même si le lecteur n'est pas censé être débutant, il sera bon d'expliquer (quelques mots, ou deux lignes de code supplémentaires) comment l'appeler. Il me semble qu'il faut créer dans l'appelant des variables pointeur initialisées par les adresses de a et b.
    Rien à voir avec la généricité, mais il y a souvent des incompréhensions dans ce genre de truc. Le statut de l'opérateur adresse et son rapport avec la notion de pointeur sont parfois mal expliqués. Combien de débutants (et même plus) voient &a comme ce qu'il est, rien d'autre qu'une constante immédiate, au même titre que 12L par exemple ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour/Bonsoir;
    Le tutoriel est très clair et bien structuré, merci pour votre travail.
    Cependant je rencontre une difficulté dans la section II-B, je n'arrive pas à comprendre ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void swap( void * d1 , void * d2 )
    {
        void * tmp;
        tmp = *(void **)d1;
        *(void **)d1 = *(void **)d2;
        *(void **)d2 = tmp;
    }
    La fonction reçoit 2 pointeurs génériques, ça je saisis, la première instruction aussi, mais quand j'arrive à la deuxième je bloque, je ne sais pas ce que ça fait. J'ai déjà vu quelque chose dont la syntaxe est très proche, en l'occurrence : un cast, c'est peut être la même chose, mais même en admettant cette possibilité je n'arrive pas à comprendre.

    Merci de bien détailler.
    A+

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Le but de la fonction est d'échanger les valeurs pointées par 2 pointeurs génériques passé en paramètre (mais cela, tu l'avais déjà deviné)

    Le problème est que l'on ne peut pas déréférencer un pointeur void * et que l'on veut échanger les objets pointés par ces 2 pointeurs.

    pour cela, on passe par une "ruse" qui n'est pas très jolie à voie en faisant croire au compilateur que le pointeur void * est un pointeur sur un void *. A ce moment là, on peut déréférencer un pointeur sur un void * puisque l'objet pointé est un void * et plus un void.

    La transformation pour indiquer que le void * est en fait un void ** est effectivement un cast. Cela permet d'aider le compilateur (mais pas le lecteur dans ce cas) pour qu'il fasse ce que l'on veut qu'il fasse.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci pour ton explication ram-0000. J'y vois plus clair maintenant .

Discussions similaires

  1. [langage] Je cherche un bon livre ?
    Par Anonymous dans le forum Langage
    Réponses: 13
    Dernier message: 09/04/2003, 13h16
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  3. [langage] comment créer des fichiers ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2002, 16h33
  4. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37
  5. Cours, tutoriels, logiciels, F.A.Q,... pour le langage SQL
    Par Marc Lussac dans le forum Langage SQL
    Réponses: 0
    Dernier message: 04/04/2002, 10h21

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