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 :

Propriétés des sous-fonctions


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Propriétés des sous-fonctions
    Bonjour

    J'ai définit dans une fonction plusieurs sous-fonctions, tout marche parfaitement. Seulement, après coup je me rend compte que j'utilise des variables de la fonction principale dans les sous-fonctions sans les passer (aux sous-fonctions...).
    Alors est-ce une erreur tolérée par le compilateur ou c'est dans les propriétés des sous-fonctions de pouvoir utiliser des variables de la fonction principale sans pour autant qu'elles leur aient été passées ?!

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Heu, là, j'aimerai assez voir ton code... Parceque les fonctions imbriquées, en C, c'est pas vraiment toléré...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    salut,

    En c les variables peuvent avoir differentes portées : Publiques et Privées.

    Les variables publiques sont des variables declarée en dehors des fonctions et des procedures (void) de ta source et sont accesibles à partir de n'importe quel partie de ton code.

    Les variables privées sont declarée à l'interieur d'une fonction ou d'une procédure et sont accesibles qu'a l'interieur du bloc dans le quelle elles ont été declarée.

    c se que tu voulais savoir ?

    @++ nairolf

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Propriétés des sous-fonctions
    Citation Envoyé par rodb7
    J'ai définit dans une fonction plusieurs sous-fonctions,
    Pas de 'sous-fonctions' en C. Montre ton code.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est marrant que vous disiez que ce n'est pas toléré parce que je n'ai aucun warning ou choses du genre et ça a marché de suite... à moins que je désigne intuitivement par "sous-fonction" des choses qui n'en sont pas :

    Quoiqu'il en soit, voici un extrait du code:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    void GameTabAff(int gameSize,int *TabPlay,int nAff)
    {
    int ctrAL=0;// = compteur d'affichage de ligne, utilisé dans les boucles.
    int i=0;
    char a='a',carFin[]={'c','d','e','f','g','h','i'};
     
                             void LigneDynamique()
                             {
                              int ctrAL;
                              printf("  ");
                              for(ctrAL=0;ctrAL<gameSize;ctrAL++)
                                 {
                                  printf("| ");
                                  if(nAff==1) 
                                    {affSymbol(TabPlay,i);i+=3;}
                                  else printf(" ");
                                  printf(" |");
                                  if(ctrAL<gameSize-1) printf("-");
                                 }   
                              printf("  :");     
                             }
                             void Ligne1(int gameSize)
                             {
                              dynamic_spc(gameSize);printf(":::: ");
                              for(ctrAL=0;ctrAL<gameSize;ctrAL++)
                                 {
                                  color(14);printf("%d",ctrAL+1);color(0);
                                  if(ctrAL<gameSize-1) printf("     ");
                                 }
                              printf(" ::::");
                             }
                             void Ligne2(int gameSize)
                             {
                              printf("\n");
                              dynamic_spc(gameSize);printf(":");
                              for(ctrAL=0; ctrAL<(23+6*(gameSize-3)-2); printf(" "),ctrAL++);
                              printf(":");
                             }
                             void LigneGenerique(int gameSize)
                             {
                              printf("\n");
                              dynamic_spc(gameSize);printf("    ");
                              for(ctrAL=0;ctrAL<gameSize;ctrAL++)
                                 {
                                  printf("---   ");
                                 }   
                              printf(":");
                             }
                             void Lignei_i(int gameSize)
                             {
                              printf("\n");
                              dynamic_spc(gameSize);printf("   ");
                              color(3);
                              for(ctrAL=0;ctrAL<gameSize;ctrAL++)
                                 {
                                  printf("  |  ");
                                  if(ctrAL<gameSize-1)
                                    {
                                     if((ctrAL%2)== 0) printf("\\");
                                     else printf("/");
                                    }
                                 }
                              color(0);
                              printf("  :");
                             }      
                             void Lignei_p(int gameSize)
                             {
                              printf("\n");
                              dynamic_spc(gameSize);printf("   ");
                              color(3);
                              for(ctrAL=1;ctrAL<=gameSize;ctrAL++)
                                 {
                                  printf("  |  ");
                                  if(ctrAL<=gameSize-1)
                                    {
                                     if((ctrAL%2)==0) printf("\\");
                                     else printf("/");
                                    }
                                 }
                              color(0);
                              printf("  :");
                             }
    // Affichage du tableau
    Ligne1(gameSize);
    Ligne2(gameSize);
    for(a;a<=carFin[(gameSize-3)];a++)
     {
      LigneGenerique(gameSize);
      printf("\n"); dynamic_spc(gameSize);color(14);printf("%c",a);color(0);LigneDynamique();  LigneGenerique(gameSize);
        if(a<carFin[(gameSize-3)])
          {
           if(a%2==0) Lignei_p(gameSize);
              else    Lignei_i(gameSize);
          }     
     }
    Ligne2(gameSize); printf("\n");
    Ligne1(gameSize);
    }
    Bon, pour expliquer un peu, il s'agit d'une fonction dans un programme permettant d'afficher un tableau de taille variable (gameSize) entrée par l'utilisateur et d'afficher aux coordonnées voulues le symbole du joueur.
    Comme vous pouvez le voir, j'utilise dans toutes les 'sous-fonctions' la variable ctrAL sans qu'elle n'y soit jamais déclarée et dans la 'sous-fonction' LigneDynamique() ben... y a rien de passé...
    Le "problème"(mais ça me dérange pas trop en fait) c'est que ça fonctionne très bien sans génrérer de warning ou autre.

    Bref, sous-fonction, pas sous-fonction, pourquoi pas probleme ?

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rodb7
    C'est marrant que vous disiez que ce n'est pas toléré parce que je n'ai aucun warning ou choses du genre et ça a marché de suite...
    Arf !
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    Compiling: main.c
    main.c:7: warning: no previous prototype for 'GameTabAff'
    main.c: In function `GameTabAff':
    main.c:13: warning: function declaration isn't a prototype
    main.c: In function `LigneDynamique':
    main.c:14: warning: declaration of 'ctrAL' shadows a previous local
    main.c:8: warning: shadowed declaration is here
    main.c:15: error: implicit declaration of function `printf'
    main.c:15: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:20: error: implicit declaration of function `affSymbol'
    main.c:20: warning: nested extern declaration of `affSymbol'
    main.c: In function `GameTabAff':
    main.c:27: warning: declaration of 'gameSize' shadows a parameter
    main.c:6: warning: shadowed declaration is here
    main.c:28: warning: no previous prototype for 'Ligne1'
    main.c: In function `Ligne1':
    main.c:29: error: implicit declaration of function `dynamic_spc'
    main.c:29: warning: nested extern declaration of `dynamic_spc'
    main.c:29: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:32: error: implicit declaration of function `color'
    main.c:32: warning: nested extern declaration of `color'
    main.c: In function `GameTabAff':
    main.c:37: warning: declaration of 'gameSize' shadows a parameter
    main.c:6: warning: shadowed declaration is here
    main.c:38: warning: no previous prototype for 'Ligne2'
    main.c: In function `Ligne2':
    main.c:39: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:40: warning: nested extern declaration of `dynamic_spc'
    main.c:29: warning: redundant redeclaration of 'dynamic_spc'
    main.c:29: warning: previous implicit declaration of 'dynamic_spc' was here
    main.c: In function `GameTabAff':
    main.c:44: warning: declaration of 'gameSize' shadows a parameter
    main.c:6: warning: shadowed declaration is here
    main.c:45: warning: no previous prototype for 'LigneGenerique'
    main.c: In function `LigneGenerique':
    main.c:46: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:47: warning: nested extern declaration of `dynamic_spc'
    main.c:29: warning: redundant redeclaration of 'dynamic_spc'
    main.c:29: warning: previous implicit declaration of 'dynamic_spc' was here
    main.c: In function `GameTabAff':
    main.c:54: warning: declaration of 'gameSize' shadows a parameter
    main.c:6: warning: shadowed declaration is here
    main.c:55: warning: no previous prototype for 'Lignei_i'
    main.c: In function `Lignei_i':
    main.c:56: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:57: warning: nested extern declaration of `dynamic_spc'
    main.c:29: warning: redundant redeclaration of 'dynamic_spc'
    main.c:29: warning: previous implicit declaration of 'dynamic_spc' was here
    main.c:58: warning: nested extern declaration of `color'
    main.c:32: warning: redundant redeclaration of 'color'
    main.c:32: warning: previous implicit declaration of 'color' was here
    main.c: In function `GameTabAff':
    main.c:71: warning: declaration of 'gameSize' shadows a parameter
    main.c:6: warning: shadowed declaration is here
    main.c:72: warning: no previous prototype for 'Lignei_p'
    main.c: In function `Lignei_p':
    main.c:73: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:74: warning: nested extern declaration of `dynamic_spc'
    main.c:29: warning: redundant redeclaration of 'dynamic_spc'
    main.c:29: warning: previous implicit declaration of 'dynamic_spc' was here
    main.c:75: warning: nested extern declaration of `color'
    main.c:32: warning: redundant redeclaration of 'color'
    main.c:32: warning: previous implicit declaration of 'color' was here
    main.c: In function `GameTabAff':
    main.c:94: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:94: warning: nested extern declaration of `dynamic_spc'
    main.c:29: warning: redundant redeclaration of 'dynamic_spc'
    main.c:29: warning: previous implicit declaration of 'dynamic_spc' was here
    main.c:94: warning: nested extern declaration of `color'
    main.c:32: warning: redundant redeclaration of 'color'
    main.c:32: warning: previous implicit declaration of 'color' was here
    main.c:101: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:91: warning: statement with no effect
    Process terminated with status 1 (0 minutes, 1 seconds)
    C'est une extension de gcc. Ce n'est pas standard.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oula

    Je dois faire quoi là alors ? Comment gcc peut me compiler ça sans même mettre un warning(j'utilise devCpp) !!

    Je suis un peu sur le luc là, je ne me serais pas posé la question que ça serait passé inaperçu...

    Quel compilateur avez-vous utilisé Emmanuel ?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    gcc aussi, mais gcc a la (très) facheuse habitude de ne donner aucun warning si on ne le lui demande pas explicitement.

    Moi, je compile avec ces options de warning:
    -Wall -Wextra -Wwrite-strings -O2
    (Il faut rajouter -O avec un chiffre assez élevé pour certains warnings qui n'apparaissent que si gcc essaie d'optimiser le code. Notamment, tous les "uninitialized variable").
    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.

  9. #9
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Mais comment se fait-il que ça fonctionne ??
    C'est vraiment une grosse erreur ou alors(et puisque c'est toléré visiblement) je peux laisser comme ça ? Niveau clarté du code dans ce cas je trouve les sous-fonctions vraiment bien.

  10. #10
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    int main (void) {
        int titi = 3;
        void Affiche (void) {
             printf ("%d\n",titi);
        }
        Affiche ();
        getchar();
        return 0;
    }
    c'est vrai que cela marche sans warning avec le MinGW (même avec les options -Wall -Wextra -Wwrite-strings -O2)

    l'imbrication de fonctions/procédures est courante en Pascal mais pas
    enseignée en C

    Mais est-ce vraiment illégal ? la permissivité du C est incommensurable.

    Que dit la norme ? Si l'imbrication n'est pas dans la norme, il ne faut pas
    l'employer, même si tel compilateur l'autorise.

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne connaissais pas cette possiblité en C.
    Sous Visual C, ça ne compile pas, donc au minimum, ce n'est pas portable.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Trap D
    Je ne connaissais pas cette possiblité en C.
    Sous Visual C, ça ne compile pas, donc au minimum, ce n'est pas portable.
    Je me tue à le dire, c'est une extension de gcc. Ce n'est pas portable. Pour désactiver les extensions, il faut compiler en mode ansi.
    ou
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Qu'est ce que tu veux dire concrètement par " c'est une extension de gcc " ?
    Ca entraine quoi pour l'ensemble du code ?

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rodb7
    Qu'est ce que tu veux dire concrètement par " c'est une extension de gcc " ?
    Ca entraine quoi pour l'ensemble du code ?
    Je crois que Trap D t'a donné la réponse :
    Sous Visual C, ça ne compile pas, donc au minimum, ce n'est pas portable.
    Si ton code est compilé avec un autre compilateur, ça risque de ne pas compiler, ou pire, de compiler mais de fonctionner d'une manière différente de celle définie par gcc.

    En l'occurence, je ne vois pas à quoi servent les fonctions imbriquées. Si tu veux des fonctions à portées réduites, définie les 'static'.

    http://emmanuel-delahaye.developpez....tes.htm#portee

    Les extensions sont utiles dans certains cas, mais elles rendent le code non portable.
    Il faut le savoir, c'est tout.

    D'autre part, ici, on s'interesse plutôt au code portable (j'ai pas envie de modifier ma config pour tester du code non portable...)
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    En l'occurence, je ne vois pas à quoi servent les fonctions imbriquées. Si tu veux des fonctions à portées réduites, définie les 'static'.

    http://emmanuel-delahaye.developpez....tes.htm#portee
    Je ne comprend pas trop ce que tu veux dire. Dans tes notes tu parles d'unité de compilation, et en C l'unité de compilation est bien le fichier ? Dans la mesure où mon code tiens en un seul fichier... enfin je ne saisit vraiment pas.
    Je pense que je vais garder le code tel qu'il est dans un premier temps. Ce n'est peut-être ni standard ni portable mais cette extension donne la liberté a une certaine intuition(utiliser des sous-fonctions dans ce cas a l'air plutôt évident à mes yeux) et c'est pas plus mal.

    Merci pour toutes vos réponses.

  16. #16
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Citation Envoyé par rodb7
    Ce n'est peut-être ni standard ni portable mais cette extension donne la liberté a une certaine intuition(utiliser des sous-fonctions dans ce cas a l'air plutôt évident à mes yeux) et c'est pas plus mal.
    Ce n'est pas une obligation de faire du code standard ou portable, tant que tu fais ce choix délibérément et que tu en connais les conséquences.

  17. #17
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    En l'occurence, je ne vois pas à quoi servent les fonctions imbriquées. Si tu veux des fonctions à portées réduites, définie les 'static'.
    Dans ce cas là, autant ne pas utiliser de variables locales...

    Ca sert à ne pas avoir une procédure/fonction qui se balade dans un fichier, qui ne sert qu'à un seul algorithme, et qui ne sert à rien d'autre.

    Après tout une fonction, c'est comme une donnée comme n'importe quelle autre. Les gens considèrent bien les fonctions comme des vecteurs.

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par HanLee
    Ca sert à ne pas avoir une procédure/fonction qui se balade dans un fichier, qui ne sert qu'à un seul algorithme, et qui ne sert à rien d'autre.

    Après tout une fonction, c'est comme une donnée comme n'importe quelle autre. Les gens considèrent bien les fonctions comme des vecteurs.
    Gné ? Grave erreur... Oui, le C est orienté traitement, ok, mais un peu d'orientation objet ne fait pas de mal. Dans ce cas, ce sont les fonctions qui deviennent les points d'entrée visibles.

    Je ne suis pas complètement contre le principe des fonctions locales (ok, ça existe en Turbo-Pascal), mais le problème est que ça rend le code gravement non portable (gcc est certes répandu, mais encore unique, et heureusement. Monopole, on merci...) La norme reste la référence et le comité est en sommeil, ça ne risque plus de bouger avant 50 ans...

    Evidemment, si on écrit en GNU-C, c'est autre chose, mais ce n'est plus du C. C'est un autre langage (comme Pascal vs Turbo-Pascal).
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut
    J'ai entendu parler de ça, je crois que ça a été rajouté récement dans gcc, avant ce n'était pas autorisé...
    Si tu es sur que ton programmes ne sera jamais compilé par quelqu'un qui n'utilisera pas le meme compilateur que toi, ça ne posera pas de probleme.

    Dans ce cas, les variables de la fonction englobante sont effectivement accessibles dans les sous-fonctions (meme systeme qu'en pascal par exemple).

    Par contre si tu envisages que quelqu'un d'autre utilise tes sources, c'est mieux d'éviter d'utiliser des sous-fonctions.

  20. #20
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par HanLee
    Ca sert à ne pas avoir une procédure/fonction qui se balade dans un fichier, qui ne sert qu'à un seul algorithme, et qui ne sert à rien d'autre.

    Après tout une fonction, c'est comme une donnée comme n'importe quelle autre. Les gens considèrent bien les fonctions comme des vecteurs.
    Gné ? Grave erreur... Oui, le C est orienté traitement, ok, mais un peu d'orientation objet ne fait pas de mal. Dans ce cas, ce sont les fonctions qui deviennent les points d'entrée visibles.

    Je ne suis pas complètement contre le principe des fonctions locales (ok, ça existe en Turbo-Pascal), mais le problème est que ça rend le code gravement non portable (gcc est certes répandu, mais encore unique, et heureusement. Monopole, on merci...) La norme reste la référence et le comité est en sommeil, ça ne risque plus de bouger avant 50 ans...

    Evidemment, si on écrit en GNU-C, c'est autre chose, mais ce n'est plus du C. C'est un autre langage (comme Pascal vs Turbo-Pascal).
    Ah non mais j'l'encourage pas à faire du code comme ça rassure toi, moi j'veux qu'il t'écoute, c'est-à-dire qu'il code portable.

    C'est juste que ça m'a gêné que tu dises que ça ne présente pas grand intérêt.

    Par contre s'il compte coder pour lui, il fait comme il veut .

    Sinon, moi j'trouve que ça fait plutôt orienté fonctionnel que traitement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. scope des sous fonction et TkInter
    Par sopsag dans le forum Général Python
    Réponses: 14
    Dernier message: 30/10/2009, 17h12
  2. Empecher "l'ouverture" des sous fonctions d'un fichier-m
    Par lapinoufly dans le forum MATLAB
    Réponses: 1
    Dernier message: 01/07/2009, 10h07
  3. Recherche des sous-fonctions
    Par Laugeek dans le forum Développement
    Réponses: 3
    Dernier message: 16/04/2009, 12h15
  4. Réponses: 6
    Dernier message: 25/09/2006, 17h08

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