Halli - Hallo,
In einem derzeitigen Projekt möchte ich die Position des Mondes am Himmel
numerisch iterativ berechnen. Die Reihen dafür stehen so gut wie, und ich wollte mir schonmal überlegen,
wie das programmiertechnisch umsetzbar ist.
Fakt ist: Extrem viele Rechnungen.
Fakt ist: AutoIt ist.. langsam.. seeehr langsam
Daher dachte ich mir - lager die Rechnungen doch aus, in eine DLL, geschrieben in C.
Nun sind meine Kenntnisse in C extrem gering - unterhalb der Oberfläche.. :p
Da die Funktion sehr viele Parameter braucht und sehr viele Werte zurückgeben soll, habe ich vor, das mit Arrays zu erledigen.
Meine Überlegung war:
Ich übergebe der Funktion in der Dll zwei Pointer:
Einen zu einer Double[n]-struct mit den Startparametern,
einen zu einer leeren Double[m]-struct, in die die Funktion die Endwerte eintragen soll.
Leichter gesagt als getan.
Bisher sieht mein Script folgendermaßen aus:
Spoiler anzeigen
#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]$dll = DllOpen( 'testdll.dll' )
[/autoit] [autoit][/autoit] [autoit]$struct = DllStructCreate( 'double[3];double[3]' )
DllStructSetData( $struct, 1, 123, 1 )
DllStructSetData( $struct, 1, 456, 2 )
DllStructSetData( $struct, 1, 789, 3 )
MsgBox( 0, 'data', DllStructGetData( $struct, 1, 1 ) & @CRLF & _
DllStructGetData( $struct, 1, 2 ) & @CRLF & _
DllStructGetData( $struct, 1, 3) )
$r = DllCall( $dll, 'double:cdecl', 'moonpos', 'double*', DllStructGetPtr( $struct, 1 ), 'double', 5, 'double*', DllStructGetPtr( $struct, 2 ) )
MsgBox( 0, '', @error )
_ArrayDisplay( $r )
MsgBox( 0, '', DllStructGetData( $struct, 2, 1 ) )
DllClose( $dll )
[/autoit]Spoiler anzeigen
Allerdings liefert mir $r [ 0, 0, 5, 0],
d.h. Mpos0x - also die Startwerte - sind in der Funktion nicht angekommen,
und mit den Pointern passt auch etwas nicht. Wobei ein separater Test mit
DllStructGetPtr doch Speicheradressen ausgibt.
Und ich habe leider keine Ahnung, wie dieser Fehler zu beheben ist...
Gruß, limette