Poninter Problem in GCC

Gast #1329739
Lesenswert?
• ▲
▼
Mein Compiler gibt mir
../menu.c:13: warning: assignment from incompatible pointer type
aus.

Aber dieser:

unsigned char (*start)(void)

und dieser:

unsigned char (*function_ptr)(unsigned char event)

Poniter sind doch nicht incompatibel.

Was will er von mir ich Blick nicht ganz durch.
#1329741
Lesenswert?
• ▲
▼
Henning schrieb:
> Mein Compiler gibt mir
> ../menu.c:13: warning: assignment from incompatible pointer type
> aus.
>
> Aber dieser:
>
> unsigned char (*start)(void)
>
> und dieser:
>
> unsigned char (*function_ptr)(unsigned char event)
>
> Poniter sind doch nicht incompatibel.

Doch das sind sie.
Die Funktionen auf die sie zeigen haben unterschiedliche Argumentlisten.
Der eine zeigt auf eine Funktion die keine Argumente nimmt, der andere 
auf eine Funktion die einen unsigned char haben will.
Gast #1329771
Lesenswert?
• ▲
▼
Also erstmal fehlt da ein ;

Dann: Wenn du jetzt den Typen einfach in der Dekltartion änderst, taucht 
der Fehler evtl. an einer anderen Stelle auf. Sprich, wo kamen die 
unterschiedlichen Typen ursprünglich her. Hast du an diesem Punkt nun 
Typenprobleme?
Gast #1329773
Lesenswert?
• ▲
▼
Du meinst da wo ich die benutzte ob ich da jetzt Probleme damit habe:
JA.

Und zwar hier mit
    start_function(show_temperature);

main.c:48: warning: passing argument 1 of 'start_function' from 
incompatible pointer type
Persönliche Seite #1329782
Lesenswert?
• ▲
▼
Henning schrieb:
> void start_function(unsigned char (*start)(unsigned char event))
> {
>  function_ptr = start;
> }
>
> void execute_event(unsigned char event)
> {
>  (*function_ptr)(event);
> }

Das gibt des Fehler
1
error: `function_ptr' undeclared (first use in this function)

Du musst function_ptr definieren, so geht das nicht. Der Compiler 
braucht zumindest eine Deklaration dafür. Eine korrekte Deklaration 
sieht zB so aus:
1
extern unsigned char (*function_ptr) (unsigned char);
2

3
void start_function (unsigned char (*start)(unsigned char))
4
{
5
    function_ptr = start;
6
}
7

8
void execute_event (unsigned char event)
9
{
10
    function_ptr (event);
11
}

Johann
#1329785
Lesenswert?
• ▲
▼
Henning schrieb:
> void start_function(unsigned char (*start)(unsigned char event))
> {
>
>  function_ptr = start;
>
> }
>
>
>
> void execute_event(unsigned char event)
> {
>
>  (*function_ptr)(event);
>
> }

und wo ist da jetzt das incompatible Assignment?
Zeig doch bitte kompletten Code! So schwer ist das nicht.
Da gehören auch Datentypen dazu!

Ein Tip:
Bei der Arbeit mit Funktionspointern ist ein typedef meistens eine 
extrem gute Idee
1
typedef unsigned char (*CallbackFunc)( unsigned char );
2

3
CallbackFunc function_ptr;
4

5
void start_function( CallbackFunc start )
6
{
7
  function_ptr = start;
8
}
9

10
void execute_event(unsigned char event)
11
{
12
  (*function_ptr)(event);
13
}
14

15
unsigned char foo( unsigned char event )
16
{
17
  return 0;
18
}
19

20
int main()
21
{
22
  start_function( foo );
23
  execute_event( 1 );
24
}
Gast #1329792
Lesenswert?
• ▲
▼
unsigned char (*function_ptr)(unsigned char event);
ist in der header datei deklariert.

Ich rufe in main das so auf

int main(void)
{

    start_function(show_all);

    for(;;)
    {

     execute_event(event);

    }
}

Und das ist show_all:

void show_all(unsigned char input)
{
 uart_puts("Hallo");
}


Mein Fehler lautet

main.c:48: warning: passing argument 1 of 'start_function' from
incompatible pointer type
#1329796
Lesenswert?
• ▲
▼
Henning schrieb:
> Du meinst da wo ich die benutzte ob ich da jetzt Probleme damit habe:
> JA.
>
> Und zwar hier mit
>     start_function(show_temperature);
>
> main.c:48: warning: passing argument 1 of 'start_function' from
> incompatible pointer type

Da wird dann show_temperature nicht die signatur haben, die des 
Funktionspointer-Argument zu start_function haben will.

Sprich show_temperature wird nicht so aussehen
1
unsigned char show_temperature( unsigned char event )
2
{
3
}

Die Funktion muss schon von der Gestalt sein, die der Funktionspointer 
vorschreibt. Wie soll denn sonst der Compiler die Argumente über den 
Funktionspointer durchschleifen bzw. den Returnwert abholen, wenn das 
nicht zusammenstimmt?
#1329799
Lesenswert?
• ▲
▼
Henning schrieb:
> unsigned char (*function_ptr)(unsigned char event);

function_ptr ist ein Pointer auf eine Funktion.
Diese Funktion übernimmt einen unsigned char und sie liefert einen 
unsigned char als Returnwert.


> Und das ist show_all:
>
> void show_all(unsigned char input)

Diese Funktion übernimmt zwar einen unsigned char, aber sie liefert 
keinen Return Wert. Ergo passt diese Funktion nicht zu der Signatur, die 
der Funktionspointer vorschreibt. Denn der Funktionspointer sagt 
explizit, dass die Funktion einen unsigned char liefern muss.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren