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 :

retour fonction main()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Par défaut retour fonction main()
    Bonjour,

    Je souhaiterai savoir s'il était possible de faire retourner à la fonction main une valeur de type char * (pour le récupérer dans un batch par exemple ?

    Par exemple le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* main(int argc, char* argv[])
    {
    	return argv[1];
    }
    me donne :

    Nom : Capture.JPG
Affichages : 1837
Taille : 13,0 Ko

    Merci !

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Non.
    main() ne peut retourner qu'un entier, qui est un code d'erreur que le programme peut émettre au système l'appelant.

    en général, les "retours utiles" sont fait sur la sortie standard.

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Non, main doit retourner une valeur de type int. Mais tu peux envoyer ce que tu désires dans le flux de sortie standard.

    Code hello.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    int main(int argc, char *argv[]) {
        if (argc < 2)
            return 1;
     
        fprintf(stdout, "I say: \"%s\"\n", argv[1]);
        return 0;
    }

    Code coucou.bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @echo off
    for /f "tokens=*" %%a in ('hello.exe ^"Hello, world!^"') do set message=%%a
    echo He says: "%message%"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    D:\> cl.exe /Tc hello.c
    D:\> coucou.bat
    He says: "I say: "Hello world!""
     
    D:\>


    EDIT: grillé par ternel.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Par défaut
    Un grand merci !

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par betedesvosges Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* main(int argc, char* argv[])
    {
    	return argv[1];
    }
    Draft de C11 (N1570) (ISO/IEC 9899:201x) : 5.1.2.2.3 :
    « If the return type of the main function is a type compatible with int, a return from the
    initial call to the main function is equivalent to calling the exit function with the value
    returned by the main function as its argument; reaching the } that terminates the
    main function returns a value of 0. If the return type is not compatible with int, the
    termination status returned to the host environment is unspecified. »

    Du coup, la valeur que ton programme retourne à ton script est (int) argv[1], c'est à dire l'adresse sous forme d'entier du premier caractère de argv[1].

  6. #6
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    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 : 548
    Par défaut
    Bonsoir,
    Je pense qu'il faut préciser certaine choses. La valeur de retour que main renvoie est une valeur de sortie qui informe le système d’exploitation de la façon dont le processus s’est terminé (informe le processus parent qui est la Shell). Plus précisément, lorsque vous sollicitez return exit en sortie normale (c’est-à-dire que tout c’est bien passé), vous inscrivez l’événement ainsi que le code de sortie dans la tableau de processus du noyau Linux. Cette table sera interrogée (appel des fonctions wait et waitpid) par le noyau sous la demande du processus parent pour connaître l’état de terminaison du programme. Le code de sortie du programme sera alors mis dans une variable du Shell à disposition.

    Sous le système Linux ou Unix, les valeurs de retour du main tiennent tous sans exception sur 8bits (0-255 inclus donc 1 octet), et si votre programme renvoie la valeur -1(par exemple), le Shell lit la valeur 255 car -1 est tronqué aux bits le moins significatifs et le renvoie en tant que octet non signé. Cela est fait exprès pour que la valeur de renvoie soit différente de 0 ( 0 qui veut dire tout c’est bien passé).
    Un programme sous Linux où Unix termine donc toujours avec une valeur 0, dans le cas contraire, une valeur différente de zéro indique l’erreur qui s’est produite. Ces différentes erreur correspond à une plage d’erreurs Linux définie dans l’entête "errno.h" et qui tient dans 1 octet (0-255). Des codes de retour différents dits/appeler "code retours personnalisés" sont souvent utilisés à des fins de test ou autre et ce à des buts bien définis. Tout de même les valeurs de retours supérieur a 255 seront systématiquement tronqué voir exemple ci-dessous.

    Il ne faut pas penser que int devant la fonction main permet ou vous permet de renvoyer une valeur de retour sur 32 bits c'est totalement faux. Sous Linux où Unix les valeurs de retours doivent toujours tenir dans 1 octet d'ailleurs si vous essayez avec les valeurs supérieur à 255 elles seront toutes tronquées.

    Attention les codes sources ci-dessous sont susceptibles de comporter des erreurs:
    Pour voir le code retour du programme saisissez :echo $? ou tout en un faire: gcc source.c -Wall -Werror -g -o Debug && ./Deb && echo $?
    Code C : 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
     
    /*
     ============================================================================
     Name        : source.c
     Author      : SAMBIA39
     Version     : 0.1
     Copyright   : Copyright (c) 09/3/2017 SAMBIA39
     Description : Ansi-style
     ============================================================================
     */
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
        fprintf( stdout, "Test-1\n" );
        return (-1);
    }

    Code C : 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
     
    /*
     ============================================================================
     Name        : source.c
     Author      : SAMBIA39
     Version     : 0.1
     Copyright   : Copyright (c) 09/3/2017 SAMBIA39
     Description : Ansi-style
     ============================================================================
     */
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
        fprintf( stdout, "Test-2\n" );
        return (444);
    }

    Code C : 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
     
    /*
     ============================================================================
     Name        : source.c
     Author      : SAMBIA39
     Version     : 0.1
     Copyright   : Copyright (c) 09/3/2017 SAMBIA39
     Description : Ansi-style
     ============================================================================
     */
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
        fprintf( stdout, "Test-3\n" );
        exit (1000);
    }

    Code C : 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
     
    /*
     ============================================================================
     Name        : source.c
     Author      : SAMBIA39
     Version     : 0.1
     Copyright   : Copyright (c) 09/3/2017 SAMBIA39
     Description : Ansi-style
     ============================================================================
     */
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
        fprintf( stdout, "Test-4\n" );
        return (2);
    }

    Code C : 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
     
    /*
     ============================================================================
     Name        : source.c
     Author      : SAMBIA39
     Version     : 0.1
     Copyright   : Copyright (c) 09/3/2017 SAMBIA39
     Description : Ansi-style
     ============================================================================
     */
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
        fprintf( stdout, "Test-5\n" );
        return (0);
    }

    A bientôt

Discussions similaires

  1. fonction main en C++
    Par steph_nied dans le forum C++
    Réponses: 3
    Dernier message: 26/05/2006, 15h03
  2. arguments dans ma fonction main
    Par salseropom dans le forum C
    Réponses: 10
    Dernier message: 15/03/2006, 23h12
  3. la fonction main
    Par harvouj dans le forum Langage
    Réponses: 1
    Dernier message: 13/02/2006, 01h34
  4. Retour fonction
    Par Mookie dans le forum C++
    Réponses: 13
    Dernier message: 12/01/2005, 11h43
  5. Retour fonction
    Par Heaven dans le forum C
    Réponses: 4
    Dernier message: 09/01/2004, 20h17

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