Re: Some issues with array of pointers to functions
Georg-Johann Lay <[email protected]>
| Newsgroups | gmane.comp.hardware.avr.gcc |
|---|---|
| Message-ID | <[email protected]> |
Am 06/13/2014 12:06 PM, schrieb Royce Pereira:
> Hi all,
>
> Continuing with the latest avr-gcc, and playing with the new '__flash'
> qualifier, I'm facing some new warnings, not seen before.
>
> I have this:
> //===================
> void func1(void)
> {
> //........
> }
> //===================
> void func2(void)
> {
> //........
> }
> //===================
> void func3(void)
> {
> //........
> }
> //===================
>
> __flash void (*funcArray[])(void) = { func1, func2, func3 } ;
>
> //====================
> unsigned char funcNo;
>
> int main(void)
> {
> //...code that sets 'funcNo'
>
> (funcArray[funcNo])() ; //call the desired function from the array.
>
> return 0 ;
> }
> //============================
> /*
> No error is thrown and the code runs fine on the target board too.
>
> But I get the following warnings, and I don't know why :
>
> warning: initialization from incompatible pointer type [enabled by default]
> { func1, func2, func3 } ;
> ^
>
> warning: (near initialization for 'funcArray[0]') [enabled by default]
> warning: initialization from incompatible pointer type [enabled by default]
> warning: (near initialization for 'funcArray[1]') [enabled by default]
> warning: initialization from incompatible pointer type [enabled by default]
> warning: (near initialization for 'funcArray[2]') [enabled by default]
> warning: initialization from incompatible pointer type [enabled by default]
>
> In function 'main':
> warning: function with qualified void return type called [enabled by default]
> (funcArray[funcNo])() ;
Your functions are of prototype "void (*)(void)", not of "void (*)()".
And the return type is "void", not "__flash void"; avr-gcc throws a diagnostic
on this.
If you want to put the array in flash, then put funcArray in flash:
void func1 (void) {}
void func2 (void) {}
void func3 (void) {}
void (* const __flash funcArray[])(void) = { func1, func2, func3 } ;
void run (unsigned char funcNo)
{
funcArray[funcNo] ();
}
Johann