Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/09/2007, à 19:09

Link31

[HOWTO] Script C

N'avez-vous jamais eu envie d'écrire et de lancer des programmes e C aussi facilement que de simples scripts shell ? Eh bien c'est possible wink

Tout d'abord, installez le nécessaire pour développer en C si ce n'est pas déjà fait, à savoir le paquet build-essential.

Puis il vous faut placer ce script dans /usr/local/bin/cscript (gksudo gedit /usr/local/bin/cscript) :

#!/bin/bash
FILENAME=$1

shift

INTERACTIVE=0
WD=$(pwd)

if [ -z $FILENAME ]
then
        FILENAME=$(mktemp)
        cat > $FILENAME
        TEMP=$FILENAME
        INTERACTIVE=1
else
        TEMP=$(mktemp)
fi

PARAMETERS=$(cat $FILENAME | grep '/*CMDLINE=' | awk -F '/*CMDLINE=' '{print $2}' | sed 's/*\///g')
cd $(dirname $FILENAME)

if [ $INTERACTIVE -eq 0 ]
then
        cat "$WD/$FILENAME" | tail -n $(($(wc -l "$WD/$FILENAME" | cut -d" " -f1)-1)) > "$TEMP-src"
else
        cat "$FILENAME" > "$TEMP-src"
fi

cat "$TEMP-src" | gcc -x c -o $TEMP $PARAMETERS - > /dev/null

if [ -f $TEMP ]
then
        if [ -x $TEMP ]
        then
                $TEMP $*
        fi
        rm $TEMP
        rm "$TEMP-src"
fi

cd "$WD"

Pensez à le rendre exécutable :

sudo chmod +x /usr/local/bin/cscript

Maintenant, testez-le :

link31@linux ~ $ cscript
#include <stdio.h>

int main()
{
     printf("hello world!\n");
     return 0;
}
Ctrl+D

Si tout se passe bien, vous devriez obtenir : hello world!

Voilà, vous venez d'exécuter du code C depuis le terminal smile

Ce n'est pas tout, ce script peut aussi servir à lancer des scripts C, de la même façon que n'importe quel script shell.
Enregistrez le code suivant dans ~/scriptc.c

#!/bin/env cscript
/*CMDLINE=-lm*/

#include <stdio.h>
#include <math.h>

void cosinus(float value)
{
    printf("cos(%f)=%f\n", value, cos(value));
}

int main()
{
     cosinus(0.5);
     return 0;
}

Remarquez les deux premières lignes : la première sert à indiquer l'interpréteur (le script cscript donné plus haut), la seconde sert à indiquer les options de compilation (-lm pour les fonctions mathématiques).

Rendez-le exécutable :

cd
chmod +x scriptc.c

Et testez-le :

./scriptc.c

Vous devriez obtenir quelque chose comme : cos(0.500000)=0.877583

On peut indiquer des arguments à passer au programme comme ceci, par exemple :

./scriptc.c --help

Voilà, c'est une petite astuce assez utile pour tester des bouts de code C directement dans le terminal, ou pour écrire des scripts en C quand vous ne savez pas comment faire en shell. De plus, vous n'avez pas besoin de vous rappeler les options de compilation à passer à gcc, et à compiler le fichier à la main, tout est fait de façon transparente.
Avec un PC pas trop vieux et un code pas trop long, la "compilation" du script peut être quasi-instantanée, donc pas de souci de ce côté-là.

J'attends vos commentaires wink

Dernière modification par Link31 (Le 24/09/2007, à 03:33)

Hors ligne

#2 Le 18/09/2007, à 19:18

alexduf

Re : [HOWTO] Script C

whaou !

c'est énorme big_smile

Faudrait l'adapter à java (oui ok je suis java-addict et alors ^^)
je m'y colle pour le fun

[edit]
brève réflexion, en java faut le même nom pour une classe que pour le fichier.java... pas pratique
[/edit]

Dernière modification par alexduf (Le 18/09/2007, à 19:25)

Hors ligne

#3 Le 20/09/2007, à 02:51

Link31

Re : [HOWTO] Script C

up

Y aurait-il si peu de programmeurs C ici ?

Hors ligne

#4 Le 20/09/2007, à 13:58

reeth

Re : [HOWTO] Script C

Bon moi je ne suis pas un spécialiste du C (juste les notions de bases...), alors je ne comprend pas très bien l'intérêt de ton script. Alors pour m'éclairer : quel est l'utilité de celui-ci? Automatiser la compilation?

Je ne comprends pas très bien comment l'utiliser :

reeth@reeth:~$ cscript #include <stdio.h> int main() { printf("hello"); return 0; }
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld a retourné 1 code d'état d'exécution

Bref un peu plus d'explications seraient bienvenues smile

Merci

Hors ligne

#5 Le 20/09/2007, à 16:08

alexduf

Re : [HOWTO] Script C

L'intérêt c'est de pouvoir utiliser un langage compilé (le C) comme si c'était un langage interprété (comme le bash).


Link31 a écrit :

Y aurait-il si peu de programmeurs C ici ?

tu as posté ca dans la section "astuces" wink
Tu aurais eu plus de succès dans la section dev

Hors ligne

#6 Le 20/09/2007, à 18:16

Link31

Re : [HOWTO] Script C

alexduf a écrit :

L'intérêt c'est de pouvoir utiliser un langage compilé (le C) comme si c'était un langage interprété (comme le bash).

Exactement.

@reeth : il faut faire comme dans mon exemple : taper cscript, puis entrée pour lancer la commande. Ensuite il faut taper ton code (attention, tu ne peux pas revenir à une ligne précédente), et confirmer avec Ctrl+D. Le programme se compile et se lance automatiquement.

Tu peux aussi l'utiliser en mode non-interactif (script), en t'inspirant de mon script exemple (le plus important est de ne pas oublier la première ligne -celle avec #!- et de ne pas oublier de rendre exécutable le script).

Hors ligne

#7 Le 20/09/2007, à 18:56

scholi

Re : [HOWTO] Script C

heu c'est rigolo est geek, mais entre nous c'est pas super pratique wink
En effet, pour des petits scriptes, phython ou bash suffisent largement et donne des code plus léger, alors que le C  est utiliser pour des "gros" programmes. Donc si chaque fois que tu fais ./source.c il faut attendre 30 secondes qu'il compile avant de s'exécuter, c'est pas top. De plus avec un makefile, le problème est résolu, il suffit de faire make et tout est ok. Si tu incorpore le ./nom_du_prog à la fin du makefile, il se lance aussi tout seul!


S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

Hors ligne

#8 Le 20/09/2007, à 19:02

Link31

Re : [HOWTO] Script C

scholi a écrit :

Donc si chaque fois que tu fais ./source.c il faut attendre 30 secondes qu'il compile avant de s'exécuter, c'est pas top.

30 secondes ? Trouve-moi un fichier .c qui se compile en 30 secondes de nos jours ? lol

link31@linux ~/scripts $ wc -l prog.c
683 prog.c
link31@linux ~/scripts $ time ./prog.c  # à froid
[...]

real    0m0.600s
user    0m0.060s
sys     0m0.028s
link31@linux ~/scripts $ time ./prog.c  # à chaud
[...]

real    0m0.083s
user    0m0.064s
sys     0m0.021s

Donc : moins d'une seconde à froid (chargement de gcc, etc...) et moins de deux dixièmes de secondes à chaud. Ce qui peut largement compenser la lenteur d'exécution d'un script bash sur des traitements lourds.

scholi a écrit :

De plus avec un makefile, le problème est résolu, il suffit de faire make et tout est ok. Si tu incorpore le ./nom_du_prog à la fin du makefile, il se lance aussi tout seul!

Oui mais tu ne peux pas lui spécifier des arguments aussi facilement, et ce n'est pas aussi pratique à lancer depuis un script externe. Là, les options de compilation sont directement stockées dans le source, il n'y a qu'un fichier, et non pas 3 (source, Makefile, exécutable) dans le cas de make.

En plus, avec make tu ne peux pas écrire du code directement dans le terminal.

Dernière modification par Link31 (Le 20/09/2007, à 19:07)

Hors ligne

#9 Le 20/09/2007, à 19:35

reeth

Re : [HOWTO] Script C

Ok sa marche chez moi. Donc en fait le but est de rendre transparent la compilation. C'est assez sympa. Je verrais si je fait un peu de C cette année (scolaire), je testerai plus en profondeur le truc wink

Hors ligne