70 votes

Comment puis-je obtenir ce que ma fonction principale est revenue?

Dans un programme C si l'on veut donner une certaine entrée du terminal ensuite, nous pouvons donner par:

int main(int argc, char *argv[])

De la même manière, si nous voulons obtenir la valeur de retour d' main() fonction alors comment pouvons-nous l'obtenir?

Dans chaque main() nous écrire return 1 ou return 0; comment puis-je savoir ce que mon main() a retourné au terminal?

Edit:1

- je l'obtenir que par echo $? , nous pouvons obtenir la valeur de retour de la fonction main() mais elle ne permet que de valeur de retour de moins de 125 (sous linux) avec succès, la valeur de retour plus alors que peut-être pas être bien reçu par $ variable donc

pourquoi le type de retour de main() est de type int ? pourquoi ne pas le garder court int ?

Edit2

d'où je peux finout la signification du code d'erreur si le main() est de retour plus de 125 valeur ?

54voto

Charles Bailey Points 244082

La plupart des shells stockent le code de sortie de la commande précédente dans $? afin que vous puissiez le stocker ou l'afficher.

 $ ./a.out
$ echo $?     # note - after this command $? contains the exit code of echo!
 

ou

 $ ./a.out
$ exit_code=$?    # save the exit code in another shell variable.
 

Notez que sous linux, bien que vous retourniez un int , seules les valeurs inférieures à 126 peuvent être utilisées en toute sécurité. Des valeurs plus élevées sont réservées pour enregistrer d'autres erreurs pouvant survenir lors de la tentative d'exécution d'une commande ou pour enregistrer le signal qui a éventuellement mis fin à votre programme.

40voto

sidyll Points 20176

Votre shell a probablement une variable spéciale $? , qui contient la valeur renvoyée par le dernier programme. Ainsi, peu après la fin de votre programme, vous pouvez exécuter:

 echo $?
 

pour voir la valeur retournée.

32voto

pmg Points 52636

Sous DOS / Windows, vous pouvez utiliser errorlevel dans un fichier batch.

 executable optional arguments
if errorlevel 4 goto LABEL4
if errorlevel 3 goto LABEL3
if errorlevel 2 goto LABEL2
if errorlevel 1 goto LABEL1
:SUCCESS
echo SUCCESS; errorlevel 0
goto :eof
:LABEL1
echo FAILURE; errorlevel 1
goto :eof
:LABEL2
echo FAILURE; errorlevel 2
goto :eof
REM ...
 

Rappelez-vous simplement de vérifier du plus grand au plus bas parce que if errorlevel 42 signifie vraiment "si niveau d'erreur est de 42 ou plus"

5voto

Lars Wirzenius Points 12197

Résumant les commentaires et de morceaux de sorte qu'ils sont dans un seul endroit.

Un programme C a toujours un code de sortie, le programme peut décider pour elle-même si elle se termine normalement, en renvoyant une valeur de l' main fonction ou en appelant l' exit fonction. Si le programme se termine de façon anormale, par exemple par une erreur de segmentation, le système d'exploitation décide le code de sortie.

Dans Unix (Posix), le code de sortie est une valeur sur 8 bits: 0 à 255. Il est combiné avec certains autres métadonnées pour un état: les autres métadonnées comprennent des informations indiquant si le programme est arrêté normalement ou pas, si elle a été annulée en raison d'un signal, et si oui, lequel signal. Pour plus de détails, voir le wait(2) page de manuel.

Dans Unix, à la coquille, le statut de la commande précédente est accessible que l' $? variable spéciale. Parce que le code de sortie est à seulement 8 bits, et il est traité comme un entier non signé, si vous retourner une valeur négative, il est transformé en positif: -1 devient 255. De même, si vous revenez d'une valeur supérieure à 255 le moins significatif de 8 bits sont utilisés: 256 devient 0.

Le type de retour d' main est int, plutôt que d' short ou char, car il n'y a aucun avantage à en faire un type plus petit, surtout à ce stade de l'histoire, des décennies après, il a été décidé. Changer c'est maintenant seulement causer des complications inutiles.

Si vous voulez exécuter un programme à partir de C, la bibliothèque standard fournit l' system fonction main retourne l'état du programme. (À noter qu' system d'exécuter des commandes via le shell, et vous devez être très prudent au sujet d'échapper à tout correctement si vous donnez la commande de l'extérieur, fourni les noms de fichiers ou d'autres choses sur la ligne de commande.)

Pour plus de flexibilité, vous pouvez exécuter d'autres programmes en utilisant le système des appels d' fork, execl (ou une de ses variantes, voir le exec(3) page de manuel), et wait (déjà mentionné ci-dessus). C'est puissant et flexible, mais il est également facile de faire des erreurs, alors assurez-vous de lire la documentation et découvrez quelques exemples de programmes de première. (D'un autre côté, c'est très amusant d'apprendre ce genre de choses.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X