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 :

fonction et procédure avec aucun paramètre en entrée


Sujet :

C

  1. #1
    Membre actif
    Femme Profil pro
    Enseignant
    Inscrit en
    Août 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 71
    Par défaut fonction et procédure avec aucun paramètre en entrée
    Bonsoir;
    je voudrais savoir si c'est possible d'écrire une fonction ou bien une procédure(void) en langage c qui ne contiennent aucun paramètres en entrée

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int function_qui_ne_retourne_rien(void)
    {
      return 47;
    }
    On peut bien sur remonter plein d'autres choses qu'un int...
    Un pointeur, une structure...

    Bonne soirée

  3. #3
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 789
    Par défaut
    Pour le fun
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void) {
        printf("Hello world");
     
        return(0);
    }

  4. #4
    Membre actif
    Femme Profil pro
    Enseignant
    Inscrit en
    Août 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 71
    Par défaut
    merci pour vos réponses,
    par exemple si j'avais une procédure qui calcule la moyenne, mais avant de calculer la moyenne j'ai d'autres calcules, comme la lecture du fichier csv, ensuite le calcule de la distance euclidienne du fichier csv qui donne une matrice , et enfin le calcule de la moyenne de la distance euclidienne

    le tout regroupé dans une procédure de la façon suivante:

    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
    void moyenne()
    {
    .....
     
     
    printf("moy=%g",moy);
    return;
     
    }
     
    int main(int argc, char *argv[])
    {
         moyenne;    
      system("PAUSE");	
      return 0;
    }
    }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Un bon code découpe normalement les opérations dans des fonctions spécialisées pour 1 actions.
    Ça permet entre autre de les réutiliser.
    Mais rien n'empêche de faire une super fonction qui regroupe tout..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    D'ailleurs fais attention aux parenthèses vides. Alors que foo() exprime un nombre d'arguments arbitraire, foo(void) signifie qu'aucun argument ne peut être passé. Cette nuance ne reste dans le langage que pour des raisons de compatibilité avec des versions anciennes du C. C++ l'a abandonné et foo() a le même effet que foo(void).

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Corluk Voir le message
    C++ l'a abandonné et interdit foo(void).
    Euh... non
    Mettre void n'a aucun effet en C++ mais la syntaxe n'est pas du tout interdite.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lynaranya Voir le message
    merci pour vos réponses,
    par exemple si j'avais une procédure qui calcule la moyenne, mais avant de calculer la moyenne j'ai d'autres calcules, comme la lecture du fichier csv, ensuite le calcule de la distance euclidienne du fichier csv qui donne une matrice , et enfin le calcule de la moyenne de la distance euclidienne

    le tout regroupé dans une procédure de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void moyenne()
    {
    .....
     
     
    printf("moy=%g",moy);
    return;
     
    }
    Ben sans parler de ton return final totalement inutile pour une fonction ne retournant rien, les paramètres d'une fonction servent justement à la rendre universelle. Grace aux paramètres justement elle pourra faire ses calculs de la même façon quelle que soit la valeur reçue. C'est le pendant informatique de la notation mathématique f(x)=... permettant d'exprimer un calcul sans avoir à se préoccuper de la valeur à calculer qui sera donnée plus tard.
    Une fonction sans paramètre reste donc très limitée (cf premier exemple de Bayard qui crée une fonction retournant en tout et pour tout le nombre 47 et tant pis si l'utilisateur a besoin de 48).
    Pour ta moyenne par exemple je ne vois pas trop comment elle pourra calculer la moyenne des éléments sans les connaitre. Ou alors tu envisages de passer par des variables globales ce qui est la pire des mauvaises idées de conception...

    Citation Envoyé par Corluk Voir le message
    Alors que foo() exprime un nombre d'arguments arbitraire
    Non. C'est la notation foo(...) qui exprime des arguments arbitraires. foo() exprime bien une fonction sans argument.

    Citation Envoyé par Corluk Voir le message
    C++ l'a abandonné et interdit foo(void).
    Ah bon ? Je suis pas un pro du C++ mais il me semble avoir vu quand-même foo(void). Il me semble même que justement c'est la seule syntaxe autorisée en C++...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    Mettre void n'a aucun effet en C++ mais la syntaxe n'est pas du tout interdite.
    C'est bien, je me suis mal souvenu, foo() et foo(void) sont équivalents en C++. Mais la difference, c'est ce qui a été abandonné. Je l'ai corrigé dans mon dernier post.

    Je me suis renseigné un peu plus. Pour clarifier, référons au standard même. L'ébauche N1570 du standard C11 contient le nécessaire.

    §6.7.6.3/14:

    The empty list in a function declarator that is not part of a
    definition of that function specifies that no information about the number or types of the
    parameters is supplied. 145)
    C'est-à-dire, une déclaration avec des paramètres vides exprime que le programmeur ne fournit aucune information sur les paramètres. Donc, du code comme le suivant est tout à fait possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void foo();
    void foo(int a) { }
    La citation dessus est précédée par cette phrase-ci :

    An empty list in a function declarator that is part of a definition of that function specifies that the
    function has no parameters.
    Donc, en principe, Sve@r est correct en disant que des parenthèses vides expriment qu'il n'y a pas d'arguments. Mais fais très attention, parce qu'il y a encore §6.5.2.2/6 :

    If the expression that denotes the called function has a type that does not include a
    prototype [...] If the number of arguments does not equal the number of parameters, the
    behavior is undefined.
    Si l'on appelait une fonction qui manque un prototype et le nombre d'arguments n'est pas le nombre de paramètres, alors on obtiendrait du comportement indéfini, ce dont un compilateur peut ou ne peut pas avertir ! Le suivant cause du comportement indéfini et mon compilateur de choix, gcc, n'en avertit pas, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void foo() { }
    int main(void) { foo(1); }
    En bref :
    Une déclaration comme void foo(); sert à exprimer que le nombre de paramètres est inconnu.
    Une définition comme void foo() { } sert à exprimer que le nombre de paramètres est zéro.
    foo(void) effectue la même chose au niveau du compilateur : Non seulement du comportement indéfini, mais une erreur.

  10. #10
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par défaut
    Citation Envoyé par Corluk Voir le message
    En bref :
    Une déclaration comme void foo(); sert à exprimer que le nombre de paramètres est inconnu.
    Une définition comme void foo() { } sert à exprimer que le nombre de paramètres est zéro.
    foo(void) effectue la même chose au niveau du compilateur : Non seulement du comportement indéfini, mais une erreur.
    Je pense que tu ne comprends pas le problème qui est très subtil

    Lorsque tu codes foo(), tu peux appeler cette fonction avec n'importe quel argument foo(array, 5, 97.4f);.
    Alors qu'avec foo(void) tu auras l'erreur "Error: trop d'arguments pour la fonction «*foo*»"

    Le problème est un débordement de pile (cela va dépendre de la convention d'appel, lien wiki en anglais) et tu pourras aller modifier/ dumper/ ... les variables locales (qui sont empilées sur la pile)

  11. #11
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    Lorsque tu codes foo(), tu peux appeler cette fonction avec n'importe quel argument foo(array, 5, 97.4f);.
    Alors qu'avec foo(void) tu auras l'erreur "Error: trop d'arguments pour la fonction «*foo*»"
    Je suis entièrement d'accord avec toi. Mais quoi donc ?

    Le problème est un débordement de pile (cela va dépendre de la convention d'appel, lien wiki en anglais) et tu pourras aller modifier/ dumper/ ... les variables locales (qui sont empilées sur la pile)
    Dans mon post, "le problème" est un bon style de programmation en C. Et pour ça, il faut se conformer au standard.

    Le standard ne connaît pas une pile. Selon le standard, l'implémentation n'est pas requise d'en avoir une. Tu fais toi-même mention des conventions d'appel différentes mais dis en même temps que le "problème est un débordement de pile". Si les arguments ne sont passés qu'en registres, pas de pile, pas de débordement.

    Si l'on programme en C, il s'agit de se conformer au standard. Celui ne connaît que des termes comme "conforming behavior" (comportement conformant), "undefined behavior" (comportement indéfini), etc. C'est à quoi j'adresse ma réponse, rien d'autre.

  12. #12
    Membre actif
    Femme Profil pro
    Enseignant
    Inscrit en
    Août 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 71
    Par défaut
    Bonjour;
    j'ai essailler de créer un prgramme avec une seul procédure qui ne contient aucun paramétres d'entrée, mais le probléme c'est que j'ai une erreur au niveau de l'éxecution:


    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
    void moyenne()
    {
    .....
     
     
    printf("moy=%g",moy);
    return;
     
    }
     
    int main(int argc, char *argv[])
    {
         moyenne;    
      system("PAUSE");	
      return 0;
    }
    }

    [Linker error] undefined reference to `WinMain@16'

  13. #13
    Membre actif
    Femme Profil pro
    Enseignant
    Inscrit en
    Août 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 71
    Par défaut
    merci pour vos aides, j'ai réussi à exécuter le programme, c'été juste une faute de création de projet, merci pour vous tous

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    L'intérêt est tellement nul qu'il en devient négatif...
    Si tu veux une unique fonction dans ton programme, elle existe déjà et s’appelle main
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lynaranya Voir le message
    c'été juste une faute de création de projet
    Ben il n'y en n'a pas qu'une !!!
    1. appel de la fonction "moyenne" sans mettre de parenthèses indiquant l'appel de fonction (ça devient donc une simple adresse, ou mieux un simple nombre, qui est présent sans être traité; exactement comme si tu avais écrit 123;)
    2. une accolade fermante en trop ligne 17
    3. une fonction qui va calculer une moyenne de valeurs qu'elle ne connait pas (conceptuellement )


    Citation Envoyé par Bousk Voir le message
    L'intérêt est tellement nul qu'il en devient négatif...
    Ca c'est de la métaphore !!!

    Citation Envoyé par Bousk Voir le message
    Si tu veux une unique fonction dans ton programme, elle existe déjà et s’appelle main
    Et en plus ça éviterait de passer par des variables globales
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonjour ;
    Citation Envoyé par foetus Voir le message
    Je pense que tu ne comprends pas le problème qui est très subtil

    Lorsque tu codes foo(), tu peux appeler cette fonction avec n'importe quel argument foo(array, 5, 97.4f);.
    Alors qu'avec foo(void) tu auras l'erreur "Error: trop d'arguments pour la fonction «*foo*»"

    Le problème est un débordement de pile (cela va dépendre de la convention d'appel, lien wiki en anglais) et tu pourras aller modifier/ dumper/ ... les variables locales (qui sont empilées sur la pile)
    Attention. Le message d'erreur n'est pas uniquement dans un cas précis et ce n'est pas forcément une question de convention d'appel.

    Pour faire simple les fonctions qui n'acceptent aucun argument doivent explicitement déclarer un paramètre/argument vide donc void foo(void) . Cela est également valable tant pour la déclaration que pour la définition. Plus précisément; dans le cas void foo(void); le compilateur comprend que la fonction ne prend aucun argument/paramètre et donc, si l'on tente de passer un argument (foo(arg) au moment de la compilation il y a erreur; non pas pour dire qu'il y a trop d'argument, mais plus pour dire que la fonction a été déclarer comme étant une fonction n'admettant pas d'argument/paramètre, mais moi compilateur je détecte un argument donc c'est une erreur. Il faut alors clairement annoncer vos intentions.

    Cas contraire, void foo(), le compilateur comprend que cette fonction fournit aucune précision/information sur le nombre ou les types de paramètres/argument. En terme plus clair, c'est une fonction susceptible d'avoir un argument/un certain nombre d'arguments non spécifié. Le compilateur va donc absolument pas vérifier si la fonction est appelée avec des paramètres. Par conséquent, l'appel de fonctions avec des paramètres arbitraires sera accepté sans avertissement au moment de la compilation.

    Dans certains cas (exemple pour moi: Apple clang version 11.0.3) le compilateur émet tout de même un avertissement comme quoi, il y a trop d'argument/ou argument détecté, mais ne abort pas (sauf si par -Werror activé) ce n'est donc, pas que dans un cas précis que vous aurez ce genre de message(ceci dit tout dépend du compilateur a mon avis GCC passera sous silence).

    Citation Envoyé par foetus Voir le message
    Le problème est un débordement de pile (cela va dépendre de la convention d'appel, lien wiki en anglais) et tu pourras aller modifier/ dumper/ ... les variables locales (qui sont empilées sur la pile)

    Attention là aussi; le débordement n'est pas une justification à tout. Un débordement se fait dans un contexte précis et c'est plus une erreur dite de programmation et rarement une erreur de compilations.

    à bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/12/2009, 16h03
  2. [2005] Créer une procédure avec pour paramètre une table
    Par Sergejack dans le forum Contribuez
    Réponses: 2
    Dernier message: 01/10/2009, 14h22
  3. Lancer une procédure avec un paramètre (débutant)
    Par Daniel MOREAU dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 27/10/2006, 15h48
  4. Fonction ou procédure avec paramètres optionnels ?
    Par [Silk] dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2006, 13h55
  5. [VBA-A]procédure avec comme paramètre une propriété
    Par eultartuffe dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/04/2006, 13h49

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