mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Poninter Problem in GCC


Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibfehler, upps!

Autor: Henning (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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..)

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IST ES ABER NICHT

Autor: Maxxie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mann!

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

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void start_function(unsigned char (*start)(unsigned char event))
{

 function_ptr = start;

}



void execute_event(unsigned char event)
{

 (*function_ptr)(event);

}

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
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:
extern unsigned char (*function_ptr) (unsigned char);

void start_function (unsigned char (*start)(unsigned char))
{
    function_ptr = start;
}

void execute_event (unsigned char event)
{
    function_ptr (event);
}

Johann

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
typedef unsigned char (*CallbackFunc)( unsigned char );

CallbackFunc function_ptr;

void start_function( CallbackFunc start )
{
  function_ptr = start;
}

void execute_event(unsigned char event)
{
  (*function_ptr)(event);
}

unsigned char foo( unsigned char event )
{
  return 0;
}

int main()
{
  start_function( foo );
  execute_event( 1 );
}

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
unsigned char show_temperature( unsigned char event )
{
}

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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahja klar jetzt fällt mir das auf stimmt.

Vielen Dank für eure Hilfe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.