Cast de pointeurs

zaraki21 Messages postés 31 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 22 avril 2011 - 10 févr. 2010 à 16:20
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 - 12 févr. 2010 à 17:41
Bonjour,

je travaille actuellement sur une application en C/C++ dans laquelle je dois réaliser une fonction qui prend en paramètre un unsigned char*. Dans le code de la fonction je dois utiliser ce paramètre dans une fonction déjà définie (que je peux en aucun changer car propre à un système) sous la forme d'un int* donc je voudrais savoir si c'est possible de faire un cast pour que ça fonctionne correctement ou bien utiliser une variable intermédiaire. A noter également que je ne peux pas changer le type du paramètre, ça doit rester un unsiged char *.

Merci pour vos réponses.

8 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
10 févr. 2010 à 18:07
Tu ne peux pas convertir un char* en int*,
étant donné qu'écrire un int c'est remplir 4 octets,
tandis qu'un char c'est seulement un octet...
donc les 3 octets suivants dans la mémoire seraient corrompus.

par contre tu peux passer par un intermédiaire :

void FunctionB(int*);

void FunctionA(char*a){
int b=(int)a;
FunctionB(&b);
a=(char)b;
...
}
0
zaraki21 Messages postés 31 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 22 avril 2011
10 févr. 2010 à 20:02
Excuse moi tu pourrais me décrire ce que tu mets dans tes deux fonctions au juste ? Merci
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
10 févr. 2010 à 20:11
void FunctionA(char*a)
{
int b = (int) a;
donc b = ADDR(a)
et seulement en compil 32, x64 ne vaut plus rien de bon.

b = *a;
Là oui je comprendrais

ciao...
BruNews, MVP VC++
0
zaraki21 Messages postés 31 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 22 avril 2011
11 févr. 2010 à 08:22
Je comprends pas trop, au final, b n'est pas un int* ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
11 févr. 2010 à 22:59
Tu peux initialiser un int avec un char et inversement.
Il suffit juste d'utiliser un cast.

Tu peux voir le int * comme un tableau d'entier, donc pas de soucis pour ton cast.

Shell
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
12 févr. 2010 à 15:44
Salut,
Ouai, je ne vois pas trop l'intérêt de passe par des variables intermédiaires.

En admettant que tu aies 2 fonctions
void fctSysteme(int*);
void taFct(char *a);

Il suffit de faire comme ceci :
taFct(char *a) {
    //...
    fctSysteme((int*)a);
    //...
}

Un pointeur, qu'il pointe sur un int ou un char, est de 4 octets.

Cordialement, uaip.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
12 févr. 2010 à 16:03
C'était juste pour que la fonction utilisatrice n'aille pas lire 4 octets indument.

ciao...
BruNews, MVP VC++
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
12 févr. 2010 à 17:41
oui, erreur de frappe, fallait lire int b=(int)*a;
0