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 :

Renseignement sur le nom des fonctions


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut Renseignement sur le nom des fonctions
    Bonjour, je souhaiterai avoir un renseignement sur le nom des fonctions :
    par exemple si on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     int addition(int x,int y) 
    {
      printf("adresse de addition = %d \n\n", &addition); 
      printf("adresse de x = %d \n", &x);
      printf("adresse de y = %d \n", &y);
      return x + y; 
    }
    Le nom de la fonction est une adresse pourquoi cette adresse ne correspond pas à l'adresse de l'argument ici int x. Sur mon ordi l'adresse du nom de la fonction est : 4234688 mais l'adresse de l'argument int x est : 2271920.

    Je pensais que l'adresse du nom de la fonction était identique à l'adresse du premier argument de la fonction donc ici int x, mais ce n'est pas le cas. Est-ce que le nom de la fonction est un pointeur sur le premier argument de la fonction ?
    Peut-on accéder à la valeur du nom de la fonction (pas à son adresse dans la mémoire) en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("valeur de addition = %d \n",addition);
    Cette valeur devrait normalement correspondre à l'adresse du premier argument int x mais en faite la valeur de addition est identique à son adresse. Donc comment le compilo peut-il savoir qu'il faut aller à l'argument int x si les 2 adresses (celle du nom de la fonction et celle du premier argument int x) sont différente.
    A quoi correspond l'adresse du nom de la fonction ? Quelle relation y a t-il entre l'adresse du nom de la fonction et les adresses des arguments et : si on fait un schéma de mémoire ou est placé l'adresse du nom de la fonction et les 2 arguments de la fonctions.
    Comment le compilo peut-il accéder au argument de la fonction si l'adresse du nom de la fonction ne correspond pas au premier argument de celle-ci ?
    J'espère avoir était suffisamment claire merci par avance.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Une fonction est stocké dans l'espace des fonctions, ces adresses ne sont théoriquement même pas comparable avec celles d'une variables.
    Un argument de fonction est une variable locale au corps de la fonction, elle est donc dans le segment mémoire nommé "pile".
    La fonction en elle-meme est dans le segment de code (segment complètement constant)

    Les pointeurs ne sont pas même pas convertibles entre eux, normalement.

    La seule chose que tu sais, c'est que pour struct et union, le premier champ est à la même adresse que la structure elle-même. (et que c'est aussi l'adresse de tous les champs d'une union).
    Mais cela quasiment n'a rien à voir avec ta question.

    Par ailleurs pour afficher une adresse, utilise %p (comme pointeur)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Plus prosaïquement, une fonction n'est pas un container : c'est une liste d'instructions à honorer. Le nom de la fonction se résout en un « pointeur de fonction » qui, lui, pointe le code exécutable en langage machine tel que produit par le compilateur. C'est directement à cette adresse que le micro-processeur va poursuivre son travail lorsque tu vas appeler la fonction.

    Par ailleurs, une fonction n'est pas en soi un type de données et ne peut pas être instanciée en plusieurs exemplaires comme le ferait avec une variable.

    Tu confonds probablement avec les structures qui, elles, sont des agrégats de plusieurs sous-variables réunies sous un seul type. L'adresse de la structure entière correspond donc à celle de son premier élément.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Merci beaucoup pour vos réponses qui m'aide à avoir une meilleur compréhension sur le fonctionement d'une fonction.
    Comment se fait-il que les info que vous m'avez donnés je ne les retrouve pas sur le net ou puis-je trouver un cours C qui explique ce qui se passe avec les fonctions comme vous me l'avez expliqué.

    Merci encore !

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Soit dans la norme, soit dans nos cours et tutoriels de formation pour apprendre la programmation C : http://c.developpez.com/cours/ .
    En fouillant, on doit trouver pas mal de chose sur cppreference.com (tout particulièrement dans langage)
    Ces explications en particulier sont liées au modèle mémoire du C (C memory model)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Merci pour ta réponse

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par hbx360 Voir le message
    Merci beaucoup pour vos réponses qui m'aide à avoir une meilleur compréhension sur le fonctionement d'une fonction.
    Comment se fait-il que les info que vous m'avez donnés je ne les retrouve pas sur le net ou puis-je trouver un cours qui explique ce qui se passe avec les fonctions comme vous me l'avez expliqué.Merci encore !
    C'est malheureusement souvent le cas, même dans les cours scolaires : avec la meilleure volonté du monde, on ne peut pas penser forcément à toutes les approches possibles que les étudiants peuvent avoir d'un sujet donné et, souvent, certaines choses paraissent totalement implicites, voire être des axiomes.

    En ce qui concerne le C en particulier, c'est un langage qui est extrêmement proche du fonctionnement réel des microprocesseurs et qui épouse au mieux leur architecture globale. Du coup, il y a beaucoup de choses dont les origines sont purement techniques et essayer de les appréhender de manière académique, comme les mathématiques, n'est pas forcément la méthode la plus efficace.


    http://c.developpez.com/cours/
    http://c.developpez.com/telecharger/

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Éventuellement : x86 calling conventions

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 106
    Points
    43 106
    Par défaut
    Je rajouterais, qu'en C tu gères pas des adresses mémoires mais des variables (enfin en usage normal.). Ce n'est pas toi qui gères les adresses mémoires, mais le compilateur, le linker, etc ...

    En assembleur on va parler d'adresses mémoires, en C de variables, voire de pointeurs.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    J'ai une autre question : quand on créer une fonction l'adresse du nom de cette fonction pointe sur la pile mais est-ce que pour chaque fonctions créer le compilateur crée une nouvelle pile ou bien est-ce qu'il y a une seul pile pour toute les fonctions ?

    @chrtophe oui mais en faite si j'ai demandé des explication sur les adresses des noms des fonctions c'était surtout pour comprendre exactement comment sa fonctionné car ce n'était pas claire pour moi et en rajoutant les pointeur de fonction je ne comprenais plus trop c'était le brouillard car pour moi au tout début je pensais que le nom d'une fonction c'était une variable qui recevait le résultat puisque on mettait (par exemple) int addition(int x, int y) donc je pensais que le return renvoyait le resultat dans la variable de type int qui a pour nom (ici dans l'exemple) addition ce qui est bien sûr complétement faux alors quand on m'a dit que le nom d'une fonction était seulement une adresse qui pointe sur quoi ??? aucune explication donné ce manque d'information est pour moi catastrophique et je n'y ai plus rien compris voilà pourquoi j'ai posé la question.

    Merci encore pour votre aide.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    rêveur
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : rêveur

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par hbx360 Voir le message
    J'ai une autre question : quand on créer une fonction l'adresse du nom de cette fonction pointe sur la pile
    Non. En fait ce qu’il faut comprendre c’est qu’on peut très bien voir le code comme une donnée, puisqu’il est situé en mémoire après tout. C’est comme ça que certains programme (comme un linker par exemple) vont explicitement manipuler du code comme des données. Mais en générale, on place les instructions du programme dans un espace séparé (au moins logiquement) des données du programme

    Citation Envoyé par hbx360 Voir le message
    mais est-ce que pour chaque fonctions créer le compilateur crée une nouvelle pile ou bien est-ce qu'il y a une seul pile pour toute les fonctions ?
    Il n’y a qu’une seule pile (enfin, en général), et on empile dessus ce dont le programme à besoin pour fonctionner (ancienne valeur du pointeur d’instruction, valeurs des registres, variables locale, etc.).


    PS*: mais ce ne sont que des détails d’implémentation, la norme ne parle jamais de pile.

  12. #12
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    Il y a principalement deux types d'architecture d'ordinateurs. L'architecture Harvard qui sépare dans des «mémoires» différentes les «programmes» et les «données», et l'architecture von Neumann qui dans une même «mémoire» stocke «programmes» et «données».
    La plupart des ordinateurs sur lesquels tu vas programmer seront de type von Neumann.

    Ensuite suivant la plateforme (os+hardware) pour laquelle tu vas développer un programme la gestion de la mémoire va être différente. Sans me tromper beaucoup, je pense que tu vas être amené à programmer sur du linux ou du windows récent. Dans ce cas de figure le programme que tu auras écrit verra un espace mémoire assez vaste (on va simplifier à 4Go ici) et rien d'autre. C'est comme s'il avait toute la machine pour lui, l'os se charge de gérer cette mémoire virtuelle.

    Ensuite il y a des conventions qui sont utilisées, elles diffèrent suivant les plateforme. Mais en général du point de vue de ton programme il y aura en premier (vers le bas de la mémoire en direction de l'adresse 0) le code (ce que l'on appelle souvent la section text), puis les données (statiques, constantes, initialisées, déclarées). Le reste de la mémoire est ensuite partagée en deux : le tas qui commence après les sections codes et la pile qui commence à l'autre bout de la mémoire. Le tas est agrandi vers le haut, la pile vers le bas.
    Toutes les allocations dynamiques se feront dans le tas alors que les variables locales, certains paramètres de fonction, les adresses de retour seront alloués sur la pile. Dans le cadre d'un programmation multithread, chaque thread aura sa propre pile mais là on va un peu trop loin. En première approximation dis toi qu'il n'y a qu'une et une seule pile et que bien souvent elle est d'une taille très limitée mais suffisante en général.


    En C (pour faire simple), une fonction est un pointeur vers l'adresse où se trouve le code à exécuter. Les paramètres ainsi que la valeur de retour seront passés sur la pile ou dans des registres suivant la convention utilisée par la plateforme cible. L'appel d'une fonction en C est une valeur que tu peux affecter à une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int add (int a, int b) {
      return a+b;
    }
     
    int main (void) {
      int c;
      c = add (2,3);
      printf ("2+3=%d=%d\n", c, add (3,2) );
     
      return add (-1,1);
    }

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    L'autre manière de voir la chose, c'est de considérer le rôle d'un pointeur de fonction: désigner une fonction.
    De même qu'un pointeur de variable désigne une variable.

    La différence entre les deux types de pointeurs, c'est qu'on ne peut pas allouer de la mémoire pour une fonction, vu qu'on ne saurait pas l'initialiser.

    Une fois cela compris, il suffit de savoir que comme avec les tableaux, le nom d'une fonction est un pointeur vers elle-même.

    L'intérêt d'un pointeur de fonction, c'est de pouvoir donner en paramètre d'une fonction (souvent désignée comme algorithme) la fonction qu'on veut qu'elle utilise.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Merci beaucoup pour toutes vos réponse

Discussions similaires

  1. pointeurs sur les arguments des fonctions?
    Par brunoP dans le forum C
    Réponses: 3
    Dernier message: 14/05/2006, 18h11
  2. String pointant sur un nom de Fonction.
    Par YmYannick dans le forum MFC
    Réponses: 4
    Dernier message: 21/04/2006, 13h06
  3. Réponses: 5
    Dernier message: 06/04/2006, 11h46
  4. [xpath] Requête sur le nom des attributs sans casse
    Par fedfil dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/01/2006, 10h58
  5. Réponses: 2
    Dernier message: 04/10/2005, 15h13

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