LabVIEWForum.de
LabVIEW Array an C++ DLL übergeben - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: LabVIEW Array an C++ DLL übergeben (/Thread-LabVIEW-Array-an-C-DLL-uebergeben)



LabVIEW Array an C++ DLL übergeben - Flagman - 29.04.2009 11:09

Ich habe ein Problem mit der übergabe eines LabVIEW-Arrays an meine C++ DLL.
Den Funktionsblock habe ich in LabVIEW wie folgt konfiguriert:

Typ: Array
Datentyp: 4-Byte-Single (Float)
Dimensionen: 1
Array-Format: Array-Datenzeiger

Der C++-Code sieht wie folgt aus:

void saveData(char const* dateiname, float* data[], short int* dateandtime)
{
FILE *f;
f = fopen(dateiname,"a");
for(int i=0;i<sizeof(data)-1;i++){
fprintf(f,"%fn",data[i]);
}
fclose(f);
}

Doch nun habe ich da eine völlig falsche Ausgabe der Werte aus LabVIEW.
Was ist hier das Problem?

Besten Dank im Voraus für eure Hilfe


LabVIEW Array an C++ DLL übergeben - rolfk - 29.04.2009 12:24

' schrieb:Ich habe ein Problem mit der übergabe eines LabVIEW-Arrays an meine C++ DLL.
Den Funktionsblock habe ich in LabVIEW wie folgt konfiguriert:

Typ: Array
Datentyp: 4-Byte-Single (Float)
Dimensionen: 1
Array-Format: Array-Datenzeiger

Der C++-Code sieht wie folgt aus:

void saveData(char const* dateiname, float* data[], short int* dateandtime)
{
FILE *f;
f = fopen(dateiname,"a");
for(int i=0;i<sizeof(data)-1;i++){
fprintf(f,"%fn",data[i]);
}
fclose(f);
}

Doch nun habe ich da eine völlig falsche Ausgabe der Werte aus LabVIEW.
Was ist hier das Problem?

Besten Dank im Voraus für eure Hilfe

Das Problem ist dass der Parameter float* data[] kein Array Pointer ist sondern ein Zeiger auf einen solchen. Auch kannst Du den sizeof() Operator (C++ Arraytypen mal vorneweg gelassen, aber hier bekommst Du von LabVIEW echt nur einen simplen C Arraypointer und kein C++ Array) nur auf Datentypen verwenden deren Grösse zur Kompilierzeit bekannt ist. Das geht hier ohne Kompilierfehler weil Du im Prinzip mit dem sizeof() Parameter nicht die Anzahl der Elemente im Array eruierst sondern die Anzahl Bytes die ein Pointer im Speicher belegt (also 4). Lol


Du solltest das Ganze in etwa umwandeln wie folgt:

void saveData(char const* dateiname, float data[], int num, short int* dateandtime)
{
FILE *f;
f = fopen(dateiname,"a");
for(int i=0;i<num;i++){
fprintf(f,"%fn",data[i]);
}
fclose(f);
}

Rolf Kalbermatter


LabVIEW Array an C++ DLL übergeben - Flagman - 29.04.2009 12:26

Danke für die schnelle Antwort.

Hat ketzt soweit geklappt wie gewünscht.


LabVIEW Array an C++ DLL übergeben - abrissbirne - 29.04.2009 17:14

Eventuell hilft dir das weiter:
C:Program FilesNational InstrumentsLabVIEW 8.5examplesdlldata passing
Der Pfad kann bei dir natürlich etwas anders aussehen, aber ab National Instruments stimmts dann wieder biggrin.gif
Ich fand die Beispiele echt hilfreich.


LabVIEW Array an C++ DLL übergeben - Flagman - 30.04.2009 10:44

@Rolfk

Gibt es keine Möglichkeit, dass ich die Arraygrösse im C++ Code auslesen kann ohne dass ich diese übergeben muss?


LabVIEW Array an C++ DLL übergeben - abrissbirne - 30.04.2009 18:34

' schrieb:@Rolfk

Gibt es keine Möglichkeit, dass ich die Arraygrösse im C++ Code auslesen kann ohne dass ich diese übergeben muss?
Meiner Meinung nach nein. Woher soll man denn wissen wo der Speicher reserviert wurde. Du kannst allerdings ein LV Array in C++ erzeugen oder ein übergebenes Array vergrößern oder verkleinern.

Edit: Sorry wenn ich anstatt Rolf geantwortet hatBig Grin


LabVIEW Array an C++ DLL übergeben - Flagman - 30.04.2009 18:42

Hehe, kein Problem.

Also habs jetzt so gelöst, dass ich die Arraygrösse übergebe.

Eine weitere Lösung wäre noch, wenn man eine Escape-Sequenz machen würde. z.B. dass der letzte Wert im Array immer -99999999 ist.


LabVIEW Array an C++ DLL übergeben - IchSelbst - 30.04.2009 19:25

' schrieb:Also habs jetzt so gelöst, dass ich die Arraygrösse übergebe.
So mach ich das auch immer: Arraylänge und Zeiger auf Daten übergeben.

Man kann natürlich auch folgendes machen: "Array-Handle". Das ist ein Pointer auf eine Datenstruktur, aus der man die Längen der Dimensionen und die Pointer auf die Daten herauslesen kann. Hierzu muss man aber wissen, wie der Handle aufgebaut ist.


LabVIEW Array an C++ DLL übergeben - rolfk - 03.05.2009 11:54

' schrieb:@Rolfk

Gibt es keine Möglichkeit, dass ich die Arraygrösse im C++ Code auslesen kann ohne dass ich diese übergeben muss?

Nein absolut nicht. Das LabVIEW Call Library Interface ist ganz ausschliesslich Standard C (auch weil C++ nicht binär kompatibel ist zwischen verschiedenen Compilern, oft selbst zwischen Versionen des gleichen Compilers). Standard C Datentypen sind Skalars oder Pointer und sonst absolut nichts. Da ist kein Platz für Metadaten zu einem Typ.

Wie von Abrissbirne angesprochen kannst Du mit den LabVIEW native Datentypen arbeiten aber dann musst Du im C Code auch ganz explizit dafür programmieren, sonst geht es nicht.

Rolf Kalbermatter