Forum: Compiler & IDEs struct mit Funktionspointer; Funktionsaufruf macht Ärger


von Tobias W. (tobiasw)


Lesenswert?

Servus,

ich komme direkt zur Sache. Ich habe das Gefühl ich mache beim Aufruf 
meiner Funktionen einen Fehler, denn irgendwie scheint es als würde 
keine der Funktionen aufgerufen. Geht um eine ganz einfach 
UART-Befehls-Ausführung (welche noch größer wachsen soll):
1
#include <stdint.h>
2
#include <avr/io.h>
3
#define BAUD 9600
4
#include <util/setbaud.h>
5
6
uint8_t foo1( uint8_t *d )
7
{
8
  UDR0 = *d;
9
  return *d;
10
}
11
uint8_t foo2( uint8_t *d )
12
{
13
  UDR0 = d[0] + d[1];
14
  return d[0] + d[1];
15
}
16
uint8_t foo3( uint8_t *d )
17
{
18
  UDR0 = d[1];
19
  return d[1];
20
}
21
22
typedef struct {
23
  uint8_t length;          // anzahl der Parameter
24
  uint8_t  (*f)(uint8_t *data);  // Funktionspointer mit pointer auf Parameter
25
} command_t;
26
27
uint8_t buf[3];
28
const command_t commands[3] =  // fixe liste, da wird sich nie was ändern, daher const
29
  {
30
    { 1, foo1 },
31
    { 2, foo2 },
32
    { 2, foo3 }
33
  };
34
35
36
int main(void)
37
{
38
  
39
  //init
40
  DDRD = (1<<1);
41
  UBRR0  = UBRR_VALUE;
42
  UCSR0C  = (1<<UCSZ00) | (1<<UCSZ01);  // asynchronous 8n1 Mode
43
  UCSR0B  = (1<<RXEN0) | (1<<TXEN0);    // Enable Receiver and Transmitter
44
45
  
46
  uint8_t i = 0;
47
  while(1)
48
  {
49
    if( UCSR0A & (1<<RXC0) )
50
    {
51
      buf[i] = UDR0;
52
      i++;
53
      if( i>0 && i == commands[ buf[0] ].length )
54
      {
55
        i=0;
56
        (*commands[ buf[0] ].f)( &buf[1] );
57
      }
58
    }
59
  }
60
}

Ich wollte euch als kurz fragen ob denn der Funktionsaufruf
1
 (*commands[ buf[0] ].f)( &buf[1] );
 so überhaupt richtig ist oder ob ich da gravierend was falsch mache, 
und wenn ja was.

Vielen Dank schonmal
Gruß
Tobias

von g457 (Gast)


Lesenswert?

> (*commands[ buf[0] ].f)( &buf[1] );
   ^
Wenn meine Brille nicht zu verdreckt ist dann ist da ein Asterisk zu 
viel.

von Tobias W. (tobiasw)


Lesenswert?

aber will ich denn nicht die Funktion, die dahinter steckt aufrufen?
ich will ja nicht die Adresse ausführen... oder doch?

von Rolf Magnus (Gast)


Lesenswert?

Es spielt keine Rolle. Bei Funktionszeigern ist das äquivalent. Du 
kannst also vor den Funktionsnamen soviele '*' oder auch '&' machen, wie 
du willst. Die meisten machen deshalb gar nichts davor.

von Tobias W. (tobiasw)


Lesenswert?

Also der Aufruf ist dann also richtig... Der Fehler muss dann irgendwo 
anders stecken. Ich glaub ich hol mal mein Oszi.

Danke euch. Hab wieder was gelernt und bin damit dann auch weiter 
gekommen.
Gruß Tobi

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Tobias Weilenbach schrieb:
>         (*commands[ buf[0] ].f)( &buf[1] );

Warum denn nicht einfach so?
1
         commands[buf[0]].f (&buf[1]);

Per Funktionszeiger kann man syntaktische genauso aufrufen wie direkt 
per Symbol.

von Klaus (Gast)


Lesenswert?

Tobias Weilenbach schrieb:
> denn irgendwie scheint es als würde
> keine der Funktionen aufgerufen.

Einen Breakpoint auf die Funktion setzen und schauen ob er kommt?

MfG Klaus

von Tobias W. (tobiasw)


Lesenswert?

Klaus schrieb:
> Einen Breakpoint auf die Funktion setzen und schauen ob er kommt?

Dafür war das Senden per UART gedacht. UDR0 = ...
Der Fehler war jetzt dann doch Blöder als Trivial. Beim Löten muss sich 
das Pad eines Schutzwiderstandes in der TX-Leitung des µC von der 
Leiterbahn getrennt haben. Am Port-Pin lag das Signal noch an, am 
Widerstand nimmer. Leiterbahn aufkratzen und Brücke setzten hat 
geholfen. So nen Mist.

Trotz alle dem, hab ich wieder was gelernt, Danke.

Gruß Tobi

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.