Warum muss man bei Strukturen als Parameter oft ihre Größe mitgeben?



  • knivil schrieb:

    Warum muss man bei Strukturen als Parameter oft ihre Größe mitgeben?

    Kannst du mal ein Beispiel geben, denn ich habe das noch nie gemacht.

    bei WinAPI gibts das ziemlich oft. z.B. WNDCLASSEX



  • $ schrieb:

    bei WinAPI gibts das ziemlich oft. z.B. WNDCLASSEX

    Und was hat das mit C++ zu tun oder gar mit C (wohl eher WinAPI) Und wo kann ich nachlesen, wie der Size-Parameter benutzt wird?



  • $ schrieb:

    bei WinAPI gibts das ziemlich oft. z.B. WNDCLASSEX

    Ich denke mal mit Beispiel meinte er ein Code-Beispiel. Ich kann mir vorstellen dass es in C teils nötig ist, wenn structs per void-Pointer oder ähnliche Schweinereien durch die Gegend gereicht werden. In C++ dürfte es unnötig sein.



  • Ich denke mal an der Funktion GetVersionEx kann man es gut sehen: http://msdn.microsoft.com/en-us/library/ms724451

    Es gibt 2 Versionen einer Struktur die man übergeben kann.
    OSVERSIONINFO oder OSVERSIONINFOEX. Die Ex-Version enthält ein paar Felder mehr.

    Die Funktion kann jetzt über das Feld dwOSVersionInfoSize auslesen welche Version übergeben wurde.



  • Naja, ok, mag sein, dass sich die Entwickler was dabei gedacht haben, GetVersion und GetVersionEx anzubieten und dann auch noch mit unterschiedlichen Parametern.



  • Es gibt aber auch Windows-Funktionen, von denen nur eine Version existiert, die aber trotzdem immer die Größe einer Struktur wissen wollen, die an sie übergeben wird. Ich hab mir da gedacht, daß da vielleicht irgendein Hack dahintersteckt, vielleicht eine unvollständige Binärkompatibilät oder sowas.

    Schließlich wäre es, einmal ehrlich gesagt, ein seltames Interface-Design, Versionsnummern auf Größenangaben abzubilden: da würde ich eher eine Aufzählung der möglichen Versionen machen.

    Wäre wirklich fein zu wissen, warum das so ist.



  • Ich kann mir vorstellen dass es in C teils nötig ist, wenn structs per void-Pointer oder ähnliche Schweinereien durch die Gegend gereicht werden.

    So ähnlich hab ich das früher auch gesehen, aber genauer bedacht: diese neuen void-Pointer gibt es nur aus dem Grund, solche Sachen impliziter zu machen als früher.

    Ein Cast von void auf den Struktur-Typ wäre in meinen Anwendungsbereichen ausreichend. Und die Größe des Typs... falls ich die wirklich mal brauche, kann ich sie ja einfach mitcompilen.



  • µngbd schrieb:

    Es gibt aber auch Windows-Funktionen, von denen nur eine Version existiert, die aber trotzdem immer die Größe einer Struktur wissen wollen, die an sie übergeben wird. Ich hab mir da gedacht, daß da vielleicht irgendein Hack dahintersteckt, vielleicht eine unvollständige Binärkompatibilät oder sowas.

    Schließlich wäre es, einmal ehrlich gesagt, ein seltames Interface-Design, Versionsnummern auf Größenangaben abzubilden: da würde ich eher eine Aufzählung der möglichen Versionen machen.

    Wäre wirklich fein zu wissen, warum das so ist.

    Das musst du vermutlich die MS-Jungs selbst fragen. Ich werd das Thema aber auf jeden Fall mal ins WinAPI-Forum verschieben, denn allgemein in C++ ists nicht üblich, offenbar eher eine WinAPI-Marotte oder irgendein C-Hack.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Dadurch kann die API sehen, was für eine Funktion zum Beispiel von der Funktion erwartet wird.
    Neue Felder und Werte können implementiert werden ohne alen Code zu brechen. Programme die den neuen Code mit größerer struct verwenden laufen entsprechend. Genauso wird eine alte API die Funktion mit einem Fehler quitieren, wenn die struct zu groß ist.

    Typischer Kandidat für diese Sachen sind die Datei-Dialoge der COMDLG32 (und andere).

    Gleiches gilt IMHO ach für Daten die per WM_NOTIFY ausgetauscht werden.



  • µngbd schrieb:

    Es gibt aber auch Windows-Funktionen, von denen nur eine Version existiert, die aber trotzdem immer die Größe einer Struktur wissen wollen, die an sie übergeben wird. Ich hab mir da gedacht, daß da vielleicht irgendein Hack dahintersteckt, vielleicht eine unvollständige Binärkompatibilät oder sowas.

    Schließlich wäre es, einmal ehrlich gesagt, ein seltames Interface-Design, Versionsnummern auf Größenangaben abzubilden: da würde ich eher eine Aufzählung der möglichen Versionen machen.

    Wäre wirklich fein zu wissen, warum das so ist.

    Es geht einzig und allein darum, verschiedene Versionen der Strukturen auseinanderhalten zu können.
    Wirklich.
    Ehrlich.

    Dass es dieses "dwSize" Feld auch in einigen structs gibt von denen es sowieso bloss eine Version gibt, liegt einfach daran, dass man ja vorher noch nicht unbedingt weiss, bei welchen structs man neue Versionen brauchen wird, und bei welchen nicht.

    Dass das nicht unbedingt der schönste Weg ist, ist auch klar. Heutzutage hätte man vermutlich einfach zwei oder mehr Funktionen gemacht, wobei die zweite (dritte) dann einfach die zweite (dritte) Version der struct als Parameter bekommt.


Anmelden zum Antworten