Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1241 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Faire appel à une fonction dans une autre fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Faire appel à une fonction dans une autre fonction

n°1338413
vinoromano
saoule
Posté le 04-04-2006 à 10:03:48  profilanswer
 

Bonjour tous,
Je vous prie de bien vouloir m'aider.
J'ai une fonction appelée fonctde(paramètre) qui me retourne un nombre et je voudrais l'utiliser dans une autre fonction. Comment faire pour l'appeler?
Piste: exec, system mais je n'en suis pas sure et je ne connais pas la syntaxe exacte.
Merci pour votre attention et votre aide.

mood
Publicité
Posté le 04-04-2006 à 10:03:48  profilanswer
 

n°1338430
franceso
Posté le 04-04-2006 à 10:16:36  profilanswer
 

je ne comprends pas trop ton problème : il n'y a rien de spécial à faire pour appeler une fonction C depuis une autre fonction C:

Code :
  1. int fonc1( int i )
  2. {
  3.   int result;
  4.   /* ... */
  5.   return result;
  6. }
  7. int fonc2( int i )
  8. {
  9.   int j = fonc1(i);
  10.   /* ... */
  11.   return j;
  12. }


 
la fonction system() sert à appeler une commande externe à ton programme, comme tu pourrais le faire dans un shell.

Code :
  1. system( "echo toto" );


la fonction exec() est un peu plus compliquée et je ne suis pas sûr que ce soit de ton niveau encore. (man exec si tu veux quand même des détails)


Message édité par franceso le 04-04-2006 à 10:22:46

---------------
TriScale innov
n°1338469
vinoromano
saoule
Posté le 04-04-2006 à 10:46:52  profilanswer
 

man exec ne donne rien. Mon programme n'a-t-il pas besoin que je lui mentionne que je vais utiliser une fonction déjà existante?
merci.
Penses-tu que 'cat /proc/pid/status' soit un fichier?
Comment récupérer le résultat?
Peut-on écrire res = "cat /proc/pid/status"?
Merci

n°1338472
_darkalt3_
Proctopathe
Posté le 04-04-2006 à 10:49:26  profilanswer
 

En unix, tout est fichier.
 
Non,tu ne peux pas écrire

Code :
  1. res = "cat /proc/pid/status"


 
A priori si c'est pour faire ce genre de traitement, des scripts shell semblent plus adaptés qu'utiliser le langage C.

n°1338477
vinoromano
saoule
Posté le 04-04-2006 à 10:53:44  profilanswer
 

Donc si tout est fichier alors je peux utiliser directement 'fopen'?
Le problème, je l'ai déjà fait mais ça ne marche pas.

n°1338489
_darkalt3_
Proctopathe
Posté le 04-04-2006 à 11:01:15  profilanswer
 

Citation :

Le problème, je l'ai déjà fait mais ça ne marche pas.


 
:??:

n°1338490
vinoromano
saoule
Posté le 04-04-2006 à 11:03:11  profilanswer
 

en fait j'ai déjà utilisé 'fopen' pour ouvrir les fichiers. l'erreur est que le système ne connait pas le chemin.
Merc

n°1338495
_darkalt3_
Proctopathe
Posté le 04-04-2006 à 11:09:17  profilanswer
 

question de droits peut etre ?

n°1338498
couroutsou
Posté le 04-04-2006 à 11:12:40  profilanswer
 

vinoromano a écrit :

en fait j'ai déjà utilisé 'fopen' pour ouvrir les fichiers. l'erreur est que le système ne connait pas le chemin.
Merc


 
bon
mentre ton code.  :p

n°1338500
vinoromano
saoule
Posté le 04-04-2006 à 11:14:26  profilanswer
 

Voici mon code
 
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
 
/*Lecture de /proc*/
 
//Définition du type du tableau des pid
typedef struct {
   int nb1;
   int nb2;
   char t1[40];
   char t2[40];
   char t3[40];
   char t4[40];
     }bloc;
             
//==============================================================================
//
//------------------------------------------------------------------------------            
//nombre de lignes du fichier lu
int nblignefichier(char arg2[40])
   {
   int n = 0; /* nombre de lignes lues */
   char ligne[256];
   FILE *f = fopen( arg2, "r" ); /* ouvre en lecture */
   if (f==NULL) {
     printf("erreur ouverture\n" );
     return 0;        /* sort du programme (code erreur 1) */
   }
   while (fgets( ligne, 256, f ) != NULL) { /* essai lecture ligne */
       n++;                                  
   }
   fclose(f);  /* ferme le fichier */
   return n;
  }
//exec("pidof  " );  
//==============================================================================
//
//------------------------------------------------------------------------------
// Création du tableau des processus importants
       
        //nombre de lignes du tableau des processus importants
      int nblignetab(char * process1[20])
      {
          int nb;
          nb=0;
          while (process1[nb]!=NULL)
          {
                nb++;
          }
                return nb;
      }
  //==============================================================================
//
//------------------------------------------------------------------------------
//afficher le tableau des processus importants????
void affichprocess(char * process2[20])//utiliser int main void???
{      
         
         int i, nb;
         nb = nblignetab(process2);
         for (i=0; i<nb; i++)  
         {
           printf ("%s\n", process2[i]);
         }
           
   
}
//==============================================================================
//
//------------------------------------------------------------------------------
/*Déterminer les pid des processus importants*/
int pidde(char * process3[20])
{
int i,nb;
int pidde[20];
nb=nblignetab(process);
for (i=0; i<nb; i++)
     {
    pidde[i] = pidof(process[i]);
     }    
return pidde;
}
 
//==============================================================================
//
//------------------------------------------------------------------------------
/*Vérifier si les pid de pidde sont dans /proc*/
int verif(bloc *b,int pidde[20],int taille)
{
int tmp,i,j;
int erreurpid[nb];
nb = nblignetab(pidde);
int erreurpid[20];
 
for(i=0;i<nb;i++)
{
  erreurpid[i]=0;
}
 
for (i=0; i<nb; i++)
    {
          tmp = pidde[i];
          for (j=0; j<taille; j++)
          {
              if (tmp == b[j].nb1)// || (tmp == b[j].nb2))
              {
                return 1;
              }
          }
           for(j=0;j<taille;j++)
           {
              if (tmp == b[j].nb2)
              {
                return 1;
              }                                  
           }
            n1 = atoi(b[0].t1);
            n2 = atoi(b[0].t2);
             
        //    if (tmp == n1)
//              {
//                return 1;
//              }
//            if (tmp == n2)
//              {
//                return 1;
//              }          
           printf("Ce processus ne fonctionne pas" );
           erreurpid[i]=tmp;
           
     }
             
  return erreurpid;        
     
}
//==============================================================================
//
//------------------------------------------------------------------------------
int main(void)
{
int pidde1[20];
int erreurpid1[20];
int i,a,taille,pos1,j,nb;
char *process[20]= {"mysql","apache","bash","blabla","blabla1"} ;//liste de tous les processus importants
 
 pidde1=pidde(process);
 
/*Ouvrir le fichier en lecture seule*/
FILE* lecture = fopen("/proc","r" );
taille = nblignefichier("/proc" );
 
//création du tableau de taille "taille"
bloc b[taille];
 
char nb[255];
 
//remplissage du tableau
for(i=0;i<taille;i++)
{
 fscanf(lecture, "%s", &nb);
 b[i].nb1 = atoi(nb);
 fscanf(lecture, "%s", &nb);
 b[i].nb2 = atoi(nb);
 fscanf(lecture, "%s", &b[i].t1);
 fscanf(lecture, "%s", &b[i].t2);
    fscanf(lecture, "%s", &b[i].t3);
    fscanf(lecture, "%s", &b[i].t4);
   
 
}
/* pclose(fichier);*/
fclose(lecture);
 
 //affichage du tabeau
 for(i=0;i<taille;i++)
 {
 printf("%d %d %s %s %s %s\n",b[i].nb1,b[i].nb2,b[i].t1,b[i].t2,b[i].t3,b[i].t4);
 }
 
 erreurpid1=verif(b,pidde1,taille);
 
 
 system("PAUSE" );
 
// la 1ere colonne s'obtient avec b[i].nb1
// la 2e colonne s'obtient avec b[i].nb2
return EXIT_SUCCESS;
 
}
 
 
//Donner le statut des processus les plus importants
 
int i, nb;
nb = nblignetab(pidde);
for (i=0; i<nb; i++)
{
     res = "/proc/pidde[i]/status";//syntaxe???
}
 
 
   
 
 

mood
Publicité
Posté le 04-04-2006 à 11:14:26  profilanswer
 

n°1338504
_darkalt3_
Proctopathe
Posté le 04-04-2006 à 11:15:39  profilanswer
 

balise [code] stp

n°1338505
vinoromano
saoule
Posté le 04-04-2006 à 11:16:33  profilanswer
 

C'est quoi ?
balise [code] stp

n°1338510
_darkalt3_
Proctopathe
Posté le 04-04-2006 à 11:18:00  profilanswer
 

exemple:
 
[ code ] code [ / code ] =>

Code :
  1. code


 
et ca évite les smileys intempestifs, c'est plus lisible.

n°1338512
franceso
Posté le 04-04-2006 à 11:20:59  profilanswer
 

Citation :

Donc si tout est fichier alors je peux utiliser directement 'fopen'?

fopen() permet uniquement d'ouvrir un fichier à partir de son nom dans le filesystem (en gros, ça concerne les fichiers que tu peux voir en faisant un 'ls', ce qui inclut déjà des fichiers "bizarres" ).
 
Mais la notion de fichier est beaucoup plus générale dans le monde unix. N'importe quel flux ordonné de données peut être considéré comme un fichier (et d'ailleurs tu ne fais naturellement pas de différence entre le flux de données provenant d'un clavier ou d'un fichier). Tu peux utiliser ceci pour faire communiquer entre eux plusieurs processus (c'est ce qui est fait par ton shell quand tu lances par exemple une commande du genre "cat /proc/pid/status | grep ..." : il s'agit simplement de connecter le flux de sortie du premier processus au flux d'entrée du deuxième à travers un pipe)
pour faire ça en C, il y a plein de moyens. L'un d'entre eux (peut-être le plus simple) étant d'utiliser popen() qui fonctionne un peu comme fopen() :

Code :
  1. FILE *cmd = popen( "echo foo", "r" );
  2.   if( status == NULL )
  3.     {
  4.       perror( "popen" );
  5.     }
  6.   /* tu peux utiliser cmd comme n'importe quel (FILE*) */


 
 
Mais _darkalt3_ a raison : suivant ce que tu veux faire, il peut être beaucoup plus intéressant de faire du script shell ou perl ou quelque chose du genre...


---------------
TriScale innov
n°1338519
vinoromano
saoule
Posté le 04-04-2006 à 11:29:21  profilanswer
 

Je ne connais pas perl encore moins shell. Je connais C et je débute. Je vais essayer de me renseigner sur perl.
Merci pour les infos.

n°1338525
_darkalt3_
Proctopathe
Posté le 04-04-2006 à 11:31:09  profilanswer
 

si tu connais "cat", saches qu'un script shell est composé de ce genre de commandes, soit les commandes unix. Ca ne devrait pas te poser trop de problèmes.

n°1338526
couroutsou
Posté le 04-04-2006 à 11:31:10  profilanswer
 

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include <stdlib.h>
  4. /*Lecture de /proc*/
  5. //Définition du type du tableau des pid  
  6. typedef struct {
  7.    int nb1;
  8.    int nb2;
  9.    char t1[40];
  10.    char t2[40];
  11.    char t3[40];
  12.    char t4[40];
  13.      }bloc;
  14.            
  15. //==============================================================================  
  16. //  
  17. //------------------------------------------------------------------------------             
  18. //nombre de lignes du fichier lu  
  19. int nblignefichier(char arg2[40])
  20.    {
  21.    int n = 0; /* nombre de lignes lues */
  22.    char ligne[256];
  23.    FILE *f = fopen( arg2, "r" ); /* ouvre en lecture */
  24.    if (f==NULL) {
  25.      printf("erreur ouverture\n";
  26.      return 0;        /* sort du programme (code erreur 1) */
  27.    }
  28.    while (fgets( ligne, 256, f ) != NULL) { /* essai lecture ligne */
  29.        n++;                                 
  30.    }
  31.    fclose(f);  /* ferme le fichier */
  32.    return n;
  33.   }
  34. //exec("pidof  ";   
  35. //==============================================================================  
  36. //  
  37. //------------------------------------------------------------------------------  
  38. // Création du tableau des processus importants  
  39.        
  40.         //nombre de lignes du tableau des processus importants  
  41.       int nblignetab(char * process1[20])
  42.       {
  43.           int nb;
  44.           nb=0;
  45.           while (process1[nb]!=NULL)
  46.           {
  47.                 nb++;
  48.           }
  49.                 return nb;
  50.       }
  51.   //==============================================================================  
  52. //  
  53. //------------------------------------------------------------------------------  
  54. //afficher le tableau des processus importants????  
  55. void affichprocess(char * process2[20])//utiliser int main void???  
  56. {     
  57.          
  58.          int i, nb;
  59.          nb = nblignetab(process2);
  60.          for (i=0; i<nb; i++) 
  61.          {
  62.            printf ("%s\n", process2[i]);
  63.          }
  64.            
  65.    
  66. }
  67. //==============================================================================  
  68. //  
  69. //------------------------------------------------------------------------------  
  70. /*Déterminer les pid des processus importants*/
  71. int pidde(char * process3[20])
  72. {
  73. int i,nb;
  74. int pidde[20];
  75. nb=nblignetab(process);
  76. for (i=0; i<nb; i++)
  77.      {
  78.     pidde[i] = pidof(process[i]);
  79.      }   
  80. return pidde;
  81. }
  82. //==============================================================================  
  83. //  
  84. //------------------------------------------------------------------------------  
  85. /*Vérifier si les pid de pidde sont dans /proc*/
  86. int verif(bloc *b,int pidde[20],int taille)
  87. {
  88. int tmp,i,j;
  89. int erreurpid[nb];
  90. nb = nblignetab(pidde);
  91. int erreurpid[20];
  92. for(i=0;i<nb;i++)
  93. {
  94.   erreurpid[i]=0;
  95. }
  96. for (i=0; i<nb; i++)
  97.     {
  98.           tmp = pidde[i];
  99.           for (j=0; j<taille; j++)
  100.           {
  101.               if (tmp == b[j].nb1)// || (tmp == b[j].nb2))  
  102.               {
  103.                 return 1;
  104.               }
  105.           }
  106.            for(j=0;j<taille;j++)
  107.            {
  108.               if (tmp == b[j].nb2)
  109.               {
  110.                 return 1;
  111.               }                                 
  112.            }
  113.             n1 = atoi(b[0].t1);
  114.             n2 = atoi(b[0].t2);
  115.            
  116.         //    if (tmp == n1)  
  117. //              {  
  118. //                return 1;  
  119. //              }  
  120. //            if (tmp == n2)  
  121. //              {  
  122. //                return 1;  
  123. //              }           
  124.            printf("Ce processus ne fonctionne pas";
  125.            erreurpid[i]=tmp;
  126.            
  127.      }
  128.              
  129.   return erreurpid;       
  130.    
  131. }
  132. //==============================================================================  
  133. //  
  134. //------------------------------------------------------------------------------  
  135. int main(void)
  136. {
  137. int pidde1[20];
  138. int erreurpid1[20];
  139. int i,a,taille,pos1,j,nb;
  140. char *process[20]= {"mysql","apache","bash","blabla","blabla1"} ;//liste de tous les processus importants  
  141. pidde1=pidde(process);
  142.  
  143. /*Ouvrir le fichier en lecture seule*/
  144. FILE* lecture = fopen("/proc","r";
  145. taille = nblignefichier("/proc";
  146. //création du tableau de taille "taille"  
  147. bloc b[taille];
  148. char nb[255];
  149. //remplissage du tableau  
  150. for(i=0;i<taille;i++)
  151. {
  152. fscanf(lecture, "%s", &nb);
  153. b[i].nb1 = atoi(nb);
  154. fscanf(lecture, "%s", &nb);
  155. b[i].nb2 = atoi(nb);
  156. fscanf(lecture, "%s", &b[i].t1);
  157. fscanf(lecture, "%s", &b[i].t2);
  158.     fscanf(lecture, "%s", &b[i].t3);
  159.     fscanf(lecture, "%s", &b[i].t4);
  160.    
  161. }
  162. /* pclose(fichier);*/
  163. fclose(lecture);
  164.  
  165. //affichage du tabeau  
  166. for(i=0;i<taille;i++)
  167. {
  168. printf("%d %d %s %s %s %s\n",b[i].nb1,b[i].nb2,b[i].t1,b[i].t2,b[i].t3,b[i].t4);
  169. }
  170.  
  171. erreurpid1=verif(b,pidde1,taille);
  172.  
  173.  
  174. system("PAUSE";
  175. // la 1ere colonne s'obtient avec b[i].nb1  
  176. // la 2e colonne s'obtient avec b[i].nb2  
  177. return EXIT_SUCCESS;
  178. }
  179. //Donner le statut des processus les plus importants  
  180. int i, nb;
  181. nb = nblignetab(pidde);
  182. for (i=0; i<nb; i++)
  183. {
  184.      res = "/proc/pidde[i]/status";//syntaxe???  
  185. }

n°1339399
vinoromano
saoule
Posté le 05-04-2006 à 09:12:52  profilanswer
 

Bonjour,
peut-on faire ceci dans un programme C:
cp /proc/partitions  /root/partitions
Partitions étant un fichier du répertoire /proc.
Le but étant d'utiliser partitions comme un fichier .txt par exemple.
En effet, lorsque j'ouvre /proc/partitions à partir du 'Secure Shell' il n'y a rien à l'intérieur. Mais quand je le copie dans /root, le contenu apparaît comme par magie!!!
Je ne comprends pas trop.
Merci

n°1339406
vinoromano
saoule
Posté le 05-04-2006 à 09:32:09  profilanswer
 

J'ai fait:
system("fichier_source> fichier.dat" ) et ça marche.
Mais je n'arrive pas à l'utiliser.
Merci

n°1339411
_darkalt3_
Proctopathe
Posté le 05-04-2006 à 09:36:55  profilanswer
 

Citation :

ça marche.Mais je n'arrive pas à l'utiliser.


 
:??:

n°1339425
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-04-2006 à 09:43:55  profilanswer
 

vinoromano a écrit :

J'ai fait:
system("fichier_source> fichier.dat" ) et ça marche.
Mais je n'arrive pas à l'utiliser.


Tu pourrais être moins précis, parce là avec tous ces détails, on est perdu ...
 
Utiliser quoi ? fichier.dat ? Il suffit que l'application appelante ouvre le fichier et lise les données. C'est dur ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1339478
vinoromano
saoule
Posté le 05-04-2006 à 10:43:29  profilanswer
 

plus exactement system("cat /etc/network/interfaces > /root/interfaces.dat" )
Cela me permet d'utiliser le fichier "interfaces" dans et d'en extraire des informations. Cela marche très bien. Mais en fonction du résultat de 'cat /etc/network/interfaces'  le programme que j'aie fait ne marche pas car apparement le fichier /root/interfaces n'est pas sous la même forme de présentation et je ne sais pas comment faire pour voir le contenu de /root/interfaces.
Je crois que je suis un peu naze, je dois passer à côté de méthodes simples. Merci de votre aide.

n°1339480
franceso
Posté le 05-04-2006 à 10:45:56  profilanswer
 

pourquoi tu ne lis pas directement ton fichier /etc/network/interfaces ?


---------------
TriScale innov
n°1339484
_darkalt3_
Proctopathe
Posté le 05-04-2006 à 10:55:57  profilanswer
 

et pourquoi en C :??:

n°1339486
franceso
Posté le 05-04-2006 à 11:02:58  profilanswer
 

_darkalt3_ a écrit :

et pourquoi en C :??:

[:plusun]
tant que tu ne nous diras pas quelle est la finalité de tout ça, je persisterai à penser que le script est plus adapté (même si tu n'y connais rien, c'est pas très compliqué à apprendre et on peut faire tout un tas de choses compliquées, même avec des connaissances de base)


Message édité par franceso le 05-04-2006 à 11:03:18

---------------
TriScale innov
n°1339487
vinoromano
saoule
Posté le 05-04-2006 à 11:03:32  profilanswer
 

Je ne peux pas lire directement car cela me met"accès introuvable". En C car c'est le seul langage que je connaisse.
Merci

n°1339492
vinoromano
saoule
Posté le 05-04-2006 à 11:04:52  profilanswer
 

Je vais apprendre donc. Mais où trouver les enseignements névessaires?

n°1339495
_darkalt3_
Proctopathe
Posté le 05-04-2006 à 11:10:41  profilanswer
 

google :)

n°1339512
vinoromano
saoule
Posté le 05-04-2006 à 11:32:14  profilanswer
 

OK, merci

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Faire appel à une fonction dans une autre fonction

 

Sujets relatifs
Modifier un champ en fonction de la dateFaire un appel à des variables contenu dans un fichier
Faire appel à une boite de dialoguefonction mail() : Recipient address rejected
fonction délai pour Pythonfonction preg_replace
[resolu]Fonction sqrt non reconnue...fonction PHP images
problème avec la fonction RangePointeurs sur fonction membre, héritage, toussa
Plus de sujets relatifs à : [C] Faire appel à une fonction dans une autre fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR