fonction en c

Le
rico34
Bonjour,

J'ai écrit plusieurs fonctions en c. Je souhaite les appeler depuis un shell
(pour eviter de les ecrire de nouveau en shell unix).
Par exemple, j'ai une fonction calcul_jour en fonction du mois

calcul_jour (1) retourne 31


calcul_jour (11) retourne 30
calcul_jour (12) retourne 31

Je sais, cette fonction peut-être facilement réalisée en shell, mais je veux
éviter d'écrire de nouveau toutes les fonctions en c.

J'ai compilé un programme en c "mon_programme.c" où les fonctions sont
définies . Je lance depuis mon shell la commande suivante.

./mon_programme/calcul_jour(12) évidemment ne fonctionne pas.

Est ce qu'il y a une méthode simple pour appeler une fonction c depuis un
shell.

Merci pour vos réponses.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Eric Levenez
Le #772619
Le 4/10/07 6:28, dans « rico34 »
Est ce qu'il y a une méthode simple pour appeler une fonction c depuis un
shell.


Dans le programme C, il faut une fonction main qui analyse argc et argv pour
trouver le ou les arguments (genre "12). Les arguments doivent ensuite être
convertis en nombre et passés en argument à la fonction cible.

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.

Mihamina Rakotomandimby
Le #772618
Eric Levenez wrote:
Est ce qu'il y a une méthode simple pour appeler une fonction c depuis un
shell.
Dans le programme C, il faut une fonction main qui analyse argc et argv pour

trouver le ou les arguments (genre "12). Les arguments doivent ensuite être
convertis en nombre et passés en argument à la fonction cible.


Pour aller plus loin dans l'explication sans trop pousser la technique:

- l'appel à la fonction sera plutot de la forme:
$ ./mon_programme/fonction 12

- le "31" resultant doit (devrait?) etre issu d'un printf() ou autre
truc pour ecrire sur stdout.

Question hors charte: en C, y a quoi et quoi qui ecrit sur le stdout?


Marc Boyer
Le #772617
On 2007-10-04, rico34
J'ai écrit plusieurs fonctions en c. Je souhaite les appeler depuis un shell
(pour eviter de les ecrire de nouveau en shell unix).
Par exemple, j'ai une fonction calcul_jour en fonction du mois

calcul_jour (1) retourne 31
...

calcul_jour (11) retourne 30
calcul_jour (12) retourne 31

Je sais, cette fonction peut-être facilement réalisée en shell, mais je veux
éviter d'écrire de nouveau toutes les fonctions en c.

J'ai compilé un programme en c "mon_programme.c" où les fonctions sont
définies . Je lance depuis mon shell la commande suivante.

./mon_programme/calcul_jour(12) évidemment ne fonctionne pas.


On ne peut, depuis le shell, pas appeller les fonctions
individuellement. Le shell ne peut appeller qu'une seule fonction,
int main(int argc, char* argv[]);
et c'est au code dans le main d'appeller la bonne fonction, en lui
passant les bons paramêtres.

Suposons que tu ais deux fonctions C.
int calcul_jour(int num_mois);
bool bissextile(int annee);
il faut les mettre dans un couple .h/.c et écrire deux fichiers
--- calcul_jour.c ---
#include "ton_module.h"
#include #include int main(int argc, char* argv[]){
if (argc != 2){
/* Afficher un message d'erreur */
} else {
// On tente de convertie argv[1] en entier
int mois;
int scan_res= sscanf(argv[1],"%d", &mois);
if (scan_res != 1 ){
fprintf(stderr, "Erreur de saisie, impossible de convertir '%s' en entiern", argv[1]);
return EXIT_FAILURE;
} else {
// C'est un nombre
if (mois <= 0 || mois > 12)
fprintf(stderr, "Erreur de saisie: veuillez donner un numero de moisn");
return EXIT_FAILURE;
} else {
printf("%d", calcul_jour(mois);
return EXIT_SUCCESS;
}
}
}

Et le même genre pour bissextile.c

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

Stephane Chazelas
Le #772616
2007-10-04, 09:21(+02), Mihamina Rakotomandimby:
Eric Levenez wrote:
Est ce qu'il y a une méthode simple pour appeler une fonction c depuis un
shell.
Dans le programme C, il faut une fonction main qui analyse argc et argv pour

trouver le ou les arguments (genre "12). Les arguments doivent ensuite être
convertis en nombre et passés en argument à la fonction cible.


Pour aller plus loin dans l'explication sans trop pousser la technique:

- l'appel à la fonction sera plutot de la forme:
$ ./mon_programme/fonction 12

- le "31" resultant doit (devrait?) etre issu d'un printf() ou autre
truc pour ecrire sur stdout.

Question hors charte: en C, y a quoi et quoi qui ecrit sur le stdout?


L'appel systeme est write(2). Tout ce qui peut faire un write(2)
sur le file descriptor 1 peut ecrire sur stdout. Maintenant, si
stdout est une socket, on peut aussi potentiellement faire un
send(2) ou sendmsg(2) ou sendto(2) qui peuvent aussi etre
considerees comme "ecrire". Mais write() marchera aussi sur une
socket, alors que send(2) ne fonctionne pas sur tous les types
de /fichier/.

Les fonctions de stdio (fputs, puts, putc, putchar, printf,
fprintf...) *peuvent* faire appel a write(). Elles assurent la
bufferisation (c'est a dire seulement un appel a ses fonctions,
de temps en temps fera finalement appel a write(2) pour
/flush/er un buffer interne).

Hormis stdio, dans d'autre bibliotheques tu peux avoir d'autres
fonctions qui pourront ecrire sur stdout (p.e. ncurses,
glib...), mais elles feront tout comme stdio appel a write(2).

--
Stéphane



Thierry B.
Le #772321
--{ Mihamina Rakotomandimby a plopé ceci: }--

Dans le programme C, il faut une fonction main qui analyse argc et argv pour
trouver le ou les arguments (genre "12). Les arguments doivent ensuite être
convertis en nombre et passés en argument à la fonction cible.



- l'appel à la fonction sera plutot de la forme:
$ ./mon_programme/fonction 12

C'est quoi ton Unixoïde ? Un plan9 customisé ?


Question hors charte: en C, y a quoi et quoi qui ecrit sur le stdout?


:/d2b/tth/Devel/TX81Z$ man stdout
Reformatting stdout(3), please wait...



--
Por faire un "" je tape "c: windows" dans google puis un
copier-coller sur les resultat.J'aime les macs


Publicité
Poster une réponse
Anonyme