All pastes #794170 Raw Edit

phil qui tue tout !

public text v1 · immutable
·published 2007-11-22 23:12 UTC
rendered paste body
using namespace std;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>


void fauxprintf(char* listype,...)
{
char** p=&listype;// création d'1 pioteur de pointeur : p pointe sur listype (listype pointe sur le premier caractère)
p=p+1; //on se positionne au début de la liste d'arg (après la chaine de car descriptive de types)
int i;
for(i=0;i<strlen(listype);i++) //chaque caractère de la chaine représente un arg, on les parcour tous:
{
        switch (*(listype+i)) //== "selon le caractère lu : ( *(listype+1) est le second caractere de la chaine
        {
         case 'g': 
              {double* w=(double*)p;//si on utilise directement p ça ne marche pas. Pourquoi?
              // on force p à etre un double* au lieu d'un char** et on definit w=p une var locale
               cout<<"Le "<<i+1<<"ieme arg de la fonction est un double"<<endl;
               cout<<"son adresse est "<< w <<endl;
               cout<<"sa valeur est "<< *w <<endl;
               cout<<endl;
               w=w+1;//incrementation de l'adresse de l'arg courrant de la taille du type correspondant, ici celle d'un double
               p=(char**)w;//en fait on fait p=w mais c'est impossible si w n'est pas un char**
               break;}
         case 'd' :
              {int* w=(int*)p;// on force p à etre un int* au lieu d'un char** et on definit w=p une var locale
               cout<<"Le "<<i+1<<"ieme arg de la fonction est un int"<<endl;
               cout<<"son adresse est "<< w <<endl;
               cout<<"sa valeur est "<< *w <<endl;
               cout<<endl;
               w=w+1;//incrementation de l'adresse de l'arg courrant de la taille du type correspondant, ici celle d'un int
               p=(char**)w;//en fait on fait p=w en précisant que p est de nouveau un char**
               break;}
         case 'l' :
              {long int* w=(long int*)p;
               cout<<"Le "<<i+1<<"ieme arg de la fonction est un long int"<<endl;
               cout<<"son adresse est "<< w <<endl;
               cout<<"sa valeur est "<< *w <<endl;
               cout<<endl;
               w=w+1;//incrementation de l'adresse de l'arg courrant de la taille du type correspondant, ici celle d'un long int
               p=(char**)w;//en fait on fait p=w en précisant que p est de nouveau un char**
               break;}
        }                                                         
}
cout<<endl;
}


int main(int argc, char *argv[])
{
   int a=4,c=66,y=2;   
   double d2=2.2;   
   double x1=0.111;
   char T[]="gdlldgdl"; long int l1=999,l2=100000,l3=9000000;
   fauxprintf(T,x1,a,l1,l2,y,d2,c,l3);
   
  
      
   system("PAUSE");
    return EXIT_SUCCESS;
}