µCFrage schrieb:
> wie ihr seht hab ich es bisher durch eine globale variable gelöst.
> Das geht doch aber auch mit einer übergabe?
Ein Array aus Funktionspointern ist auch nur ein Array wie jedes andere.
Aber: Innerhalb der Funktion ist das Array nicht mehr als C-Array
'vorhanden' sondern du hast nur einen Pointer auf das erste Element des
Arrays.
-> Eine Funktion kann prinzipiell mittels sizeof nicht ermitteln, wie
groß ein Array ist, von dem sie einen Pointer auf den Anfang bekommen
hat. Die Funktion kann noch nicht mal feststellen, ob der Pointer
überhaupt auf ein Array zeigt, oder auf ein einzelnes Element
1 | void foo( int * pI )
|
2 | {
|
3 | // hier ist nicht feststellbar, ob pI auf ein int Array
|
4 | // zeigt, oder auf einen einzelnen int
|
5 | // Beides ist möglich
|
6 |
|
7 | }
|
8 |
|
9 | int main()
|
10 | {
|
11 | int valA[5]; // ein Array von int
|
12 | int j; // ein einzelner int
|
13 |
|
14 | foo( valA ); // ist korrekt
|
15 | foo( &j ); // ist ebenfalls korrekt
|
16 | }
|
und mit einem Array aus Funktionspointern ist das auch nicht anders.
>
1 | > uint8 fpSize= getArrSize(stateArray nFct){
|
2 | > return sizeof(nFct) / sizeof(nFct[0]);
|
3 | > }
|
4 | >
|
>
> Leider leider mag das aber der compiler nicht :\
Logisch, denn
.... (stateArray nFct)
das ist nun mal kein Pointer, sondern ein einzelnes stateArray Objekt
(welches trotz seines Namens ja kein Array ist). Wie willst du daher
davon das Element [0] nehmen?
Nur weil du deinem mittels typedef erzeugten Datentyp einen Namen
gegeben hast, in dem 'Array' vorkommt, ist es das ja noch lange nicht.
Das Array hast du ja erst hier
1 | stateArray myStateArray[]=
|
2 | {
|
3 | ...
|
erzeugt. Du kannst 'stateArray' ja auch durch 'SchnurdirBur' austauschen
1 | typedef void (*SchnurdirBur)(void);
|
2 |
|
3 | ...
|
4 |
|
5 | SchnurdirBur myStateArray[]=
|
6 | {
|
7 | start0,
|
8 | start1,
|
9 | start2,
|
10 | start3,
|
11 | start4,
|
12 | };
|
13 |
|
14 | uint8 fpSize= getArrSize(SchnurdirBur nFct){
|
15 | return sizeof(nFct) / sizeof(nFct[0]);
|
16 | }
|
dann wirds vielleicht etwas klarer, dass du innerhalb der Funktion erst
mal kein Array hast, sondern eben ein SchnurdirBur-Objekt.
Aber wie gesagt: selbst wenn, würde dir das nichts helfen. Denn der
Übergabemechanismus eines Arrays sieht nun mal so aus, dass die
Startadresse des Arrays übergeben wird. Und das hilft dir nichts um die
Größe des Arrays festzustellen.
1 | #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x))
|
2 |
|
3 | ....
|
4 |
|
5 |
|
6 | int main()
|
7 | {
|
8 | uint8 fpSize = ARRAY_SIZE( myStateArray )
|
9 | }
|
und das ganze funktioniert nur dann, wenn myStateArray dann auch
tatsächlich als Array sichtbar ist. Hier ist es das.
So ....
1 | void foo( stateArray* fnctns )
|
2 | {
|
3 | ...
|
4 | }
|
.... ist es das nicht. Da ist es bereits zu einem Pointer degeneriert.