Forum: Mikrocontroller und Digitale Elektronik Zeiger auf Funktion plötzlich nicht mehr erkannt


von brechbunkt (Gast)


Lesenswert?

Hallo,

ich verwende seit längerem eine Funktion, welche einen Zeiger auf eine 
andere Funktion übergeben bekommt und diesen Zeiger durch einfache 
if-Abfragen vergleicht. Bisher hat es immer funktioniert.
Als Beispiel habe ich unten einen Codeschnippsel mit eingefügt.

Nun wollte ich eine weitere Funktions-/Zeigerabfrage einfügen (im 
Beispiel die Funktion funk_2). Doch das Programm gab dann im laufenden 
Betrieb immer "falsche Funktion" aus, kannte die Adresse vom Zeiger also 
nicht.

Darauf hin habe ich einfach die Reihenfolge der Aufrufe von
1
check_funk( funk_1 );
und
1
check_funk( funk_2 );
vertauscht, und plötzlich ging es wieder.

Auch wenn ich die vertauschten Aufrufe nun wieder Rückgängig mache, geht 
es wieder immer. (Rückgängig mit Strg-Z; war also definitiv kein 
Tippfehler) Den Fehlerfall kann ich nun also nicht mehr reproduzieren.

Kann sich jemand diesen Fehler erklären? Habe ich Zeiger auf Funktionen 
etwa falsch verstanden? Ich möchte ja nicht, dass der gleiche Fehler an 
einer anderen Steller und völlig unerwartet erneut auftritt.

1
void funk_1(void)
2
{
3
}
4
void funk_2(void)
5
{
6
}
7
8
9
// prüfe welcher Funktion-Zeiger übergeben wurde
10
void check_funk( void(*testName) )
11
{
12
    if (testName == funk_1)
13
        printf("es war funk_1");
14
15
    else if (testName == funk_2)
16
        printf("es war funk_2");
17
18
    else
19
        printf("falsche Funktion");
20
}
21
22
void main(void)
23
{
24
    check_funk( funk_1 );
25
    check_funk( funk_2 );
26
}

von Oliver (Gast)


Lesenswert?

brechbunkt schrieb:
> Den Fehlerfall kann ich nun also nicht mehr reproduzieren.
>
> Kann sich jemand diesen Fehler erklären?

Was genau erwartest du jetzt für eine Antwort?

Oliver

von Karl H. (kbuchegg)


Lesenswert?

brechbunkt schrieb:


> void check_funk( void(*testName) )

Den einzigen Fehler den ich sehe ist, dass testName kein Zeiger auf eine 
Funktion ist.

void check_funk( void(*testName)(void) )

Aber ganz ehrlich. Das erste was man tun sollte, wenn man mit 
Funktionszeigern arbeiten will ist, dass man sich einen typedef dafür 
macht


typedef void (*voidFnkt)( void )

Jetzt hast du einen neuen Datentyp, namens voidFnkt, der einen Zeiger 
auf eine Funktion realisiert, wobei die FUnktion keine Argumente nimmt 
und auch nichts liefert.

Und mit diesem neuen Datentyp arbeitet man dann weiter

void check_funk( voidFnkt testName )
{
  ....
}

> Den Fehlerfall kann ich nun also nicht mehr reproduzieren.

Was letzten Endes nur bedeutet, dass du noch irgendetwas anderes 
verändert hast, woran du dich nicht mehr erinnerst. Kommt vor.

von brechbunkt (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Den einzigen Fehler den ich sehe ist, dass testName kein Zeiger auf eine
> Funktion ist.
>
> void check_funk( void(*testName)(void) )

Ah... danke. Da es genauso ein 32Bit-Zeiger sein sollte wie mein 
gewünschter Zeiger auf die Funktion (im 32Bit-System), sollte es sicher 
nichts ändern, aber das hatte ich definitiv falsch gemacht.


> ...sich einen typedef dafür macht...
> typedef void (*voidFnkt)( void )

Danke für den Hinweis.

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.