Pas possible. Il n'est pas prévu à ma connaissance, d'entrer des adresses 'à la main'.
printf("%?,var);
"%p"
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"C is a sharp tool"
Pierre Maurette
----- ----- ----- wrote on 08/12/04 :
Comment lire et afficher un void * ?
void *var;
scanf("%?",&var);
Pas possible. Il n'est pas prévu à ma connaissance, d'entrer des adresses 'à la main'. Si si. Le p du (x)printf() sort sur un format "implémentation defined".
La norme dit que le (x)scanf() utilise le même pour scanner l'entrée d'un void*. C99 $7.19.6.2: p Matches an implementation-defined set of sequences, which should be the same as the set of sequences that may be produced by the %p conversion of the fprintf function. The corresponding argument shall be a pointer to a pointer to void. The input item is converted to a pointer value in an implementation-defined manner. If the input item is a value converted earlier during the same program execution, the pointer that results shall compare equal to that value; otherwise the behavior of the %p conversion is undefined. -- Pierre
----- ----- ----- wrote on 08/12/04 :
Comment lire et afficher un void * ?
void *var;
scanf("%?",&var);
Pas possible. Il n'est pas prévu à ma connaissance, d'entrer des
adresses 'à la main'.
Si si. Le p du (x)printf() sort sur un format "implémentation defined".
La norme dit que le (x)scanf() utilise le même pour scanner l'entrée
d'un void*.
C99 $7.19.6.2:
p Matches an implementation-defined set of sequences, which should be
the same as the set of sequences that may be produced by the %p
conversion of the fprintf function. The corresponding argument shall be
a pointer to a pointer to void. The input item is converted to a pointer
value in an implementation-defined manner. If the input item is a value
converted earlier during the same program execution, the pointer that
results shall compare equal to that value; otherwise the behavior of the
%p conversion is undefined.
--
Pierre
Pas possible. Il n'est pas prévu à ma connaissance, d'entrer des adresses 'à la main'. Si si. Le p du (x)printf() sort sur un format "implémentation defined".
La norme dit que le (x)scanf() utilise le même pour scanner l'entrée d'un void*. C99 $7.19.6.2: p Matches an implementation-defined set of sequences, which should be the same as the set of sequences that may be produced by the %p conversion of the fprintf function. The corresponding argument shall be a pointer to a pointer to void. The input item is converted to a pointer value in an implementation-defined manner. If the input item is a value converted earlier during the same program execution, the pointer that results shall compare equal to that value; otherwise the behavior of the %p conversion is undefined. -- Pierre
Pierre Maurette
----- ----- ----- wrote:
Comment lire et afficher un void * ?
void *var;
scanf("%?",&var); printf("%?,var); Pour l'affichage d'abord. Le %p (et non %P) est fait pour ça. Dans
printf("%p",var);
var doit (devrait) être un void*. Le texte affiché ou généré par xprintf() est défini par l'implémentation. Par exemple, mais ce n'est qu'un exemple, il pourra être équivalent à
printf("%08X",var);
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me semble difficilement utilisable dans l'optique d'un programme portable. Déjà, comment documenter la saisie ?. En fait, si la saisie directe d'adresse se conçoit (memory dump par exemple), c'est plutôt dans un contexte au moins partiellement connu, dans lequel on pourrait par exemple présumer de la convertibilité de void* en unsigned int, ou unsigned long, et ainsi assister/sécuriser la saisie.
S'il s'agit de tests personnels (étudier l'implantation des variables par exemple), on peut bien entendu faire à peu près n'importe quoi, à base de %d ou %u.
-- Pierre
----- ----- ----- wrote:
Comment lire et afficher un void * ?
void *var;
scanf("%?",&var);
printf("%?,var);
Pour l'affichage d'abord. Le %p (et non %P) est fait pour ça. Dans
printf("%p",var);
var doit (devrait) être un void*. Le texte affiché ou généré par
xprintf() est défini par l'implémentation. Par exemple, mais ce n'est
qu'un exemple, il pourra être équivalent à
printf("%08X",var);
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me
semble difficilement utilisable dans l'optique d'un programme portable.
Déjà, comment documenter la saisie ?.
En fait, si la saisie directe d'adresse se conçoit (memory dump par
exemple), c'est plutôt dans un contexte au moins partiellement connu,
dans lequel on pourrait par exemple présumer de la convertibilité de
void* en unsigned int, ou unsigned long, et ainsi assister/sécuriser la
saisie.
S'il s'agit de tests personnels (étudier l'implantation des variables
par exemple), on peut bien entendu faire à peu près n'importe quoi, à
base de %d ou %u.
scanf("%?",&var); printf("%?,var); Pour l'affichage d'abord. Le %p (et non %P) est fait pour ça. Dans
printf("%p",var);
var doit (devrait) être un void*. Le texte affiché ou généré par xprintf() est défini par l'implémentation. Par exemple, mais ce n'est qu'un exemple, il pourra être équivalent à
printf("%08X",var);
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me semble difficilement utilisable dans l'optique d'un programme portable. Déjà, comment documenter la saisie ?. En fait, si la saisie directe d'adresse se conçoit (memory dump par exemple), c'est plutôt dans un contexte au moins partiellement connu, dans lequel on pourrait par exemple présumer de la convertibilité de void* en unsigned int, ou unsigned long, et ainsi assister/sécuriser la saisie.
S'il s'agit de tests personnels (étudier l'implantation des variables par exemple), on peut bien entendu faire à peu près n'importe quoi, à base de %d ou %u.
-- Pierre
cedric
Pierre Maurette wrote:
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me semble difficilement utilisable dans l'optique d'un programme portable. Déjà, comment documenter la saisie ?.
Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos du scanf :
" Scanf pour saisir au clavier en aucun cas n'utiliseras, Mais pour relire des sorties formatées avec printf tu pourras."
Il n'y a donc pas de problème à ce que le format du %p ne soit pas déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par scanf, pas par un opérateur humain. À condition que l'écriture et la lecture se fassent sur la même architecture il n'y a donc pas de problème de portabilité (pour le cas où la portabilité figurait au cahier des charges de l'OP, ce qui n'est pas précisé).
Amicalement,
Pierre Maurette wrote:
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me
semble difficilement utilisable dans l'optique d'un programme portable.
Déjà, comment documenter la saisie ?.
Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos
du scanf :
" Scanf pour saisir au clavier en aucun cas n'utiliseras,
Mais pour relire des sorties formatées avec printf tu pourras."
Il n'y a donc pas de problème à ce que le format du %p ne soit pas
déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par
scanf, pas par un opérateur humain. À condition que l'écriture et la
lecture se fassent sur la même architecture il n'y a donc pas de
problème de portabilité (pour le cas où la portabilité figurait au
cahier des charges de l'OP, ce qui n'est pas précisé).
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me semble difficilement utilisable dans l'optique d'un programme portable. Déjà, comment documenter la saisie ?.
Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos du scanf :
" Scanf pour saisir au clavier en aucun cas n'utiliseras, Mais pour relire des sorties formatées avec printf tu pourras."
Il n'y a donc pas de problème à ce que le format du %p ne soit pas déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par scanf, pas par un opérateur humain. À condition que l'écriture et la lecture se fassent sur la même architecture il n'y a donc pas de problème de portabilité (pour le cas où la portabilité figurait au cahier des charges de l'OP, ce qui n'est pas précisé).
Amicalement,
Pierre Maurette
Pierre Maurette wrote:
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me semble difficilement utilisable dans l'optique d'un programme portable. Déjà, comment documenter la saisie ?.
Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos du scanf :
" Scanf pour saisir au clavier en aucun cas n'utiliseras, Mais pour relire des sorties formatées avec printf tu pourras." Oui, mais ça, d'autres se chargent de le rappeler à chaque fil ou
presque sur ce forum. Voilà qui est fait. La question était dans le ? de scanf("%?",&var);
Il n'y a donc pas de problème à ce que le format du %p ne soit pas déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par scanf, pas par un opérateur humain. À condition que l'écriture et la lecture se fassent sur la même architecture il n'y a donc pas de problème de portabilité (pour le cas où la portabilité figurait au cahier des charges de l'OP, ce qui n'est pas précisé). La question portant sur scanf(), c'est à dire sur fscanf(stdin,), il
faut quand même que l'utilisateur sache si on parle hexa ou décimal. D'ailleurs, un format tel: XXXX:XXXX me semble non seulement possible, mais surtout pas irréaliste du tout. -- Pierre
Pierre Maurette wrote:
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me
semble difficilement utilisable dans l'optique d'un programme portable.
Déjà, comment documenter la saisie ?.
Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos
du scanf :
" Scanf pour saisir au clavier en aucun cas n'utiliseras,
Mais pour relire des sorties formatées avec printf tu pourras."
Oui, mais ça, d'autres se chargent de le rappeler à chaque fil ou
presque sur ce forum. Voilà qui est fait.
La question était dans le ? de scanf("%?",&var);
Il n'y a donc pas de problème à ce que le format du %p ne soit pas
déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par
scanf, pas par un opérateur humain. À condition que l'écriture et la
lecture se fassent sur la même architecture il n'y a donc pas de
problème de portabilité (pour le cas où la portabilité figurait au
cahier des charges de l'OP, ce qui n'est pas précisé).
La question portant sur scanf(), c'est à dire sur fscanf(stdin,), il
faut quand même que l'utilisateur sache si on parle hexa ou décimal.
D'ailleurs, un format tel:
XXXX:XXXX
me semble non seulement possible, mais surtout pas irréaliste du tout.
--
Pierre
Ce spécificateur p est "réversible" dans un scanf(). Néanmoins, ça me semble difficilement utilisable dans l'optique d'un programme portable. Déjà, comment documenter la saisie ?.
Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos du scanf :
" Scanf pour saisir au clavier en aucun cas n'utiliseras, Mais pour relire des sorties formatées avec printf tu pourras." Oui, mais ça, d'autres se chargent de le rappeler à chaque fil ou
presque sur ce forum. Voilà qui est fait. La question était dans le ? de scanf("%?",&var);
Il n'y a donc pas de problème à ce que le format du %p ne soit pas déterminé, puisque tout ce que l'on veut c'est qu'il soit compris par scanf, pas par un opérateur humain. À condition que l'écriture et la lecture se fassent sur la même architecture il n'y a donc pas de problème de portabilité (pour le cas où la portabilité figurait au cahier des charges de l'OP, ce qui n'est pas précisé). La question portant sur scanf(), c'est à dire sur fscanf(stdin,), il
faut quand même que l'utilisateur sache si on parle hexa ou décimal. D'ailleurs, un format tel: XXXX:XXXX me semble non seulement possible, mais surtout pas irréaliste du tout. -- Pierre
Vincent Lefevre
Dans l'article <41b80ad6$0$6848$, cedric écrit:
Tiens, il me semblait que la vulgate énoncait cette règle d'or à propos du scanf :
" Scanf pour saisir au clavier en aucun cas n'utiliseras,