DLL: String übergeben und wieder ausgeben..woran scheiterts?
1) LabVIEW ist nicht inherent langsam. Strings immer wieder aneineanderfügen schon. Das hat mit der Art des Memorymanagements zu tun. Ich bezweifle dass Du mit externem C Code sehr viel verbessern kannst, da Du bei vielen Stringconcatenations halt nun einmal oft den Speicher reallozieren musst, oder Du musst von Beginn an mit einem Riesenblock arbeiten in den Du dann die Information nach und nach hineinfüllst. Die grösste Zeit geht nämlich im DSSetHandleSize() oder Anverwandten wie NumericArrayResize() verloren und solange Du das nicht prinzipiel eliminierst wirst Du auch mit C Programmierung keinerlei Zeitgewinn machen.
Grundsätzlich lässt sich aber das Allozieren eines grossen Blockes ganz zu Beginn und dann das Einfüllen der entsprechenden SubDaten in diese, auch ganz in LabVIEW machen. Shift Register in einer Loop und Arrayoperationen sind das Schlüsselwort hinzu. Ist zwar nicht mehr so einfaches LabVIEW Programmieren aber in C machst Du ja auch nichts anderes und schnelleres Programmieren davon in C geht meist auch nicht, ausser Du bist ein richtiger C Crack der fehlerfreien C Source Code noch im Schlaf träumt.
2) Du lässt nicht sehen wie Du diese Funktion in LabVIEW aufrufst. Der void *LVHandle Parameter is auch unschön. Dies sollte LStrHandle LVHandle sein oder LStrHandle *LVHandle, je nachdem ob Du den Parameter als LabVIEW Stringhandle "passed as Handle" oder "passed as Pointer to Handle" konfiguriert hast. Wenn Du es als Pointer zu einem Handle konfigurierst, musst Du aber damit Rechnung tragen, dass LabVIEW Dir einen NULL Pointer reinschickt, wenn es ein leeres Handle betrifft. NumericArrayResize() kann damit umgheen. DSSetHandleSize() aber nicht da Du kein nicht existentes Handle resizen kannst. Dann musst Du explicit auf ein NULL Handle testen und in dem Fall DSNewHandle() benützen.
Dein Beispiel sollte besser so ausschauen, auch wenn dies nicht sinnvoll ist:
[code]#include "extcode.h"
__declspec (dllexport) MgErr summieren(LStrHandle *LVHandle, char *ixx)
{
|