portée des variables

portée des variables - C - Programmation

Marsh Posté le 24-03-2010 à 23:26:19    

bonjour, je voudrais savoir comment accéder aux variables locales d'une fonction depuis une autre.
Je développe une fonction de debug qui sort pour l'instant uniquement les lignes exécutées, ce qui me permet de tracer l'exécution.
je fais appel à ma fonction via une macro positionnée en début de chaque ligne avec en paramètre les constantes __file__ et __line__.
J'aimerais maintenant accéder depuis ma fonction de debug aux variables de la fonction que je suis entrain de tracer.
j'ai vu qu'il existait une constante __func__ qui donne le nom de la fonction en cours, n'est-il passe possible grâce à ce paramètre d'exporter les variables locales en mémoire  (la pile de __func__?-je ne maitrise pas trop le sujet) ?
j'ai trouvé cà http://stackoverflow.com/questions [...] guage-here mais il n'y a pas le C...

 

Message cité 1 fois
Message édité par djobidjoba le 25-03-2010 à 00:11:16
Reply

Marsh Posté le 24-03-2010 à 23:26:19   

Reply

Marsh Posté le 24-03-2010 à 23:38:11    

un peu de code pour etre plus clair

Code :
  1. #include "stdio.h"
  2. #define f_DEBUG ma_func_debug(__FILE__,__LINE__,__func__);
  3. void ma_func_debug( char *s, int l, const char *f )
  4. {
  5. printf("%s/%d/%s\n", s, l, f );
  6. }
  7. int main( int arg, char **argv )
  8. {
  9. f_DEBUG;int i;
  10. f_DEBUG;for( i=0; i<5; i++ ) {
  11.  f_DEBUG;printf( "toto\n" );
  12. f_DEBUG;}
  13. f_DEBUG;return 0;
  14. }

donne :

D:\boulot>a.exe
test.c/12/main
test.c/14/main
test.c/15/main
toto
test.c/16/main
test.c/15/main
toto
test.c/16/main
test.c/15/main
toto
test.c/16/main
test.c/15/main
toto
test.c/16/main
test.c/15/main
toto
test.c/16/main
test.c/18/main


Message édité par djobidjoba le 24-03-2010 à 23:44:30
Reply

Marsh Posté le 26-03-2010 à 09:44:22    

une piste ?
j'ai trouvé quelque chose qui y ressemble ici http://www.dreamincode.net/code/snippet3323.htm
que représente les "100 bytes of code" de la ligne 38 ?


Message édité par djobidjoba le 26-03-2010 à 10:00:29
Reply

Marsh Posté le 26-03-2010 à 11:12:00    

djobidjoba a écrit :

bonjour, je voudrais savoir comment accéder aux variables locales d'une fonction depuis une autre.


 
C'est très très très moche de vouloir faire ça. Il faudrait se poser la question de comment tu as pu en arriver là. Mais bon, tu es grand et ça ne regarde que toi.
 
Il existe plusieurs tricks pour faire ça. Tu n'as pas précisé quelque chose, est-ce qu'il s'agit de variables "static", auquel cas tu sors régulièrement de ta fonction, ou alors de variables non "static" d'une fonction encore stacked ?
 
1 - Exemple de ce que je pense que tu voudrais faire avec une variable static :
 

Code :
  1. static void func(void)
  2. {
  3.     static int i = 0;
  4.     i++;
  5. }
  6. int main(void)
  7. {
  8.     func();
  9.     func()
  10.     /* Try to access func()'s "i" here. */
  11.     return 0;
  12. }


 
2 - Exemple de ce que je pense que tu voudrais faire avec une variable non static :
 

Code :
  1. static void func()
  2. {
  3.     /* Try to access main()'s "i" here. */
  4. }
  5. int main(void)
  6. {
  7.     int i = 42;
  8.     func();
  9.     return 0;
  10. }


 
Pour le cas 1, tu peux faire quelque chose d'assez simple, il te suffit de sortir "i" de ta fonction et de la foutre en globale.
 
Pour le cas 2, ça se complique, tu peux aussi mettre en globale les variables que tu voudrais mais ça sera surement pas la bonne solution vu qu'il peut y en avoir plusieurs.
 
Si ta fonction est toujours stackée, y'a rien qui t'empèche de chopper directement leurs adresses. Mais si tu ne veux pas faire d'assembleur il va te falloir au moins l'adresse d'une de tes variables.

Reply

Marsh Posté le 21-04-2012 à 13:58:41    

Pour la solution 1, je pourrais effectivement faire précéder les déclarations du mot clé statique. Comme l'idée c'est de faire ca en auto (passer le fichier source dans une moulinette) ca risque d'être tendu, il me faut recoder une analyseur syntaxique qui irait "détecter" les déclarations... c'est chaud je pense :o
donc solution 3 :
la fonction contenant mes variables à inspecter est bien toujours stackée lors de l'appel a la macro.
Quand tu dis "il va te falloir au moins l'adresse d'une de tes variables", est-ce que c'est sous entendu quand connaissant l'adresse d'une des variable d'une fct, on peut déterminer les autres ?  
en quoi l'assembleur pourrait m'être utile ?
merci et dsl pour le remontage de topique, j'étais passé sur un autre projet..  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed