Appel du programme externe [Fermé]

Signaler
-
Messages postés
5579
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
22 juin 2021
-
Bonjour,
mon premier programme A (appeler coefficient MRS) qui permet de calculer les coefficients MRS d'un tableau x dans une base:
#include<stdio.h>
#include <stdlib.h>
# include <math.h>
#include <malloc.h>
void tab (int *tab2, int nb)    /*procédure pour saisir un tableau */
{
   int i;
   for (i = 1; i <= nb; i++)
   {printf ("entrer l’élément numéro \n  ", tab2[i]);
      scanf ("%d", &tab2[i]);
   }
}
int main( )
{int n,nb,i,j,B[4],x[4],t[4],v[4],h[6];

int m[3][4] = { {0,2,5,4 }, {0,0,3,9 },{0,0,0,8} };

 printf("entrer le nombre des éléments \n ");
   scanf("%d",&nb);
    tab(B,nb);/*saisir un premier tableau*/
    
    printf("entrer le nombre des éléments \n ");
   scanf("%d",&n);/*saisir un deuxième tableau*/ 
 tab(x,n);
 
 for (i=1;i<=n;i++)
 {
 t[i]=x[i];
 printf("%d\n",t[i]);/* on met les valeurs du deuxième tableau dans t[i]*/
 }
 v[1]=t[1];
 printf("la première sorite est %d \n",v[1]);/*la première sortie égal à t[1]*/
 for (i=2;i<=n;i++)
 {
  
 for(j=i;j<=n;j++)
 {
 t[j]=((t[j]-t[i-1])*m[i-1][j])%B[j];
    }
     if(t[i]<0)
 {abs (t[i]);}
 printf("la sortie est  %d \n",t[i]);/* afficher t2,t3 et t4 */
 
 }
}
maintenant je veut insérer ce programme A dans un second programme B pour faire la conversion d'un nombre x qui s'écrit sous la forme d'un tableau d'une première base vers une seconde base 
#include <stdlib.h> 
# include <math.h> 
void tableau (int *tab2, int n) 
{ 
int i; 
printf("entrer le nombre des éléments \n ",n); 
scanf("%d",&n); 
for (i = 1; i <= n; i++) 
{printf (" entrer l’élément \n ", tableau 2[i]); 
scanf ("%d", &tableau 2[i]); 
} 
}
int main ()
{int i,j,n,l,t[4],b[4],b 1[3],x[4],f[4],u[4];
printf("entrer le nombre des éléments de la première base\n ",n);/*saisir d'un premier tableau qui est notre première  base */
   scanf("%d",&n);
    tableau(b,n);
    printf("entrer le nombre des éléments de la deuxième base \n ",l);/*saisir d'un premier tableau qui est notre deuxième  base */
   scanf("%d",&l);
    tableau(b 1,l);

   printf("entrer le nombre des éléments de x \n ",n);/*saisir notre nombre x*/
 scanf("%d\n",&n);   
tableau(x,n);
u[i]=  popen("coefficient MRS(b,x)");/*appel du programme coefficient MRS(programme A)*/
 printf("%d \n",u[i]); 
 for(i=1;i<=l;i++)
 {f[i]=u[n];
 }
 for (i=1;i<=l;i++)
 {for(j=(n-1);i>=1;i--)
 {
  f[i]=((f[i]*b[j]+u[j]))% b 1[i];
 }
 printf("le x' est ",f[i]);
 }
}

est ce que l'appel du mon premier programme est juste ou non ?


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

1 réponse

Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
22
Propotype de la fonction popen(), de la norme POSIX :
FILE *popen(const char *command, const char *type);


Donc, ce qui ne va pas :
1. Selon ta "Configuration", tu es sous Windows, qui ne respecte pas la norme POSIX. Il est donc probable que la fonction n'existe pas.
2. La fonction prend deux arguments, or tu n'en passes qu'un.
3. Le premier argument doit être la commande à exécuter. Si tu veux executer le programme "coefficient MRS" avec les arguments b et x, ce sera : "./'coefficient MRS' valeur_de_b valeur_de_x"
4. Si tu mets les lettres b et x dans une chaine de caractères, ce seront les lettres b et x. Évidemment, elles ne seront pas traduites par leurs valeurs s'il s'agit de variables. Du coup, pour obtenir la commande, il faut utiliser une fonction comme sprintf() de <string.h> :
char command[500];
sprintf(command, "./'coefficient MRS' %d %d", b, x);

5. Le deuxième argument doit être soit "w" si tu veux écrire dans le file descriptor (c'est-à-dire, si tu veux écrire dans l'entrée standard du programme, c'est ce que tu récupéres quand tu fais par exemple un "scanf"), soit "r" si tu veux lire dans le file descriptor (c'est-à-dire, si tu veux lire dans la sortie standard, c'est ce qui s'affiche quand tu fais par exemple un "printf"). Comme visiblement tu veux lire sur la sortie, tu passeras "r" comme deuxième argument.
6. La fonction retourne un pointeur sur FILE... Pourquoi diable veux-tu récupérer la valeur dans u[i], u étant un tableau de int, et i n'étant même pas initialisé (c'est certainement la plus énorme incohérence dans cet appel) ?! Récupère le file descriptor (ce que retourne la fonction) dans un pointeur sur FILE !
7. Pour lire sur le file descriptor retourné sur la fonction, je te propose d'utiliser la fonction fscanf(), qui fait s'utilise exactement comme la fonction scanf() sauf que tu dois passer le pointeur sur FILE en premier paramètre, et que tu ne lis pas ce qu'envoie l'utilisateur mais ce qu'envoie le programme (par exemple, si le programme fait un
printf("%d", nombre);
, tu pourras le récupérer avec fscanf() au moyen de
fscanf(file_descriptor, "%d", &nombre);
(un petit tour sur ton moteur de recherche préféré te donnera des explications sur cette fonction si tu ne t'en es jamais servi).
8. N'oublie pas de fermer le file descriptor à la fin de son utilisation :
pclose(file_descriptor);


Et comme ton programme A fait plein de printf() inutiles que l'utilisateur ne pourra même pas lire puisqu'ils seront redirigés vers le file descriptor de ton autre programme, il sera assez difficile de ne lire que les valeurs voulues avec fscanf(). Ce que je te propose, c'est de n'afficher dans ton programme A que les nombres trouvés.

Et souviens toi que la fonction popen() n'attend pas la fin de l'exécution de la commande qu'on lui passe, elle crée un nouveau processus qui s'exécute en même temps que le processus où elle a été appellée, et qui partage la même console. Heuresement pour toi, la fonction fscanf() met en "pause" le programme tant qu'elle n'a pas obtenu quelque chose à lire.

Et une dernière chose : Mais pourquoi veux-tu absolument faire deux programmes ? Tu te compliques la vie pour rien, il serait tellement plus simple de ne faire qu'un seul et même programme...
Messages postés
5579
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
22 juin 2021
937
Bonjour paly2,

Notre ami "programmation" s'éparpille un peu dans ses sujets.

https://forums.commentcamarche.net/forum/affich-33240046-appel-d-un-programme-externe#7

Sous Windows, une fonction
_popen()
est disponible pour les applications console... bien que la manière orthodoxe de faire soit d'utiliser directement l'API Windows et la fonction
CreateProcess()
avec
CreatePipe()
, comme expliqué dans ce sujet et dans l'exemple donné sur MSDN.

Cependant, comme "programmation" clarifie ici qu'il est l'auteur des deux programmes (question que je lui posais dans le précédent sujet), je te rejoins totalement sur le fait qu'il ferait mieux de faire un seul et même programme... et qu'on ne voit pas très bien pourquoi il se complique la vie.


Dal