[C] recuperer une variable de type inconnu?

Fermé
Tisiph0n3 - 17 nov. 2007 à 21:18
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 15 nov. 2011 à 08:06
Bonjour,
alors voila mon probleme, je dois coder un printf, j'ai donc ma petite idée sur le structure de la fonction que je vais expliquer ci dessous:
la fonction printf appelle une sous fonction qui analyse le premier argument de printf affiche tout ce qui n'est pas du style %d ou autre et a chaque flag de formatage rencontré appelle la sous fonction qui va bien pour traiter ce type de donnée en lui passant la variable du deuxieme argument de printf.
Jusque là ça va mais la sous fonction qui traite le deuxieme argument elle je peux la prototyper avec un type determiné pour la variable a traiter vu qu'après analyse de la chaine je sais de quel type est la variable du deuxieme argument de printf, le probleme c'est que la fonction qui appelle la sous fonction correspondante au flag de formatage comment je fais il faut bien que je la prototype pour recuperer la variable du 2e argument de printf, or comme son type n'est pas connu avant analyse de la chaine je fais comment?
Donc deux question:
1 -
Est ce possible de déclarer une fonction qui prend 2 variables en paramètre mais dont le type de la deuxieme n'est pas connu? Un truc du style int printf(char *str, variable)
2-
Ou bien est t il possible de retrouver dynamiquement le type de la 2e variable (SANS UTILISER DE FONCTION SYSTEME QUELCONQUE) et de mettre à la volée le type qui va bien pour la deuxeme variable?

Merci
A voir également:

3 réponses

C'est possible! renseigne toi sur la lib stdarg (man 3 stdarg).

en gros ça permet d'envoyer un nombre indéfini de paramètres de type indéfinis.
1
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
15 nov. 2011 à 05:58
Bonjour,
Pour la question 1 c'est possible en utilisant le type void* enfin ce sera l'adresse qu'on envoi évidemment et derrière on analyserait ce qui se trouve à cette adresse.
printf n'est pas si compliqué puisqu'on sait quel est le formatage qu'on doit appliquer aux variables passées en paramètre..
à l'arrache :
#include <stdio.h>
#include <stdlib.h>

void print(char c,void *v)
  {
    size_t loop;
    char *ptr=(char*)v;
    if(c=='s'){
        do
            putc(*ptr,stdout);
        while(*ptr++);
    }
    if(c=='d'){
        for(loop=0;loop<sizeof(int);loop++)
            putc(ptr[loop],stdout);
    }
  }
int main(void)
  {
    int n = 2180935;
    char *s = "hello world";
    print('s',s);
    print('d',&n);
    return 0;
  }


C'est juste pour représenter l'idée, là le tableau de char et le int utilisent putc donc le int va être affiché en ASCII et faudrait voir du côté de little et big endian pour l'affichage des nombres à mon avis
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
15 nov. 2011 à 08:06
Bonjour,
Effectivement, là tu passes par l'adresse et en plus comme tu le dis tu devras gérer le boustisme de la machine.
Le mieux est d'utiliser une va_list et de récupérer un à un les variables avec va_arg.
Cela est plus portable et plus facile.
Cdlt,
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
17 nov. 2007 à 22:46
Salut,

Non je ne pense pas qu'en C cela soit possible. Tu abordes le point des templates si je comprends bien ton problème, que tu peux faire en C++.

Cdt
0