INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

LabVIEW Memory Manager



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

19.02.2009, 09:54 (Dieser Beitrag wurde zuletzt bearbeitet: 19.02.2009 10:05 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
LabVIEW Memory Manager
' schrieb:Ich beschäftige mich momentan ein wenig mit den Funktionen für externe Codes. Ich habe eine Datenaufnahme in C++ innerhalb meines LabVIEW Projektes. Dort bekomme ich ein 1dimensionales Ergebnisarray. Ich habe mir überlegt folgendes in meinem Skript einzubauen:
1. Ich reserviere mit über Handles dynamisch Speicher.
2. Ich schreibe das Datenaufnahmearray dort hinein.
3. Ich löse ein Event in meiner LV Eventstruktur aus, welches mir die aufgenommenen Daten übergibt.
4. Ich gebe den Speicher wieder frei.

Soweit ok denk ich mal. Ich habs dann so versucht:
Zu 1.:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>uInt16 **ArrayMemoryHdl;
ArrayMemoryHdl = (uInt16 **)DSNewHClr(sizeof(uInt16)*81920);
</div>
Ein LabVIEW memory handle für u16 sieht aber so aus:

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
struct {
int32 num;
uInt16 elm[0];
} **UInt16Handle;
</div>
und der entsprechende Code um das anzulegen dann:

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
UInt16Handle ArrayMemoryHdl;
ArrayMemoryHdl = (UInt16Handle)DSNewHClr(sizeof(int32) + sizeof(uInt16)*81920);
</div>

resp. noch besser:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
UInt16Handle ArrayMemoryHdl = NULL;
err = NumericArrayResize(uW, 1, (UHandle*)&ArrayMemoryHdl, 81920);
</div>

Zitat:Zu 2.:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>MoveBlock((void*)Datenarray, (UHandle*)ArrayMemoryHdl, 81920);</div>

Das wird dann entsprechend:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
MoveBlock(Datenarray, (*ArrayMemoryHdl)->elm, sizeof(uInt16)*81920);
(*ArrayMemoryHdl)->num = 81920;
</div>
Zitat:Zu 3.:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>PostLVUserEvent(*Value, &ArrayMemoryHdl);</div>

Wär ich jetzt mal nicht ganz sicher ob das denn der Pointer auf das ArrayHandle sein soll oder nur das Handle selber. Natürlich muss die entsprechende UserEvent Refnum nur dereferenziert werden wenn Du sie "by reference" an deine Funktion übergeben hast und muss diese in LabVIEW als Datenelement ein 1D Array of uInt16 haben.

Zitat:Zu 4.:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>DSDisposeHandle((UHandle)ArrayMemoryHdl);</div>

Tra ra! Das stimmt mit fast 100% Wahrscheinlichkeit nicht! Du hast das Handle mit PostLVUserData an LabVIEW übergeben und von da an managed LabVIEW das weiter. Ich habe noch nie Handles mit PostLVUserData verarbeitet aber die Art und Weise wie die Speicherverwaltung in LabVIEW funktioniert lässt mich schwer vermuten dass PostLVUserData alle variable sized Datenelemente ganz einfach erbt.

Zitat:Leider löst mir die Zeile PostLVUserEvent ein Fehler aus das er wohl die Daten an der falschen Stelle im Speicher sucht. Leider verstehe ich nicht warum. Hat von euch jemand eine Idee?

Nicht verwunderlich wenn Du LabVIEW einen Datentyp gibst der so einfach nicht stimmt.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Nachrichten in diesem Thema
LabVIEW Memory Manager - abrissbirne - 18.02.2009, 11:42
LabVIEW Memory Manager - IchSelbst - 19.02.2009, 08:57
LabVIEW Memory Manager - abrissbirne - 19.02.2009, 09:44
LabVIEW Memory Manager - rolfk - 19.02.2009 09:54
LabVIEW Memory Manager - abrissbirne - 19.02.2009, 10:02
LabVIEW Memory Manager - rolfk - 19.02.2009, 10:11
LabVIEW Memory Manager - abrissbirne - 19.02.2009, 12:00
LabVIEW Memory Manager - rolfk - 19.02.2009, 14:57
LabVIEW Memory Manager - abrissbirne - 19.02.2009, 16:53
LabVIEW Memory Manager - rolfk - 19.02.2009, 17:16
LabVIEW Memory Manager - abrissbirne - 19.02.2009, 18:03

Gehe zu: