' schrieb:Hallo,
ich dachte ich hätte so langsam das Prinzip von Handles verstanden, aber eine neue Aufgabe hat mit gezeigt das ich wohl doch noch nicht ganz durchgestiegen bin.
Mein Problem:
Ich möchte Speicherplatz reservieren. Dazu verwende ich LV Memory Manager Funktionen. Über eine externe Bibliothek soll diese Platz beschrieben werden. Die Funktion die ich aufrufe erwartet als Übergabewert einen Daten-Pointer (DataPtr specifies a physical address that points to the data). Mein Handle besteht ja aus einem Master-Pointer der wiederum auf eine Liste von Pointern sieht. Ich dachte mir eigentlich es müsste irgendwie so funktionieren &(*Handle)->value. Wie kann ich also aus meinem Handle den Datenpointer extrahieren?
Danke, eure abrissbirne
Nochmal zum bessern Verständnis:
Ich befasse mich mit einer Datenaufnahme, welche über eine Bibliothek in C++ abläuft. Hier gibt es die Möglichkeit eine Funktion zu verwenden, die mir in einen von mir allocierten Speicherbereich Daten hineinschreibt. Diese Funktion erwartet von mir einen Daten-Pointer (siehe oben).
Ich bin nun folgendermaßen vorgegangen:
Ich reserviere mir Speicher mittels der Funktion DSNewHandle.
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>struct {
int32 dimSize[2];
uInt16 elmements;
} **UInt16Handle;
UInt16Handle MemoryHdl;
MemoryHdl = (UInt16Handle)DSNewHClr(sizeof(uInt16)*SizeX*SizeY);
</div>
Habs alternativ auch so versucht:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>struct {
int32 dimSize[2];
uInt16 elmements;
} **UInt16Handle;
UInt16Handle MemoryHdl = NULL;
NumericArrayResize(uW, 2, (UHandle*)&MemoryHdl, SizeX*SizeY);
(*MemoryHdl)->dimSize[1] = SizeX;
(*MemoryHdl)->dimSize[2] = SizeY;
</div>
Die Funktion aus der Bibliothek sieht in etwa so aus:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>CreateBuffer(SystemID, long SizeX, long SizeY, long Type, Attribute, long ControlFlag, long Pitch, void *DataPtr, BufferID);</div>
System ID: ergibt sich aus nach dem Verbindungsaufbau mit der Karte (OK)
SizeX: Ist ebenso kein Problem und wird aus einer Datei ausgelesen (OK)
SizeY: siehe SizeX
Type: UInt16 (OK)
Attribute: Können aus einer Liste gewählt werden (OK)
ControlFlag: PHYSICAL_ADDRESS (Specifies that DataPtr is a physical address that points to the data) (OK)
Pitch: Abstand zwischen zwei Zeilen des Arrays (Kann in Bildpunkten und Bytes angegeben werden). Entspricht quasi meinem SizeX (OK?)
DataPtr: Hier muss nun aus dem Handle der Datenpointer extrahiert werden. (NICHT OK)
BufferID: Ergibt sich wieder aus dem vorherigen Programmablauf (OK)
Diese Funktion sollte nun laut Beschreibung die Daten direkt in den von mir reservierten Speicher schreiben. Leider funktioniert es bis jetzt nicht.
Danke, eure abrissbirne