(04.07.2013 16:05 )lupus022 schrieb: Wenn ich derartige Arrays mit dem LV Memory Manager erstelle, dann habe ich doch immer noch das Problem, dass sie sich auflösen, sobald die Funktion wieder beendet wird, oder nicht (Was damit an der Situation nichts ändern würde)?
Ach ja, noch eine Frage: Wie erstelle ich denn ein 2D-Long-Array in Labview als Datensenke? (Ähnlich wie der Ausgang in angehängtem Bild)
Vielen Dank!
Also was meinst Du hier wieder mit einer Datensenke? Das ist ein Ausgang oder Indicator und das Letzte was ich das nennen würde ist eine Datensenke, denn die Daten verschwinden ja nicht darin, sondern kommen ja eigentlich gerade damit aus dem VI heraus.
Wenn Du unbedingt auf C beharren willst statt alles einfach in LabVIEW zu machen solltest Du Dir ein paar Dinge überlegen. Erstens ist aus Deinem Code ersichtlich dass alle Reihen und Kolonnen jeweils die selbe Länge haben. Es ist deshalb viel sinnvoller die Daten in ein richtiges zweidimensionales Array (das als ein einziger Speicherbereich angelegt ist) abzuspeichern dann als ein Array von Pointern zu Arrays.
Das ergäbe dann so etwas in dieser Art:
Code:
int32 C_function(char *path, int32 *array, int32 rows, int32 cols)
{
for (long c = 0; c < cols; c++)
{
for (long r = 0; r < rows; r++)
{
*array++ = something;
}
}
return noErr;
}
Und ja man muss zuvor wissen wieviele Kolonnen und Reihen das Array hat und man muss dieses auch in LabVIEW vor dem Aufruf in der entsprechenden Grösse initialisieren (Initialize Array). Der Array Parameter wird dann als Array, 2 Dimensional, C Array Data Pointer konfiguriert.
Wenn Du das anders machen willst ist die nächstbessere Weise um in Deinem C Code mit richtigen LabVIEW Arrays zu arbeiten.
Code:
#include "extcode.h"
typedef struct {
int32 dimSize1;
int32 dimSize2;
int32 elms[];
} 2DIntArray, **2DIntArrayHdl;
int C_function(char *path, 2DIntArrayHdl *array)
{
MgErr err;
int32 rows, cols;
// find the number of rows and columns
rows = x
cols = y;
// Resize the LabVIEW array handle
err = NumericArrayResize(iL, 2, (UHandle)array, rows * cols);
if (!err)
{
int32 *ptr = (**array)->elms;
for (long c = 0; c < cols; c++)
{
for (long r = 0; r < rows; r++)
{
ptr++ = something;
}
}
(**array)->dimSize1 = rows;
(**array)->dimSize2 = cols;
}
return err;
}
Eventuel musst Du dimSize1 und dimSize2 vertauschen, bin gerade zu faul um das zu testen.
Hier müsste man den Array Parameter als Array, 2 Dimensional, Pointer to Handle konfigurieren.