Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème avec les pointeurs

3 réponses
Avatar
3dsman
salut a tous.
Je suis entrains de reprendre un programme que j'ai ecris il y a quelque
temps pour l'ameliorer et je suis tombé sur un probleme avec les pointeurs.
Je vais simplifier mon code pour que ce soit pas trop galere a
comprendre :-)

en gros avant j'avais ca:

void toto1(void* Result)
{
Image=(FIBITMAP*) Result;
load(Image);
}
void toto2()
{
FIBITMAP *Image = cree_image_vide();
toto1( &Image);
image->sauve_image();
}


la fonction toto2 crééait une image vide puis appelait toto1 pour la
remplir.
aujourd'hui je dois créer l'image dans toto1 qui doit renvoyer le
resulat a toto2.
donc j'ai essayé un truc comme ca qui evidement ne marche pas:

void toto1(void* Result)
{
Result = load(Image);
}
void toto2()
{
FIBITMAP *Image;
toto1( &Image);
image->sauve_image();
}

la fonction load() crée le FIBITMAP et me renvoie un pointeur dessus.
je ne peut pas retourner le resultat avec return.

quelqu'un aurait une idée?
merci.

3 réponses

Avatar
Serge Paccalin
Le Mon, 06 Dec 2010 17:06:35 +0100, 3dsman a écrit
(dans <news:4cfd0a05$0$13560$, posté
dans fr.comp.lang.c++) :

salut a tous.
Je suis entrains de reprendre un programme que j'ai ecris il y a quelque
temps pour l'ameliorer et je suis tombé sur un probleme avec les pointeurs.
Je vais simplifier mon code pour que ce soit pas trop galere a
comprendre :-)

en gros avant j'avais ca:

void toto1(void* Result)
{
Image=(FIBITMAP*) Result;
load(Image);
}
void toto2()
{
FIBITMAP *Image = cree_image_vide();
toto1( &Image);
image->sauve_image();
}

la fonction toto2 crééait une image vide puis appelait toto1 pour la
remplir.
aujourd'hui je dois créer l'image dans toto1 qui doit renvoyer le
resulat a toto2.
donc j'ai essayé un truc comme ca qui evidement ne marche pas:

void toto1(void* Result)
{
Result = load(Image);
}
void toto2()
{
FIBITMAP *Image;
toto1( &Image);
image->sauve_image();
}

la fonction load() crée le FIBITMAP et me renvoie un pointeur dessus.
je ne peut pas retourner le resultat avec return.

quelqu'un aurait une idée?



Le paramètre de toto1() ne pourrait pas avoir le bon type ? Ou au moins
une classe de base ?

À part ça, j'essaierais un passage par référence dans toto1().

void toto1(void*& Result)
{
FIBITMAP* Image = cree_image_vide();
load(Image);
Result = Image;
}

void toto2()
{
FIBITMAP* Image = 0;
toto1(Image);
Image->sauve_image();
}

--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763
Avatar
Alexandre Bacquart
On 12/06/2010 05:06 PM, 3dsman wrote:
salut a tous.
Je suis entrains de reprendre un programme que j'ai ecris il y a quelque
temps pour l'ameliorer et je suis tombé sur un probleme avec les pointeurs.
Je vais simplifier mon code pour que ce soit pas trop galere a
comprendre :-)

en gros avant j'avais ca:

void toto1(void* Result)
{
Image=(FIBITMAP*) Result;



Cast pas très beau, mais admettons pour l'exemple.

load(Image);
}
void toto2()
{
FIBITMAP *Image = cree_image_vide();
toto1( &Image);



Ici, tu envoies un pointeur sur un pointeur sur l'image (et non pas un
pointeur sur l'image). Enlever le &.

image->sauve_image();
}



La variable Image est déclarée avec un I majuscule. J'en conclus que tu
as simplifié à la main sans vérifier, ce qui est souvent une mauvaise
idée. Tu devrais plutôt poster le code original, ou simplifier en
testant avec le compilo, car on ne sait plus si ton erreur vient d'une
faute de frappe ou autre chose.

la fonction toto2 crééait une image vide puis appelait toto1 pour la
remplir.
aujourd'hui je dois créer l'image dans toto1 qui doit renvoyer le
resulat a toto2.
donc j'ai essayé un truc comme ca qui evidement ne marche pas:

void toto1(void* Result)
{
Result = load(Image);
}
void toto2()
{
FIBITMAP *Image;
toto1( &Image);
image->sauve_image();
}



Mêmes remarques. De plus, le Image dans load(Image) ne pourrait pas
compiler puisque Image n'est pas dans la portée de la fonction.

la fonction load() crée le FIBITMAP et me renvoie un pointeur dessus.
je ne peut pas retourner le resultat avec return.



Pourquoi ?

FIBITMAP *toto1()
{
return load(Image);
}

void toto2()
{
FIBITMAP *Image = toto1();
Image->sauve_image();
}

Mais il y a toujours ce hic avec Image qui n'est pas dans la portée.

quelqu'un aurait une idée?



C'est un problème C avant d'être un problème C++. Peut-être fuir les
pointeurs et utiliser les classes et les références. Le code complet
serait mieux pour faire un diagnostic, car il y a clairement un problème
de conception.


--
Alex
Avatar
espie
In article <4cfd0a05$0$13560$,
3dsman wrote:
salut a tous.
Je suis entrains de reprendre un programme que j'ai ecris il y a quelque
temps pour l'ameliorer et je suis tombé sur un probleme avec les pointeurs.
Je vais simplifier mon code pour que ce soit pas trop galere a
comprendre :-)

en gros avant j'avais ca:

void toto1(void* Result)
{
Image=(FIBITMAP*) Result;
load(Image);
}
void toto2()
{
FIBITMAP *Image = cree_image_vide();
toto1( &Image);
image->sauve_image();
}



Les cast, c'est mal, surtout en C++. Dans ton exemple, on ne comprend vraiment
pas pourquoi tu passes par void *, mais surtout, il y a une erreur de
typage malgre tout, puisque tu termines avec un FIBITMAP** caste en FIBITMAP*

Commence par nettoyer ce bordel ou nous filer un exemple fonctionnel, on
en reparle ensuite.