(09.06.2011 13:18 )Herm schrieb: und bei den Arrays habe ich Arrays mit eingebundenen "Numerischen Bedienelementen" verwendet, da ich nicht weiß, wie groß die Arrays werden und so müssten die Arrays ihre Größe anpassen können. Die Größe der Arrays ist vom eingebundenen Bild abhängig und das wechselt ständig. Alternativ kann ich natürlich die Arrays mit sehr großen Weiten inizialisieren.
Die Arrays müssen vor dem Aufruf in der Grösse anelegt werden die die Funktion maximal benützt. Eine C Funktion kann nicht einfach ein Array eben schnell mal grösser machen wenn das nötig ist. So funktioniert C halt einfach nicht. Das geht nur innerhalb eines spezifischen Frameworks wo sowohl der Aufrufer als auch der Aufgerufene sich ganz spezifisch darauf geeinigt haben, wie Speicher verwaltet wird und so. Das ist bei einer DLL grundsätzlich nicht gegeben, da sie von x-beliebigen Clients aufgerufen werden kann (Delphi, Visual Basic, Borland C, Viusual C, Gnu C application, LabVIEW, etc.) Der kleinste gemeinsame Teiler all dieser Systeme ist dass der Aufrufer für den Aufruf ALLEN Speicher zur Verfügung stellt den die DLL Funktion für Ausgabeparameter benötigt.
Normalerweise muss man die Arrays nicht einfach vorsorgehalber mit sehr grossen Grössen anlegen da man die Funktionen innerhalb eines Kontextes aufruft. In diesem Kontext ist die maximale Grösse meist eindeutig in der Dokumenation erwähnt (so nicht, den entsprechenden Programmierer an eine Schandpfahl binden und dort ein paar Tage schmoren lassen und dann die Komponente weit wegwerfen).
Aber das hier ist leider ziemlich grosses Pech:
* NOTE: histogram, circleList and display are allocated inside the function, so make sure to
* free the corresponding memory to avoid memory leaks!
Das heisst das die DLL Fumktion selber diese Speicher anlegt. Das unterstützt LabVIEW nicht direkt. Zwar kannst Du diese drei Parameter als Pointersized Integers, passed as Pointer definieren aber dann bekommst Du halt nur diesen Pointer zurück. Damit kann LabVIEW selber nichts tun. Wenn Du die Information in diesen Pointern benötigst ist das einzige was Du damit tun kannst, eine andere C Funktion aufrufen um die Daten aus diesem Pointer in ein richtiges LabVIEW Array zu kopieren. Such dazu nach MoveBlock hier, auf lavag.org und forums.ni.com und Du wirst viele Posts mit entsprechenden Informationen finden. Aber ohne etwas BasisverstÄndnis von C und C Pointern wird das eine sehr schmerzhafte Übung.