Forum: Mikrocontroller und Digitale Elektronik ptr-to-funct typ error


von Bernd S. (mms)


Lesenswert?

Hallo,
1
void funct (unsigned char *pchar)        
2
3
struct Struct2 { 
4
5
    void  *ptr; 
6
    //... 
7
}; 
8
9
typedef struct { 
10
11
    struct Struct2   *p 
12
    //... 
13
}Struct1; 
14
15
Struct1 *pstruct; 
16
unsigned char *pchar;   
17
18
19
pstruct->p->ptr = funct(pchar);

Bei der letzten Zeile bekomme ich die Fehlermeldung: "expression must 
have (pointer-to-) function type... was muss ich anders schreiben, damit 
diese nicht mehr auftritt?

gruß
bernd

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich verstehe in deinem Codeschnippsel nicht, was du machen willst. Was 
IMHO hapert ist, deine fehlende Definition des Platzes worauf die vielen 
Zeiger zeigen...

In folgendem Democode ist das nachgeholt und es tritt auch kein Fehler 
beim Übersetzen auf.

Unklar ist mir allerdings, was du in pstruct->p->ptr eintragen willst, 
func(pchar) ist unsinnig, weil diese Funktion ja keinen Rückgabewert 
hat.
1
void funct (unsigned char *pchar);
2
3
struct Struct2 
4
{ 
5
  void  * ptr; 
6
}; 
7
8
typedef struct 
9
{ 
10
  struct Struct2 * p;
11
} Struct1; 
12
13
Struct1 * pstruct; 
14
unsigned char * pchar;   
15
16
void funct (unsigned char *pchar)
17
{
18
}
19
20
21
int main(void)
22
{
23
  // bevor was eingetragen werden kann
24
  // Platz anlegen, WO das eingetragen werden kann
25
  Struct1 s1;
26
  struct Struct2 s2;
27
28
  // korrekt verlinken
29
  pstruct = &s1;
30
  pstruct->p = &s2;
31
32
  // Erst jetzt darf gefahrlos eingetragen werden!
33
34
  // Option 1 - Adresse der Funktion in ptr eintragen
35
  pstruct->p->ptr = funct;
36
37
  // Option 2 - Argument der Funktion in ptr eintragen
38
  pstruct->p->ptr = pchar;
39
40
  // Option 3 - Rückgabewert der Funktion in ptr eintragen 
41
  // (dem widerspricht deine void func... Deklaration)
42
  // pstruct->p->ptr = funct(pchar);
43
44
  return 42;
45
}

von Bernd S. (mms)


Lesenswert?

funct stellt eine normale funktion dar.... (lediglich rückgabewert hat 
sich geändert)
1
short funct (unsigned char *pchar);

global hab ich die beiden structs definiert (im header-file)
1
struct Struct2 
2
{ 
3
  void  * ptr; 
4
}; 
5
6
typedef struct 
7
{ 
8
  struct Struct2 * p;
9
} Struct1;

in der main-function mache ich dann u.a. folgendes
1
Struct1 *pstruct; 
2
  unsigned char *pchar; 
3
4
  (short) (*pstruct->p->ptr)(unsigned char *pchar) = funct; 
5
  if((pstruct->p->ptr)(pchar) != 0);

zuerst möchte ich gern einen funktionspointer ptr auf die funktion funct 
erstellen. Anschließend möchte ich gern die funktion funct aufrufen mit 
dem Übergabewert pchar - der Return-Wert wird in der if-Anweisung 
ausgeführt.

Hier befinden sich jedoch einige Fehler.

gruß
bernd

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Bernd Schuster wrote:
> funct stellt eine normale funktion dar.... (lediglich rückgabewert hat
> sich geändert)
>
> short funct (unsigned char *pchar);

Dann macht die Zuweisung an ptr (ist void *) auch keinen Sinn. Oder 
willst du dass der short Rückgabewert als void * in der Struktur 
gespeichert wird?

> global hab ich die beiden structs definiert (im header-file)
>
> struct Struct2
> {
>   void  * ptr;
> };
>
> typedef struct
> {
>   struct Struct2 * p;
> } Struct1;

Das ist keine Definition sondern es sind zwei Deklarationen.

Du deklarierst nur zwei besondere Datentypen deines Programmes. Zu einer 
Definition gehört, dass Platz eingerichtet wird.

> in der main-function mache ich dann u.a. folgendes
>
> Struct1 *pstruct;
> unsigned char *pchar;
>
> (short) (*pstruct->p->ptr)(unsigned char *pchar) = funct;

Das ist kritisch, weil du in den ersten Beiden Zeilen nur zwei Pointer 
definierst, die sind aber auf NULL initialisiert. D.h. sie zeigen nicht 
auf eine gültige Struktur. Du musst zuerst die Strukturen vom Platz her 
definieren und dann die gier definierten Pointer darauf richten. Dann 
erst darfst du den Pointern etwas zuweisen (oder etwas auslesen).

> zuerst möchte ich gern einen funktionspointer ptr auf die funktion funct
> erstellen.

Also die Option 1 oben.

> Anschließend möchte ich gern die funktion funct aufrufen mit
> dem Übergabewert pchar - der Return-Wert wird in der if-Anweisung
> ausgeführt.
>
>   if((pstruct->p->ptr)(pchar) != 0);
>
> Hier befinden sich jedoch einige Fehler.

So würde es gehen:
1
short funct (unsigned char *pchar);
2
3
struct Struct2 
4
{ 
5
  short (*ptr)(unsigned char *); 
6
}; 
7
8
typedef struct 
9
{ 
10
  struct Struct2 * p;
11
} Struct1; 
12
13
Struct1 * pstruct; 
14
unsigned char * pchar;   
15
16
short funct (unsigned char *pchar)
17
{
18
  return -1;
19
}
20
21
22
int main(void)
23
{
24
  // bevor was eingetragen werden kann
25
  // Platz anlegen, WO das eingetragen werden kann
26
  Struct1 s1;
27
  struct Struct2 s2;
28
29
  // korrekt verlinken
30
  pstruct = &s1;
31
  pstruct->p = &s2;
32
33
  // Erst jetzt darf gefahrlos eingetragen werden!
34
35
  // Option 1 - Adresse der Funktion in ptr eintragen
36
  pstruct->p->ptr = funct;
37
38
  if((pstruct->p->ptr)(pchar) != 0)
39
    return 23;
40
  else
41
    return 42;
42
}

Aber daran denken, dass der Zeiger pchar noch nicht initalisiert ist. 
funct darf daraus nichts herauslesen oder hineinschreiben!

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.