Fehler: ptr to function type

Hallo,

warum bekomme ich bei folgendem C-Code immer die Fehlermeldung "Expression must have (pointer-to-) function type?

void funct (unsigned char *pchar)

struct Struct2 {

void *ptr;
//…
};

typedef struct {

struct Struct2 *p
//…
}Struct1;

Struct1 *pstruct;
unsigned char *pchar;

pstruct->p->ptr = funct(pchar);

gruß
patrick

Hallo,

warum bekomme ich bei folgendem C-Code immer die Fehlermeldung
"Expression must have (pointer-to-) function type?

Keine Ahnung, da der von Dir gepostete Quelltext
sicher nichts mit besagter Fehlermeldung zu tun
hat.

Grüße

CMБ

hallo,

stimmt ich hab eine zeile vergessen: noch mal alles

die beiden structs:
struct Struct2 {

void *ptr;
//…
};

typedef struct {

struct Struct2 *p;
//…
}Struct1;

die funktion:
short funct (unsigned char *pchar)

und die main funktion:
(short) (*pstruct->p->ptr)(unsigned char *pchar) = funct;
if((pstruct->p->ptr)(pchar) != 0);

mit der ersten Zeile möchte ich gern, dass der void pointer ptr als Funktionspointer auf die Funktioni funct erstellt wird. Und in der zweiten Zeile soll diese Funktion aufgerufen werden

gruß
patrick

Hallo,

(short) (*pstruct->p->ptr)(unsigned char *pchar) = funct;
if((pstruct->p->ptr)(pchar) != 0);

mit der ersten Zeile möchte ich gern, dass der void pointer
ptr als Funktionspointer auf die Funktioni funct erstellt
wird. Und in der zweiten Zeile soll diese Funktion aufgerufen
werden

Ach so. Das ist aber nichts für Schattenparker.
Das kann normalerweise nur das wirkliche
Programmierer-Urgestein. Etwa so müßte das
aussehen:

 ...
 (short(\*)(unsigned char \*))pstruct-\>p-\>ptr = funct;
 if( ((short(\*)(unsigned char \*))pstruct-\>p-\>ptr)(pchar) != 0 )
 ...
 ...

Und nicht vergessen, den Speicherplatz für
die Zeiger auf die Strukturen vorher explizit
zu alloziieren:

 ...
 Struct1 \*pstruct = (Struct1 \*) malloc( sizeof(Struct1) );
 pstruct-\>p = (struct Struct2 \*) malloc( sizeof(struct Struct2) );
 ...

Grüße

CMБ

Hallo,

Ach so. Das ist aber nichts für Schattenparker.
Das kann normalerweise nur das wirkliche
Programmierer-Urgestein. Etwa so müßte das
aussehen:


(short(*)(unsigned char *))pstruct->p->ptr = funct;
if( ((short(*)(unsigned char
*))pstruct->p->ptr)(pchar) != 0 )

vielen dank für deine Antwort. Bekomme noch eine Warnung bezüglich eines „nonstandard cast values“ bei

(short(\*)(unsigned char \*))pstruct-\>p-\>ptr = funct;

gruß
patrick

Hallo,

Bekomme noch eine Warnung bezüglich eines
„nonstandard cast values“ bei

(short(*)(unsigned char *))pstruct->p->ptr = funct;

Welcher Compiler?

Grüße

CMБ

Hallo,

Bekomme noch eine Warnung bezüglich eines
„nonstandard cast values“ bei

(short(*)(unsigned char *))pstruct->p->ptr = funct;

Welcher Compiler?

ich verwende den Keil Compiler.

gruß
patrick

Hallo,

Bekomme noch eine Warnung bezüglich eines
„nonstandard cast values“ bei

(short(*)(unsigned char *))pstruct->p->ptr = funct;

Welcher Compiler?

ich verwende den Keil Compiler.

Früher konnte man void* zu/von jeglichem Zeiger
konvertieren (also einfach " pstruct->p->ptr=funct"),
laut ISO-C geht das aber nicht mehr.

Mein gcc-4.3 spuckt dazu folgende Erkenntnis aus:

 pstruct-\>p-\>ptr=funct;/\* ISO C forbids assignment between \*/
 /\* function pointer and void\* \*/
 if( ((short(\*)(unsigned char \*))pstruct-\>p-\>ptr)(pchar) != 0 ) /\* ISO C forbids \*/
 puts("returned!=0"); /\* conversion of object pointer to function pointer type \*/

Warum musst Du denn unbedingt einen void *ptr;
in der inneren Struktur haben? Gänge nicht
ein void(*ptr)(); - das wäre ein Funktionszeiger,
wohinein sich Dein Funktonstyp standardgerecht
konvertieren ließe.

Grüße

CMБ

Hallo,

Früher konnte man void* zu/von jeglichem Zeiger
konvertieren (also einfach " pstruct->p->ptr=funct"),
laut ISO-C geht das aber nicht mehr.

Mein gcc-4.3 spuckt dazu folgende Erkenntnis aus:

pstruct->p->ptr=funct;/* ISO C forbids assignment
between */
/* function pointer and void* */
if( ((short(*)(unsigned char *))pstruct->p->ptr)(pchar)
!= 0 ) /* ISO C forbids */
puts(„returned!=0“); /* conversion of object pointer to
function pointer type */

Warum musst Du denn unbedingt einen void *ptr;
in der inneren Struktur haben? Gänge nicht
ein void(*ptr)(); - das wäre ein Funktionszeiger,
wohinein sich Dein Funktonstyp standardgerecht
konvertieren ließe.

hab ich ausprobiert - jedoch ohne Erfolg… bekomme immer noch die gleiche Fehlermeldung

void (\*ptr)();

Fehlermeldung: nonstandard cast on lvalue

(short(\*)(unsigned char \*))pstruct-\>p-\>ptr = funct;

gruß
patrick

Hallo,

Warum musst Du denn unbedingt einen void *ptr;
in der inneren Struktur haben? Gänge nicht
ein void(*ptr)(); - das wäre ein Funktionszeiger,
wohinein sich Dein Funktonstyp standardgerecht
konvertieren ließe.

hab ich ausprobiert - jedoch ohne Erfolg… bekomme immer noch
die gleiche Fehlermeldung

void (*ptr)();

Fehlermeldung: nonstandard cast on lvalue

(short(*)(unsigned char *))pstruct->p->ptr =
funct;

Was ist dann (bei void (*ptr)():wink: mit einem
simplen:

 pstruct-\>p-\>ptr = funct;

Sogar gcc-4.3 warnt dann mit -pedantic nur
noch vor einem „assignment from incompatible pointer type“
erzeugt aber ein lauffähiges Programm.

Mir ist nicht ganz klar, was Du bezweckst.
Vielleicht könnte man das Ziel auf einfacher
erreichen?

Ausserdem kann man sich mit einen ‚typedef‘
das Leben erleichtern:

 #include 
 #include 

 typedef short (\*FUNCPTR)(unsigned char \*pchar);

 short funct (unsigned char \*pchar) { return pchar ? 1 : 0; }

 struct Struct2 {
 FUNCPTR ptr;
 };

 typedef struct { 
 struct Struct2 \*p; 
 } Struct1;
 
 int main()
{
 unsigned char \*pchar = (unsigned char\*)"TEXT";
 Struct1 \*pstruct = (Struct1 \*) malloc( sizeof(Struct1) );

 pstruct-\>p = (struct Struct2 \*) malloc( sizeof(struct Struct2) );
 pstruct-\>p-\>ptr = funct;

 if( pstruct-\>p-\>ptr(pchar) != 0 )
 puts("returned != 0"); 

 return 0;
}

Grüße

CMБ

Hallo,

Fehlermeldung: nonstandard cast on lvalue

(short(*)(unsigned char *))pstruct->p->ptr =
funct;

Was ist dann (bei void (*ptr)():wink: mit einem
simplen:

pstruct->p->ptr = funct;

Sogar gcc-4.3 warnt dann mit -pedantic nur
noch vor einem „assignment from incompatible pointer type“
erzeugt aber ein lauffähiges Programm.

das programm an sich läuft mit deiner Hilfe auch - dachte nur man könnte vielleicht die Warnung noch elminieren…

Mir ist nicht ganz klar, was Du bezweckst.
Vielleicht könnte man das Ziel auf einfacher
erreichen?

Im Prinzip stellt stellt die zweite Struct im richtigen Programm ein Struct Array dar; so dass es auch mehrere Funktionen gibt, die aufgerufen werden können (mit dem Funktionspointer) - alle Funktionen besitzen die gleichen Parameter (Übergabe + Return-Wert).

Ausserdem kann man sich mit einen ‚typedef‘
das Leben erleichtern:

das ist richtig - werd ich sofort machen -> dadurch wird das Programm auch übersichtlicher in der Deklaration.

Vielen Dank für deine Hilfe.

gruß
patrick

Hallo,
[…]
vielen dank für deine Antwort. Bekomme noch eine Warnung
bezüglich eines „nonstandard cast values“ bei

(short(*)(unsigned char *))pstruct->p->ptr =
funct;

Es sind gar keine casts nötig, wenn man anständige Typ-deklarationen macht, so in der Art:

typedef short (\*MyFunc)(const unsigned char\*);
// ich hab mal ein const-char gemacht, das sollte man bei reinen
// input-strings immer machen.

typedef struct {
 MyFunc ptr;
 // nochmal dasselbe, nur unübersichtlicher geschrieben:
 // short (\*ptr)(const unsigned char\*);
} MyStruct;

short ARealFunction(const unsigned char\* pchar);
short AnotherRealFunction(void);

int main(void) {
 MyStruct aRealStruct;

 aRealStruct.ptr = ARealFunction;
 // test auf NULL 
 if (aRealStruct.ptr != 0) { }
 // Aufruf der Funktion
 aRealStruct.ptr("Boo");

 // wenn du unbedingt zwei nicht-gleiche Dinge einander
 // zuweisen willst, dann indem man die \*rechte\* Seite castet:
 aRealStruct.ptr = (MyFunc)AnotherRealFunction;
 // Aufruf nach wie vor:
 aRealStruct.ptr("Doo");
 // Aber von solchen casts sollte man m.M. die Finger lassen, solange
 // man nicht ganz genau weiss, was man tut.

 return 0;
}