Les paramètres de la fonction main ( C )

Fermé
seljazou Messages postés 175 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 25 décembre 2009 - 12 déc. 2009 à 17:47
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 13 déc. 2009 à 19:08
Bonjour,
me voila de retour pour le C, et avec java je ne sais plus où donner la tête :

IL nous a parlé un peu des paramètres de la fonction main, j'ai lu un tutoriel sur le site du zero; les démarches sont claires, mais il y a des choses qui sont restées floues.

1- On a un programme en C contenu dans la fonction main, on va à la console, on tape des trucs et lors de l'execution la dernière ligne de ces "trucs" sont utilisés comme paramètres de la fonction main??? c'est cela le principe?

S'il vous plait donnez moi des exemples de paramètres parce que j'arrive pas imaginer, ils sont des fonctions en eux même?

il y a des fonction definies dans la main qui interpretent ces paramètres???

si vous avez un exemple, je serais ravie.

merci beaucoup


A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
12 déc. 2009 à 19:55
Salut,

Le principe est assez simple.
Pour lancer un programme en console, il te suffit d'appeler le nom du fichier (avec son chemin). Ce qui donne par exemple : C:\toto.exe
Sauf que pour certains programme, il y a besoin d'envoyer des informations à l'exécution du programme. Par exemple : C:\toto.exe coucou Le programme toto.exe pourra avoir accès à la chaîne "coucou".
Techniquement, en C l'en-tête de la fonction main est : int main(void) (sans arguments) ou int main(int argc, char **argv). Lorsque tu vas appeler le programme par C:\toto.exe arg1 arg2 arg3, l'argument argv contiendra le tableau des paramètres. argv[1] donnera arg1, argv[2] arg2, etc. argv[0] contiendra C:\toto.exe (pratique dans certain cas). argc contiendra le nombre d'arguments, pratique pour connaître le dernier élément du tableau.

J'espère avoir été clair. N'hésite pas si tu as des questions.

Cdlt,
2
seljazou Messages postés 175 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 25 décembre 2009 1
13 déc. 2009 à 15:50
merci c'était clair

et tu n'as pas des exemples où on utilise les paramètres de la fonctions main?

connais tu les reponses aux questions que j'ai posées à Pacorabanix en bas de la discussion?

merci
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
12 déc. 2009 à 19:56
et bien c'est un peu ce que tu veux...

En fait, pour te donner un exemple, si tu veux compiler un programme java par exemple, tu dois taper qqchose comme :

javacnomduficheràcompiler.java

Ici, le programme "javac" (un exécutable, compilé, programmé probablement en C ou C++ :P ) a comme "paramètre de ligne de commande" ceci : "nomdufichieràcompiler.java". C'est le système d'exploitation qui garde cette valeur en mémoire pour la donner au programme.

Lorsque tu programmes en java, et que tu lances ton prog via ta console "java nomduprog Blabla", le programme "nomduprog" est appelé, et si ton main es défini comme ça :

int main(String Arguments[])

tu auras que le tableau Arguments possède un élément, et cet élément (Argements[0] ) vaut la chaine "Blabla".

Selon le programme que tu fais c'est pratique. Tu as peut-être envie de faire un programme qui a besoin de quelques valeurs de départ, et en bon "geek" tu veux juste l'appeler en une ligne, tu n'as pas envie que le programme te demandes "entrez votre age", "Entrez votre nom" etc... Tu veux directement écrire java monProg 28 Martin et laisser faire le programme après tout seul comme un grand.

C'est exactement comme quand tu crées une méthode qui a des paramètres. main() est une méthode et a aussi des paramètres. La différence c'est que tes méthodes , c'est toi qui les appelle dans ton code, main() tu ne l'appelles pas toi-même, c'est le système (ou plutot la JVM) qui appelle main pour toi lorsque ton programme est lancé. Et la manière de donner des paramètres à main() c'est par la ligne de commande, quand tu lances ton programme justement.

C'est la même chose en C. (sauf qu'il faut une variable "int nargs" habituellement qui contiendra le nombre de paramètre effectivement reçus, car en C n'a pas moyen de connaitre la taille d'un tableau passé en argument. Cette valeur, c'est le système qui la donnera à ton programme)
1
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
12 déc. 2009 à 20:03
remarque supplémentaire :
les paramètres passés en ligne de commande sont toujours (en C ou en java) des chaines de caractères. Si tu veux des nombres (comme dans mon exemple), c'est à toi de convertir cette chaine en nombre dans main().
0
seljazou Messages postés 175 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 25 décembre 2009 1
13 déc. 2009 à 15:46
merci Pacorabanix,

Je ne savais pas que cela est possible en java aussi :p
et je ne savais pas que ce qu'on entre dans la console est toujours considéré comme une chaine de caractère.

Et pour convertir on met le cast en java? et en C ?

-- sinon je viens de lire un long long long programme qu'on a fait en TP, et voici ce que j'ai compri :

On utilise les paramètres de la fonction main lorsqu'on a un programme à lancer et qui utilise beaucoup de printf et de scanfs ... ( c a d où il y a beaucoup de cas possibles)

Dans le TP, nous devions comparer plusieurs tris, au lieu d'utiliser des printfs et scanfs pour entrer à chaque fois le type de tri, le type d'information à trier, et tout cela compri dans le main, on fait une fonction main qui interprète les argv[i] entrée dans la console, et solon leur valeur elle applique des fonctions definies dans le programme, mais en dehors de la fonction main.

c'est cela le but de cette méthode ?






0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
13 déc. 2009 à 16:35
et je ne savais pas que ce qu'on entre dans la console est toujours considéré comme une chaine de caractère.

oui, je tiens à préciser que je parle bien de la console du système !
(Linux dans ton cas, ou la fenetre DOS pour les utilisateurs de Windows)


Pour te donner un autre exemple d'utilisation des paramètres de ligne de commande sans que tu le remarques: lorsque tu ouvres n'importe quel document (exemple une image), la plupart du temps tu n'as qu'à double-cliquer sur l'icone de ton image et le bon programme que tu utilises s'ouvre comme un grand et charge sans rien te demander l'image sur laquelle tu as double-cliqué. Comment est-ce possible ? Et bien car le programme est prévu pour recevoir des paramètre de ligne de commande !

le système a appelé : TonProgDeDessin lefichiersurlequeltuascliqué.jpg .

Et dans le main() de TonProgDeDessin il y a un code qui vérifie s'il y a un paramètre donné, et si c'est un nom de fichier il essaye de l'ouvrir.


Et pour convertir on met le cast en java? et en C ?


Non. Un cast c'est pour forcer le compilateur à voir des choses d'une certaine manière. Ce genre de cast :
objet (String) -> Type de nombre en java
char* (tableau de char) -> nombre en C
NE peut PAS fonctionner, ou plutot s'il fonctionne il ne va pas du tout te donner un résultat plus ou moins espéré.
Il faut faire une véritable conversion, et il y a des fonctions pour ça.
atoi(chaine) en C (dans je ne sais plus quelle bibliothèque, string.h je crois)
et pour java Integer.parseInt(chaine) je crois




On utilise les paramètres de la fonction main lorsqu'on a un programme à lancer et qui utilise beaucoup de printf et de scanfs ... ( c a d où il y a beaucoup de cas possibles)

Dans le TP, nous devions comparer plusieurs tris, au lieu d'utiliser des printfs et scanfs pour entrer à chaque fois le type de tri, le type d'information à trier, et tout cela compri dans le main, on fait une fonction main qui interprète les argv[i] entrée dans la console, et solon leur valeur elle applique des fonctions definies dans le programme, mais en dehors de la fonction main.

c'est cela le but de cette méthode ?


oui voilà, par exemple. Il y a aussi l'exemple donné plus haut. Un programme de dessin s'ouvre avec un dessin vide, et tu peux aller dans le menu Ouvrir... pour ouvrir une image. Mais tu peux aussi directement appeler le programme de dessin avec le nom de fichier en paramètre pour qu'il l'ouvre tout seul dès le début.

Remarque aussi que certains programmes n'ont ou ne doivent pas avoir d'interface (graphique ou même via la console), par exemple si ce sont des utilitaires que d'autres programmes doivent appeler. Et il ne faut pas que la personne devant l'ordi n'ait à faire quoi que ce soit, sinon ça fait pas pro.

Ex : tu crées un programme qui permet de supprimer un fichier donné en paramètre.

Dans un autre programme de gestion, tu veux de temps en temps faire appel à cette fonction pour supprimer un fichier. Tu n'as qu'à appeler ce programme déjà fait avec un paramètre de ligne de commande. ça permet d'automatiser des utiisations 'autres programmes. C'est très fréquent
0
seljazou Messages postés 175 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 25 décembre 2009 1
13 déc. 2009 à 18:29
compris :)

et tu viens d'eclaircir un mystère pour moi qui date depuis que j'étais petite : comment s'ouvrent les fichier) :p ça m'a toujours fascinée .... ce n'est donc qu'une "simple" fonction main :p ( euh ! :p je sais qu'elle n'est pas simple xd)

sinon, ta réponse me mène à une autre question :s ( y a quelque chose qui tourne pas rond chez moi? parfois je m'inquiète :p)

comme je disais, je suis curieuse de savoir comment se fait la traduction d'un programme en une interface graphique. c a d cliquer sur cette icone permet d'ouvir le fichier. l'autre permet de le modifier ou le supprimer... Je me demande si on utilise des fonctions pour ça .... mais c magique !!! c'est peut être trop te demander :) tu ne peux pas être au courant de tout. Mais ça suscite trop ma curiosité !!!

Sinon, vraiment merci pour tes explications :) je kiffe l'info :D Il me faut juste de la patience !!!
--
Doucement.. mais surement ! 
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660 > seljazou Messages postés 175 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 25 décembre 2009
13 déc. 2009 à 19:08
une interface graphique c'est "juste" un morceau de programme qui gère des affichages. j'ai mis "juste" entre guillemets car tu imagines que c'est pas simple du tout. Ce code doit gérer la création d'une fenêtre, dire ce qu'il y a dedans, a priori dessiner lui-même les boutons, les textes, etc... et "réagir" quand on clique quelque part etc...

En général, l'OS (Windows, MacOS, Linux...) fournissent des fonctions qui s'occupent de tout ça (on appelle ça des API Application Programming Interface), et pour appeler toutes ces fonctions (qui sont passablement compliquées) on utilise d'autres fonctions Java ou C déjà faites et regroupées en des Bibliothèques (dans notre cas, des bibliothèques graphiques, graphic library en anglais).

Et l'OS n'est lui-même qu'un gros programme, ou plutôt plusieurs programmes qui s'occupent de tout ce qui est technique, chargé au démarrage d'un ordi.

La programmation avec des interfaces graphique est vraiment compliquée pour un débutant en Java ou en C, et c'est pour ça qu'elle n'est en principe pas trop abordée au début. Mais je suis sûr que sur le site du Zéro il y a des exemples en Java si tu veux jeter un coup d'œil. Encore une fois, ne t'attends pas à comprendre grand chose là-dedans, il faut plutôt se concentrer à apprendre les bases, c-à-d sans interface graphique, seulement en passant par la console.

D'ailleurs, j'en profite pour faire remarquer que justement la programmation objet simplifie grandement tout ça, car gérer des menus, des boutons, des fenêtres, les types de fichiers, tout ça... et bien c'est un sacré bazar! (tu le constateras peut-être en comparant les codes pour faire une interface graphique en C et en Java.
0