void pointer auf struktur casten



  • Hallo zusammen,

    ich bekomme einen void pointer von einer Funktion zurück, der ein Datum beinhaltet.

    typedef struct date
    {
      char year[4];
      char month[2];
      char day[2];
    }
    

    Diesen möchte ich gerne auf die Struktur date casten. Der void pointer sieht z.B. so aus: 20071231
    Kann es auf unterschiedlichen Betriebssystemen Probleme beim Casten geben?

    Danke schon einmal,
    Froop



  • date *obj;
    obj =(date*)DeineFunktion(..);
    

    so?

    :schland: :schland:

    wenn du deindate objekt in der funktion aufm stack hast , und nen pointer darauf zurück gibts, machts bum?

    wie sieht die funktion denn aus?



  • Froop1 schrieb:

    Kann es auf unterschiedlichen Betriebssystemen Probleme beim Casten geben?

    theoretisch können zwischen den einzelnen struct-members lücken sein, aber wenn du für alles den gleichen compiler verwendest, dann sollte ein cast immer klappen.
    🙂



  • :schland: :schland: :schland: :schland: :schland: :schland: :schland: :schland: :schland: :schland:
    ^^huh`? was soll den dieses blöde ding schon wieder?



  • fricky schrieb:

    Froop1 schrieb:

    Kann es auf unterschiedlichen Betriebssystemen Probleme beim Casten geben?

    theoretisch können zwischen den einzelnen struct-members lücken sein, aber wenn du für alles den gleichen compiler verwendest, dann sollte ein cast immer klappen.
    🙂

    Danke für die Antwort.
    Das Problem habe ich auch befürchtet. Der Code wird auf jeden Fall auf unterscheidlichen Compilern verwendet.

    Froop



  • naja wenn du mit sizeof arbeitst, und padding dekativierst, müsste es auf verschieden compiler laufen



  • BorisDieKlinge schrieb:

    naja wenn du mit sizeof arbeitst, und padding dekativierst, müsste es auf verschieden compiler laufen

    Kannst du mir bitte ein Beispiel nennen?



  • Froop1 schrieb:

    Das Problem habe ich auch befürchtet. Der Code wird auf jeden Fall auf unterscheidlichen Compilern verwendet.

    dann mach statt einer structs ein einzelnes array aus 8 int8_t. arrays haben keine löcher.
    🙂



  • fricky schrieb:

    Froop1 schrieb:

    Das Problem habe ich auch befürchtet. Der Code wird auf jeden Fall auf unterscheidlichen Compilern verwendet.

    dann mach statt einer structs ein einzelnes array aus 8 int8_t. arrays haben keine löcher.
    🙂

    Geht leider nicht, da der struct aus einer anderen Lib vorgegeben ist.

    Danke Froop



  • ich empfehle dir stark, nicht zu casten. strings sollte man im allgemeinen parsen und nicht auf structs casten. ist aber meine persönliche meinung.

    die idee von boris is gut, obwohl ich nicht weiß, wofür er sizeof braucht :-).
    grundsätzliche sollte es aber zwischen compilern keinen unterschied geben, da alle compiler für eine plattform (os, architektur, ...) das gleiche abi verwenden (nicht api). würden sie es nicht, könnte man funktionen, die mit verschiedenen compilern compiliert wurden, nicht gegenseitig aufrufen.

    außerdem könnte man als argument anführen, dass sowas derart unüblich ist, dass du damit den code nicht sehr leserlich machst für andere.

    du könntest verleitet werden, diese methode in anderen situationen auch anzuwenden, da sie hier mit großer wahrscheinlichkeit funktioniert, da deine structs 8 byte lang und damit für so ziemlich jede architektur ohne padding schon passend ist. diese anderen situationen könnten aber andere voraussetzungen haben, sodass das casten nicht funktioniert.

    die frage ist allerdings noch, wieso dir ein void* zurückgeliefert wird. es sollte char* sein, wenn es ein string ist.



  • Vielen Dank für deine Antwort.

    Ich habe jetzt einfach den void pointer Stück für Stück zerlegt. An vielen Stellen triit dies ähnlich auf.
    Die letzte Frage ist schon berechtigt, aber die Bibliothek die ich verwende ist schon etwas krank im Bezug auf die Datentypen. Der void pointer wird hier für alle möglichen Daten verwendet. Ist halt so.

    Danke,
    Froop



  • Der void pointer wird hier für alle möglichen Daten verwendet

    ja es geht in C halt net anderes.. 😉


Anmelden zum Antworten