Calling a function using its pointer-

S

Samie

Hi
I have declared a structure that contains pointer to a function. The
code goes like this:
typedef struct lcd_funs lcd_funs;
struct lcd_funs {
void (*decode_image)(cyg_uint32 imageWidth,
cyg_uint32 imageHeight,
Palette_element *paletteData,
cyg_uint8 *imageData,
cyg_uint16 bitsPerPixel
);
};

Now, suppose, I have a variable funs that is pointer to a structure of
this type. When I try to call this function using the code below, it
hangs up. Any idea why it is happening like this? The code used to
call it as follows:
(funs->decode_image)(ptrConfigOptions->imageWidth,
ptrConfigOptions->imageHeight,
ptrConfigOptions->paletteData,
ptrConfigOptions->imageData,
ptrConfigOptions->bitsPerPixel
);
Is it the right way to call functions using their pointers that are
members of a structure?

Regards
Samie
 
J

Jens.Toerring

Samie said:
I have declared a structure that contains pointer to a function. The
code goes like this:
typedef struct lcd_funs lcd_funs;
struct lcd_funs {
void (*decode_image)(cyg_uint32 imageWidth,
cyg_uint32 imageHeight,
Palette_element *paletteData,
cyg_uint8 *imageData,
cyg_uint16 bitsPerPixel
);
};
Now, suppose, I have a variable funs that is pointer to a structure of
this type. When I try to call this function using the code below, it
hangs up. Any idea why it is happening like this? The code used to
call it as follows:
(funs->decode_image)(ptrConfigOptions->imageWidth,
ptrConfigOptions->imageHeight,
ptrConfigOptions->paletteData,
ptrConfigOptions->imageData,
ptrConfigOptions->bitsPerPixel
);
Is it the right way to call functions using their pointers that are
members of a structure?

Yes, but you don't need the parentheses around the 'funs->decode_image'
bit. Why it hangs is a different question. First possibility to get
it wrong is not assigning the correct pointer to the 'decode_image'
member of the structure. Second possibility is that the function isn't
working as you expect it to. Did you try to use a debugger to see if
the function gets called at all (e.g. by setting a breakpoint at the
very start of it) and then to see what happens inside of it?

Regards, Jens
 
E

Eric Sosman

Samie said:
Hi
I have declared a structure that contains pointer to a function. The
code goes like this:
typedef struct lcd_funs lcd_funs;
struct lcd_funs {
void (*decode_image)(cyg_uint32 imageWidth,
cyg_uint32 imageHeight,
Palette_element *paletteData,
cyg_uint8 *imageData,
cyg_uint16 bitsPerPixel
);
};

Now, suppose, I have a variable funs that is pointer to a structure of
this type. When I try to call this function using the code below, it
hangs up. Any idea why it is happening like this? The code used to
call it as follows:
(funs->decode_image)(ptrConfigOptions->imageWidth,
ptrConfigOptions->imageHeight,
ptrConfigOptions->paletteData,
ptrConfigOptions->imageData,
ptrConfigOptions->bitsPerPixel
);
Is it the right way to call functions using their pointers that are
members of a structure?

The call looks all right to me. Have you actually
set the `decode_image' element to point at a function
of the appropriate type?

void decode_jpeg_image( /* prototype here */ );
void decode_tiff_image( /* prototype here */ );
...
if (jpeg_rulez)
funs->decode_image = decode_jpeg_image;
else
funs->decode_image = decode_tiff_image;
...
funs->decode_image( /* argument values here */);

If `decode_image' is in fact pointing to the function
you expect (you could insert a printf() at the start of
that function to be sure you get there), then your "it
hangs up" problem has some other cause.
 
B

Buzzard

before you use the call funs->decode_image,you must do this as follow:
funs=(lcd_funs *)malloc(sizeof(lcd_funs));
 
J

Jens.Toerring

Please don't toppost.
before you use the call funs->decode_image,you must do this as follow:
funs=(lcd_funs *)malloc(sizeof(lcd_funs));

Not necessarily. If the structure is defined and initialized e.g. in
some function and then a pointer to it is passed to some other function,
where funs->decode_image() is called, no dynamic allocation is required.
BTW, even if an allocation would be needed the cast of the return
value of malloc() is superfluous, it will just keep the compiler from
complaining if you forgot to include <stdlib.h>.

Regards, Jens
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top