Insérer du code shell dans un programme C ou C++ et vis versa

Résolu/Fermé
hymenoptera Messages postés 36 Date d'inscription mercredi 24 août 2016 Statut Membre Dernière intervention 18 décembre 2018 - 24 août 2016 à 11:56
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 25 août 2016 à 10:41
Bonjour,

Je lance un script shell pour récupérer des informations sur une application (perf stat -e instructions,r12E etc...).

je stock ces informations dans des variables shell et souhaite utiliser ces variables pour faire un calcul (soit en C, C++, Fortran, Python ou n'importe...)

Ma question : Comment faire pour récupérer les variables d'un script shell et les utiliser dans un programme C sachant que je lance la commande "perf stat" dans une boucle. C'est à dire qu'à chaque fois que je récupère des infos je fais le calcul en C (ou autre) et j'affiche le résultat en temps réel.

Sinon avez-vous une meilleur façon de faire?

Merci bien

A voir également:

1 réponse

hymenoptera Messages postés 36 Date d'inscription mercredi 24 août 2016 Statut Membre Dernière intervention 18 décembre 2018 1
24 août 2016 à 15:08
C'est bon j'ai trouvé, pour ceux que ça intéresse je vais poster la solution que je cherchais :

il faut inclure <cstdlib> pour le C++ ou <stdlib.h> pour le C

utiliser
main (int argc, char ** argv) 

au lieu du simple
main()


déclarer mes arguments (ici j'ai déclaré 2 arguments):

int arg1= atoi(argv[1]);
int arg2= atoi(argv[2]);


exécuter mon programme en passant les deux variables, que je récupère du script, comme arguments :


g++ mon_programme.C
./a.out $VARIABLE1 $VARIABLE2


arg1 sera égale à $VARIABLE1 que j'ai récupéré de mon script, pareil pour arg2 qui sera égale à $VARIABLE2

y a plus qu'à exécuter mon programme dans la boucle de mon script comme ceci :


#! /bin/bash
VARIABLE1=1
VARIANLE2=2

g++ mon_programme.C
for i in $(seq 1 50) ; do
perf stat -e instructions mon_application
./a.out $VARIABLE1 $VARIABLE2
done


Bonne journée à tous :)
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
24 août 2016 à 18:31
Bonjour,

Pour info, en C, atoi() est obsolète. Il vaut mieux utiliser strtol().
En C++, on utilise plutôt les méthodes de la classe String.

Tu peux même tester la date de ton fichier mon_programme.C par rapport au a.out pour éviter une recompilation inutile. Et au cas où, tu peux mettre -o nomProgramme dans g++ pour mettre un vrai nom de programme (plutôt que a.out).
0
hymenoptera Messages postés 36 Date d'inscription mercredi 24 août 2016 Statut Membre Dernière intervention 18 décembre 2018 1 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
24 août 2016 à 23:42
Bonjour,

Merci d'avoir pris le temps de répondre.

Il me semble que strtol est utilisé pour les types "long int" même chose pour "atol", alors que "atoi" c'est pour les simples int. Dans un programme assez gourmand en memoir ce n'est pas négligeable.

C'est intéressant de tester la compilation avec la date, je vais voir comment on peut faire ça. Merci pour le tuyau ;)

Même dans un exemple ce fameux "a.out" fait encore parler de lui
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > hymenoptera Messages postés 36 Date d'inscription mercredi 24 août 2016 Statut Membre Dernière intervention 18 décembre 2018
25 août 2016 à 10:41
Il me semble que strtol est utilisé pour les types "long int" même chose pour "atol", alors que "atoi" c'est pour les simples int.
Sauf que atoi() est obsolète...
De plus, ce n'est pas parce qu'il est utilisé pour les long que cela ne fonctionne pas avec les int.
Et enfin, la taille d'un long int et d'un int est la même sur pas mal de plateforme :-).

Pour le test, tu peux regarder du côté de makefile. Ca nécessitera la création d'un fichier supplémentaire (contenant 2 lignes). N'hésite pas si tu veux plus de précision.
0