Nous sommes actuellement le 24 Avr 2024, 21:22

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 7 message(s) ] 
Auteur Message
MessagePublié: 10 Mai 2002, 19:03 
Hors-ligne
Occasionnel
Occasionnel
Avatar de l’utilisateur

Inscription : 06 Jan 2002, 23:19
Message(s) : 131
Bon je sais qu'avec stdargs.h ont peut obtenir la liste de variable d'une fonction definie de la facon suivante.

Code :
int test(char *a,...);

va_list args;

va_start(args,a);
vprintf(a,args);
va_end(args);


Alors que moi ce que je voudrais faire c pouvoir envoyer une liste de variable dans une fonction

Voici ce qui est presentement fait :
Code :
#define d_func() ((double (*)(...))func)

double ftable::call(char *name,var_cont *args)
{
  void *func;
 
  func_link *temp=find_function(name);
  func = temp->function;
   
  return d_func()( args[0].s );
}


Ce que je voudrais faire c pouvoir creer une liste de variable dynamiquement .

Pour pouvoir faire ceci :

Code :
  varible_list v_list;

  add2list(v_list, args[0].s);
  add2list(v_list, args[1].d);

  //ensuite je pourrais appeller ma fonction

  d_func()(v_list);
 
  // donc v_list contiendrais ceci .
  ( args[0].s , args[1].d)


Si quelqu'un pourrais m'aider plus que je cherche une solution plus on dirait que je m'en eloigne !!! :)

Surement une personne externe a mon probleme pourrait plus facilement m'aider que moi meme !!! [/code]

_________________
Image


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 13 Mai 2002, 23:10 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 22 Fév 2002, 20:54
Message(s) : 738
Localisation : Montréal
Hum je suppose que tu as trouvé la solution ça fait assez longtemps que tu l'as posé, mais bon c'est pas très bien faire ça mais ça fonctionne:

Code :
#include <stdio.h>
#include <STDARG.H>
#include <malloc.h>

typedef struct _MyDataStruct
{
   int nData;
   char* pszData;
   double dData;
}MyDataStruct;

void main()
{
   MyDataStruct myStruct;
   myStruct.nData = 2;
   myStruct.pszData = (char *)malloc(32*sizeof(char));
   sprintf(myStruct.pszData, " Allo la terre!!! ");
   myStruct.dData = 3.0f;
   vprintf("%d %s %f\n",(va_list)&(myStruct));
   return;
}



Fait attention, si les variables de ton (array/structure) ne sont pas aligné sur des 32 bits ça va planter si tu ne met pas de padding


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 14 Mai 2002, 12:27 
Hors-ligne
Occasionnel
Occasionnel
Avatar de l’utilisateur

Inscription : 06 Jan 2002, 23:19
Message(s) : 131
Malheureusement j'ai pas encore réussit a faire ce que je veut faire.

ce que tu m'as dit m'aide beaucoup sauf que je reste tout de meme bloquer.

Puisque se que je cherche a faire c.est pouvoir envoyer n'importe quel type de variable.

Comme :

d_func()(double,char *);
autant que
d_func()(char *,double);

_________________
Image


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 16 Mai 2002, 21:14 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 22 Fév 2002, 20:54
Message(s) : 738
Localisation : Montréal
Tu peux regarder ton code désassemblé et ensuite écrire les commandes assembleur pour faire ce que tu veux. De cette façon tu auras sûrement le contrôle nécessaire pour envoyer les paramêtres désiré.

Voici un exemple simple:

PS: je ne connais pas tellement l'assembleur Intel


Code :
#include <stdio.h>
void Test(int nData1, double dData2);

void Test(int nData1, double dData2)
{
   printf("%d %f\n", nData1,dData2);
}


int main(int argc, char* argv[])
{
   void (*pFunc)(int , double);
   pFunc = Test;
   for(int i = 0; i<3;i++)
   {
      //code assembleur équivalent à pFunc(i, 2.0);
      __asm
      {
         mov         esi,esp
         push        40000000h
         push        0
         mov         ecx,dword ptr [ebp-8]
         push        ecx
         call        dword ptr [ebp-4]
         add         esp,0Ch
      }
   }
   return 0;
}


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 17 Mai 2002, 22:43 
Hors-ligne
Occasionnel
Occasionnel
Avatar de l’utilisateur

Inscription : 06 Jan 2002, 23:19
Message(s) : 131
est ce que tu peut me dire un bon programme pour déssasembler ... j'ai jamais toucher a l'assembleur !!

_________________
Image


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 18 Mai 2002, 01:27 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 22 Fév 2002, 20:54
Message(s) : 738
Localisation : Montréal
ben avec Visual Studio tu as juste a mettre un break point à un endroit et switcher en assembleur lorsque le debugger break. Tu peux ainsi comparer le code que tu as écrit en C/C++ avec le code équivalent en assembleur.


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 18 Mai 2002, 13:28 
Hors-ligne
Occasionnel
Occasionnel
Avatar de l’utilisateur

Inscription : 06 Jan 2002, 23:19
Message(s) : 131
okay merci

_________________
Image


Haut
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 7 message(s) ] 

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 11 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum

Recherche de:
Aller vers :  
cron
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site