Poninter Problem in GCC

Gast #1329739
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.
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
Und wenn ich anstelle von void z.b.
uint8 event;
einsetze gibts keine warining mehr sondern ein error.

Wie bekomm ich das also weg, wie löse ich das?
Gast
Das Problem sollte doch gelöst sein wenn beide gleich sind also:
unsigned char (*start)(unsigned char event)
unsigned char (*function_ptr)(unsigned char event);
ODER?
Gast
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
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
Gast
void start_function(unsigned char (*start)(unsigned char event))
{

 function_ptr = start;

}



void execute_event(unsigned char event)
{

 (*function_ptr)(event);

}
Persönliche Seite
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
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
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
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?
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.