Partage
  • Partager sur Facebook
  • Partager sur Twitter

int main return 0

29 septembre 2022 à 14:49:58

Bonjour,

j'ai créé un tout petit programme en langage c sur le raspberry, ce nano ordinateur travaille sous Linux.

Voici le listing que je crée en faisant :

sudo nano rien.c

int main(){

return 1;

}


Ce programme ne fait rien, mais c'est normal, je ne lui demande rien.


Je le compile avec :


 gcc rien.c -o rien.out 

Jusque-là  tout va bien.

Je l'exécute en faisant :

./rien.out

Voici la réponse.

pi@raspberrypidisquedur:~/langageC $ ./rien.out

pi@raspberrypidisquedur:~/langageC $


La question est la suivante, pourquoi n'ai-je pas eu une message d'erreur puisque j'ai remplacé le return 0 par un return 1?

Comment pourrais-je mettre en évidence qu'il y a bien eu une erreur?

merci de m'éclairer. 

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2022 à 16:21:05

As-tu essayé la fonction exit(1)
 
#include <stdlib.h>
int main(void) {
   exit(1);
}

Ne faut-il pas "tester" le statut retourné après l'exécution?

-
Edité par PierrotLeFou 29 septembre 2022 à 16:26:38

  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

29 septembre 2022 à 16:51:04

Bonjour tente un echo $? après l'exécution de ton programme
  • Partager sur Facebook
  • Partager sur Twitter

yasakani no magatama

29 septembre 2022 à 17:18:24

Il me semble que la valeur de retour est utilisée lorsqu'on appelle le programme dans un script.

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2022 à 17:23:56

Ce que retourne le main, c'est une valeur numérique qui sert généralement à indiquer comment un programme s'est terminé.

On s'en sert la plupart du temps avec

  • 0 si ça s'est bien passé
  • autre chose sinon, avec souvent plusieurs valeurs pour différencier les cas.

Reste à voir ce que ça veut dire.  Si j'écris un jeu, est-ce qu'il doit retourner 0 quand le joueur a perdu ?

Si je lance la commande true, elle retourne 0

$ true
$ echo $?
0

jusque là tout va bien.

Si je lance false, qui existe aussi

$ false
$ echo $?
1

Est-ce que ça veut dire qu'elle s'est mal passée ? non, au contraire. Elle a fait parfaitement son job, qui est de se terminer avec le code de retour 1.

Donc il faut mettre un peu en veilleuse l'interprétation comme quoi ça serait un "code d'erreur".   C'est un "exit code" retourné à la terminaison du programme, point barre.  Ce qu'il signifie, c'est une interprétation qui dépend du programme.

Et c'est pas au shell d'interpréter ce code (en affichant un message d'erreur par exemple) si on ne lui demande pas de le faire.

-
Edité par michelbillaud 29 septembre 2022 à 17:25:12

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2022 à 19:53:44

merci pour vos réponses,

J'ai donc essayé vos suggestions.

exit(1) a l'air de se comporter comme return 1

j'ai essayé écho $?, j'obtiens 1 avec return 1, et 0 pour toutes les autres vareuses (return 0, return 2, return 3 etc.)

J'ai toujours vu dans les différents cours qu'i fallait mettre return 0, mais sans avoir compris vraiment pourquoi "0", le return, oui, c'est normal, le fait d'avoir mis int devant main, signifie que la fonction renvoie un entier.

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2022 à 20:13:00

si tu regardes le prototype de ton main ça reste une fonction comme une autre elle retourne un entier. 

En général le 0 est utilisé pour dire 0 soucis à signaler ( en tous cas je me le suis toujours interprété ainsi)

en fonction de l'interprétation que tu veux en faire 0 faut symboliser une erreur également

Tu peux faire un return 10 si tu veux tant que tu sais pour quoi en faire derrière 

  • Partager sur Facebook
  • Partager sur Twitter

yasakani no magatama

29 septembre 2022 à 20:54:49

Ah, je l'ai retrouvé ! Un petit script qui fait deux choses : compiler mon programme, puis si la compilation s'est bien passée, exécuter le programme.

#!/bin/bash
clear
if cc ac.c config.c carte.c coords.c -o ac -lm
then ac liste.txt
fi


Il y a deux programmes : 'cc' (le compilateur) et 'ac' (mon programme). Si 'cc' retourne un code différent de 0 (la compilation n'a pas réussi), le 'then' ne sera pas exécuté (ni mon programme, du coup). Il me semble que si c'est le retour de mon programme que je testais, ça marcherait pareil (mais je n'ai pas essayé).

Bref, en C le 'main' retourne un entier qu'on n'est pas obligé d'utiliser, mais qui peut servir dans ce genre de contexte.

-
Edité par robun 29 septembre 2022 à 20:55:46

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2022 à 21:02:42 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


29 septembre 2022 à 21:27:01

Bonjour,

Merci de colorer votre code à l'aide du bouton Code

Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

Merci de modifier votre message d'origine en fonction.

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2022 à 23:00:31

Il y a longtemps (sous dos p.ex.), un programme C pouvait renvoyer un exit code, qui était alors interprété par l'appelant. Dans le .bat que je montre, il n'y a que de l'affichage (pas très utile, le programme c aurait pu le faire), mais l'affichage pourrait être remplacé par un appel à un autre programme. Ça s'exécute sous cmd.exe (windows) et les deux programmes (le batch et l'exe du C compilé --- prm.exe dans le cas présent) doivent se trouver dans le même répertoire. Je rappelle que ce n'est qu'un bête exemple. C'est évidemment le .bat qui doit être appelé, avec un paramètre.
#include <ctype.h>

void DoSomething(int a) {
	(void)a;
}


/*
	exit code
		0: *argv[1]>='1' && *(argv[1])<='3'
		1: argc < 2
		2: isdigit(*argv[1]) renvoie false
		3: *argv[1]-'0' est une valeur numérique hors bornes
*/

int main(int argc,char *argv[]) {
	if(argc<2)
		return(1);
	if(!isdigit(*argv[1]))
		return(2);
	if(*argv[1]-'0'<1 || *argv[1]-'0'>3)
		return(3);
	DoSomething(*argv[1]-'0');
	return(0);
	
}
Le .bat
@echo off
prm %1
if errorlevel 3 goto hors_bornes
if errorlevel 2 goto pas_chiffre
if errorlevel 1 goto param_absent
Echo Paramère ok
goto eob
:hors_bornes
echo Valeur hors borne
goto eob
:pas_chiffre
echo Le paramètre n'est pas une valeur numérique
goto eob
:param_absent
echo Paramètre manquant
:eob

-
Edité par edgarjacobs 29 septembre 2022 à 23:03:48

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

30 septembre 2022 à 5:14:58

> return 0 dans main

Il me semble que le standard C dit (ou disait dans une version) que le "return 0" est implicite dans main, ce qui en fait un cas particulier pour le compilateur. Bravo les gars.  Vous comprenez, ça aurait été trop dur d'exiger d'ajouter un return dans le main de chaque programme pour le rendre portable.

Pour rappel, le souci du comité de normalisation  pour les premières versions de la norme, c'était d'autoriser officiellement toutes les idées qui étaient passées par la tête des principaux vendeurs de compilateurs (et par ailleurs membres du comité), y compris quand elles étaient contradictoires.  Par exemple les chars signés ou pas par défaut. Ce qui donne un langage irrémédiablement infesté de comportements indéfinis et/ou laissés dépendants de l'implémentation 

-
Edité par michelbillaud 30 septembre 2022 à 5:19:07

  • Partager sur Facebook
  • Partager sur Twitter
30 septembre 2022 à 8:07:59

Bonjour,

J'ignorais pour le code, voici le programme que j'ai fait grâce aux différentes réponses données ici, et qui est maintenant au point. Il se nomme carre.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

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

double cote;

if (argc !=6){

printf("vous n'êtes pas autorisé à venir ici\n");

}elseif(strcmp("les", argv[1])!=0 || strcmp("framboises",argv[2])!=0 || strcmp("sont", argv[3])!=0  || strcmp("encore", argv[4])!=0 || strcmp("vertes", argv[5])!=0)

{printf("ce n'est pas le bon mot de passe\n");

}

else{

printf("vous allez calculer le périmètre et la surface d'un carré\n\n");

printf("la valeur du côté ");

scanf("%lf", &cote);

printf("le périmètre vaut : %lf \n", 4*cote);

printf("Et la surface vaut : %lf \n", cote*cote);

}

return 0;

}

printf("le périmètre vaut : %lf \n", 4*cote);

printf("Et la surface vaut : %lf \n", cote*cote);

return 0;
}

Ensuite, j'ai créé un makefile contenant l'instruction de compilation suivie de l'exécution.

J'ai lancé make, et là, si je remplace return 0 par return 1 dans carre.c, j'obtiens bien une notification d'erreur, sans empêcher toutefois le programme de se dérouler.

makefile.

carre: 
        gcc carre.c -o carre.out
        ./lancez

puis lancez (contenu ci-dessous), que j'ai rendu exécutable par un chmod -x lancez.

./carre.out les framboises sont encore vertes

Ce programme montre comment nous pouvons utiliser la fonction main en l'appelant avec les paramètres arc et *argh[], et comment nous pouvons récupérer sa valeur avec le return.

Ces explications manquent souvent dans les cours sur le langage C qui traitent de choses plus générales.




-
Edité par michelcapelle 30 septembre 2022 à 20:10:32

  • Partager sur Facebook
  • Partager sur Twitter