Struct in Struct

  • Hallo,

    ich habe diese beiden Structs


    und möchte sie gerne in dieses einfügen

    Code
    typedef struct CvBox2D
    {
        CvPoint2D32f center;  /* Center of the box.                          */
        CvSize2D32f  size;    /* Box width and length.                       */
        float angle;          /* Angle between the horizontal axis           */
                              /* and the first side (i.e. length) in degrees */
    }
    CvBox2D;


    Natürlich alles unter AutoIt.
    Ich hab es schon probiert wie in BugFix's Tut.
    Aber ich bekomme im @error wegen unbekannten Datentyp.

    Wie funktioniert das und wie greift man dann darauf zu?

  • Hi,

    um sowohl die eingebetteten als auch die gesamte Struct benutzen zu können, würde ich es so machen:

    Spoiler anzeigen
    [autoit]

    $CvBox2D=dllstructcreate("STRUCT Center;float x;float y;ENDSTRUCT Center;STRUCT size;float width;float height;ENDSTRUCT size;float angle;")

    [/autoit] [autoit][/autoit] [autoit]

    $CvPoint2D32f=dllstructcreate("float x;float y",DllStructGetPtr($CvBox2D))
    $CvSize2D32f=dllstructcreate("float width;float height",DllStructGetPtr($CvBox2D,"width"))

    [/autoit] [autoit][/autoit] [autoit]

    dllstructsetdata($CvBox2D,"y",1.234); Box-Struct beschreiben

    [/autoit] [autoit][/autoit] [autoit]

    $y=dllstructgetdata($CvPoint2D32f,"y"); Point Struct lesen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $y = ' & $y & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    dllstructsetdata($CvSize2D32f,"width",1234);Size-Struct beschreiben

    [/autoit] [autoit][/autoit] [autoit]

    $width=dllstructgetdata($CvBox2D,"width");Box-Struct lesen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $width = ' & $width & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    viel schöner wäre es natürlich, wenn man direkt auf z.B. die Center-Struct zugreifen könnte

    [autoit]

    dllstructsetdata($CvBox2D,"Center",1.234,2); y in der Box-Struct beschreiben

    [/autoit]
  • Hi,
    das kannte ich schon :thumbup:
    Allerdings bekam ich beim Testen der _DllStructDisplay() von Ascend4nt Fehlermeldungen, bzw. Errors, denen ich nicht unbedingt nachgehen wollte ;)
    Aber "altmodisch" gehts ja auch :P

    Btw. was ist (ausser alignment) eigentlich der tiefere Sinn der STRUCT/ENDSTRUCT -Konstruktion, wenn man diese nicht nutzen kann, um z.B. wie oben angesprochen, über den Namen auf eingebettete Strukturen zuzugreifen?

  • Allerdings bekam ich beim Testen der _DllStructDisplay() von Ascend4nt Fehlermeldungen, bzw. Errors, denen ich nicht unbedingt nachgehen wollte ;)


    Naja, das Ergebnis ist nicht ganz mit Funktionen für normale DLLStructs kompatibel. Nur der Pointer ist problemlos nutzbar.

    Btw. was ist (ausser alignment) eigentlich der tiefere Sinn der STRUCT/ENDSTRUCT -Konstruktion, wenn man diese nicht nutzen kann, um z.B. wie oben angesprochen, über den Namen auf eingebettete Strukturen zuzugreifen?


    Das wurde nur für korrektes Alignment eingeführt, z.B. benötigt bei 64bit der NMHDR in WM_NOTIFY.