Forum: Mikrocontroller und Digitale Elektronik Poninter Problem in GCC


von Henning (Gast)


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.

von Karl H. (kbuchegg)


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.

von Henning (Gast)


Lesenswert?

Schreibfehler, upps!

von Henning (Gast)


Lesenswert?

Ja aber es geht trotzdem. Kann das irgend welche Probleme geben oder 
kann ich da mal drüber hinweg sehen.

von Sven P. (Gast)


Lesenswert?

Hängt in weiten Teilen von der Umsetzung des Compilers ab. Warum behebst 
du das Problem nicht einfach?

von Henning (Gast)


Lesenswert?

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?

von Sven P. (Gast)


Lesenswert?

Welchen 'error' gibts denn?

Das Problem löst du, indem du die Typen anpasst... (frag dich mal 
selber, was jemand dir jetzt antworten sollte..)

von Henning (Gast)


Lesenswert?

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?

von Henning (Gast)


Lesenswert?

IST ES ABER NICHT

von Maxxie (Gast)


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?

von Henning (Gast)


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

von Sven P. (Gast)


Lesenswert?

Mann!

Zeig doch endlich den verdammten Quelltext her. Ist doch so schwer nich 
zu verstehn.

von Henning (Gast)


Lesenswert?

void start_function(unsigned char (*start)(unsigned char event))
{

 function_ptr = start;

}



void execute_event(unsigned char event)
{

 (*function_ptr)(event);

}

von Johann L. (gjlayde) Benutzerseite


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

von Karl H. (kbuchegg)


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
}

von Henning (Gast)


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

von Karl H. (kbuchegg)


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?

von Karl H. (kbuchegg)


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.

von Henning (Gast)


Lesenswert?

Ahja klar jetzt fällt mir das auf stimmt.

Vielen Dank für eure Hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.