[C] recuperer une variable de type inconnu?
Tisiph0n3
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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
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:
- [C] recuperer une variable de type inconnu?
- Numero inconnu - Guide
- Recuperer message whatsapp supprimé - Guide
- Comment recuperer une video sur youtube - Guide
- Impossible de récupérer mon compte gmail - Guide
- Récupérer mon compte facebook désactivé - Guide
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.
en gros ça permet d'envoyer un nombre indéfini de paramètres de type indéfinis.
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 :
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
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