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 :

sur la declaration de la methode void main()


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 75
    Points : 39
    Points
    39
    Par défaut sur la declaration de la methode void main()
    salut a tous pourquoi on commence toujour avec ce si
    static void main( args[]
    pourais quelqun mexpliqer ça en detail svp et merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 37
    Points : 46
    Points
    46
    Par défaut
    Il faut bien que quand tu executes un programme, le système sache par où commencer. Il lui faut donc un point d'entrée identifiable et c'est la fonction main. C'est la 1ere fonction de ton programme qui sera executée.
    A noter que si tu programmes sous windows, ça peut aussi bien etre winmain ou autre, mais il y a toujours une fonction de ce genre quelque soit le language.

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    C'est très etrange.

    On m'a appris que le programme commence toujours par la fonction main. Cela est vrai. Mais on m'a aussi appris que main retourne l'etat final de l'execution.

    Par consequent, main ne renvoid pas un void mais un int.

    Normalement, un programme a toujours une fonction de la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int main( int argc, char** argv )
    Apres, je ne sais pas tout et il est possible qu'il existe d'autre forme. Notamment en C++, il existe :

    Mais ce sont les deux seul forme que je connaisse

  4. #4
    Membre averti Avatar de Dalini71
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 181
    Points : 343
    Points
    343
    Par défaut
    En fait il y a des langages où la fonction main ne renvoie rien, c'est à dire "void", tel que le langage Java.

    Pourquoi en Java ça renvoie void et en C++ ça renvoie int ?

    Je laisse un Java-man te répondre pour le Java, mais pour le C++, la fonction main renvoie une valeur de type entier : 0 si tout va bien, toute autre valeur si pépin il y a eu.

    Sinon pour l'OP, comme on te l'a dit, la fonction main est le point de départ de tout programme, c'est la première fonction qui sera exécutée.

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    argc/argv permet de récupérer les arguments. Si on sait qu'on n'aura pas à les récupérer alors autant écrire main sans arguments.
    Sinon en effet la norme précise bien que main doit être de type int et non void. (même si certains compilo laisse passez ça.)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pourquoi en Java ça renvoie void et en C++ ça renvoie int ?
    Java est un langage full-object : on ne manipule pas des applications au sens C++ mais des classes "exécutables" par la machine virtuelle.
    C'est à cette dernière qu'incombe la tâche d'interfaçage avec le système, et notamment l'envoi des codes d'erreur.
    Une classe exécutable peut utiliser la méthode "System.exit(code)" pour indiquer à la JVM de renvoyer un code donné.

    C# quant à lui accepte les deux versions du "Main" :
    et :
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 75
    Points : 39
    Points
    39
    Par défaut sur l'utilite de main et void
    alors main joue le role de begin en pascal
    et ma question a quoi ça sert main et void es c'est obligatoire

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par ertyup Voir le message
    alors main joue le role de begin en pascal
    et ma question a quoi ça sert main et void es c'est obligatoire
    Effectivement, on pourrait tout a fait assimiler main a la fonction entre BEGIN et END. ( et non BEGIN - END; qui definie juste une fonction )

    A quoi main sert-il ??
    Tout simplement a definir le point de depart. Imagine que tu ai 115 fonction, comment sais-tu laquelle doit etre executer en premier ? C'est la fonction main et aucune autre.

    Void est-il obligatoire ?
    Non, il est meme fortement deconseiller dans la mesure ou on souhaite, en C++, savoir le resultat final de notre programme. main retourne donc un int, et ce retour a une convention : 0 veut dire "tout c'est bien passer, il n'y a pas eu de probleme", tout les autre chiffre veulent dire le contraire.

  9. #9
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    C'est pas fortement déconseillé c'est interdit. Et tout bon compilo bien réglé te sortira une erreur voir à la limite un warning.
    (j'ai pas la norme sous les yeux mais la faq de clc++ fera foi) :
    http://www.parashift.com/c++-faq-lit....html#faq-29.3
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  10. #10
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 75
    Points : 39
    Points
    39
    Par défaut sur main void
    merci bcp pour les repenses alors void est indesiré en c++ je sais que je suis sortie du forum mais (void) est obligatoire en java contrairement au c++ ?
    merci

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Attention entendons nous bien, je dis que void n'est pas standard pour la fonction main hein! Pour les autres ça n'a rien a voir.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Je rejoins exactement le même commentaire que Goten.

    Depuis le début, nous ne parlons exclusivement que de la fonction Main.
    De plus, nous parlons de la syntaxe de Main dans le langage C++ ( et non Java, Pascal .... ).

    En C++, la fonction main est la fonction de depart.
    Cette fonction renvoit obligatoirement l'etat final sous forme de int.

    Les deux seul syntaxe exacte que je connaisse sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int main( int argc, char** argv )
    int main()
    Tout autre forme de main est, a ma connaissance, fausse et érroné.

    Désolé si j'ai l'air de rabacher, mais au vu des question ambigue, il faut vraiment mettre les points sur les i.

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Les deux seul syntaxe exacte que je connaisse sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int main( int argc, char** argv )
    int main()
    Tout autre forme de main est, a ma connaissance, fausse et érroné.
    Pas exactement. Toutes les formes de main doivent retourner int. Les deux formes que tu as citées sont obligatoire (sauf pour une implémentation freestanding, mais là c'est du chipotage à l'intérieur du chipotage que constitue déjà mon intervention). Mais il est autorisé pour une implémentation de définir d'autres formes (on peut imaginer une forme avec wchar_t pour argv, par exemple, ou une forme avec un argument supplémentaire pour transmettre des variables d'environnement).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  14. #14
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Personne pour dire que la première fonction exécutée n'est pas main mais _start qui appelle main ? Et que bien sur avec je sais plus quelle option de gcc on peut changer ça.
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Non, personne, car ce comportement n'a rien de standard, ni de portable
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Et même si c'était standard ça serait complètement inutile dans le cas qui nous occupe, nous sommes d'accord
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  17. #17
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    De l'importance du int main(void) :
    Citation Envoyé par interview de Jess Heinig, programmeur sur Fallout 1
    2. How did someone like YOU start working on Fallout?

    [...]

    I wrote a short character
    generation program in C++ and showed it to Tim Cain (the project
    developer).

    I correctly declared int main(void) instead of void main(void) in my main
    function. I got a job.

  18. #18
    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
    @JolyLoic, @Mérovingien: D'ailleurs, c'est faux sous Windows, où la première fonction d'un exécutable C/C++ à être appelée est mainCRTStartup() (pour un programme console) ou WinMainCRTStartup() (pour un programme fenêtré). Et encore, le "point d'entrée" d'un exécutable peut en fait être n'importe quelle fonction int(void): Il s'agit juste des réglages par défaut de l'édition de liens.

    ...Et ce fameux point d'entrée est appelé par la fonction BaseProcessStart() de kernel32.dll; c'est la première fonction user-mode du programme.
    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.

  19. #19
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    @Médinoc : oui, c'est ce que disait JolyLoic, ce n'est pas standard, et on peut le changer . Le principal étant que tout le monde est bien compris que pour être standard, il faut utiliser une des deux formes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int main( int argc, char** argv )
    int main(void)
    Par contre, y'a t'il une différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main( int argc, char** argv)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main( int argc, char* argv[])
    Parce que parfois je vois l'un, parfois je vois l'autre. Quelqu'un sait ce que la norme stipule ou bien celà n'a t'il pas d'importance ?
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  20. #20
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f(TYPE * t)
    f(TYPE t[])
    f(TYPE t[N])
    C'est la même chose. Un tableau n'est jamais copié par une fonction. Pour passer un tableau à une fonction, il faut passer une adresse. C'est imposé par le langage.

Discussions similaires

  1. Methode public static void main (String [] args)
    Par jeremypd dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 09/01/2017, 10h53
  2. [C#] Comment sortir d'une méthode void ?
    Par dcollart dans le forum C#
    Réponses: 4
    Dernier message: 14/09/2010, 14h58
  3. methodes dans "void main"
    Par kevinou55 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 06/10/2008, 18h49
  4. Code de retour d'un void main
    Par stof dans le forum Visual C++
    Réponses: 6
    Dernier message: 19/04/2007, 12h38
  5. [Débutant]#entre int main & void main
    Par Binga dans le forum C
    Réponses: 9
    Dernier message: 10/08/2004, 15h54

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