Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » void pointer + function pointer

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.01.2004, 11:14 Uhr
~Klemo
Gast


Hallo zusammen,

folgendes Problem (vereinfacht):

es gibt mehrere Funktionen foglenden Typs:
void <Funktionsname> (int <parameter>);

zusätzlich einen Fkts.zeiger der auf eine der obigen Fkt. gesetzt werden kann:
void (*zeiger) (int) = <Funktionsname_x>;

dieser Zeiger soll nun einer Funktion als Parameter übergeben werden, die einen Zeiger auf void * erwartet:
void func (int i, void * pointer);

also:
...
func(0, (void *)zeiger);

der cast des Funktionszeigers auf einen void-Pointer führt aber zu einem Compilerfehler.

Und das ist mein Problem: ist der Code nicht zulässig oder ist der Compiler falsch?

Auszug aus K&R-C: jedes Objekt kann auf einen void-Zeiger (void *) gecastet werden, ohne das Information verloren geht.

Muss das heissen "...jedes Objekt, ausser Funktionszeiger..."

bin dankbar für jede Anregung
Klemo

P.S: ich weiss selbst das man void * nicht verwenden soll, aber die Funtkion hat nun mal diese API und daran kann ich nichts drehen!

Dieser Post wurde am 20.01.2004 um 11:39 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.01.2004, 11:27 Uhr
KaraHead



Bin zwar nicht sicher ob ich dir helfen kann aber zeig doch mal den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.01.2004, 12:02 Uhr
~Klemo
Gast


den Originalcode kann ich hier nicht posten, hier ist mal das Prinzip

C++:
#include <stdio.h>
#include <stdlib.h>

void function (int i, void * adress);
void CBfunction (int i);
typedef void (* zeiger_t) (int);

int main(int argc, char *argv[])
{
  zeiger_t zeiger = NULL;
  int i = 0;
  
  zeiger = CBfunction;
  function(i, (void *)zeiger);   <--- hier hakt´s
  
  system("PAUSE");    
  return 0;
}

void function (int i, void * adress)
{
    zeiger_t zeiger;
    
    i = 20;
    zeiger = (zeiger_t)adress;
    zeiger(i);
}

void CBfunction (int i)
{
    printf("%d\n", i);
}


das ganze läuft auf einem Motorola Star12 µC mit einem Cosmic Compiler, am PC funzt es

werd jetzt mal den Support bemühen


Bearbeitung von loddab:
cpp-Tags gesetzt. Denk das nächste mal bitte selber dran

Dieser Post wurde am 20.01.2004 um 12:22 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2004, 12:45 Uhr
virtual
Sexiest Bit alive
(Operator)


Vom Standard her ist alles okay, dh ist eher ein Compiler Problem.
Der cast (void*) ist überflüssig, was passiert, wenn Du ihn fortlässt?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.01.2004, 18:20 Uhr
~Klemo
Gast


der cast ist wichtig, ansonsten stimmen die parameter nicht

problem ist gelöst, es liegt daran dass der cosmic compiler funktionszeiger als 32bit interpretiert und casts auf (void *) als 16 bit. Dabei gehen dann 8 bit bzgl der banked information verloren, ein einfaches (@far void *) sorgt für abhilfe.

das Problem tritt nur bei embedded sw auf, aufm PC gibts keine Probleme, da man hier einen 32 bit prozessor hat

so/long
Klemo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: