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 Array an C++ DLL übergeben



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!

29.04.2009, 11:09
Beitrag #1

Flagman Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Apr 2009

7.1
2008
de

4500
Schweiz
LabVIEW Array an C++ DLL übergeben
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.04.2009, 12:24 (Dieser Beitrag wurde zuletzt bearbeitet: 29.04.2009 12:28 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
LabVIEW Array an C++ DLL übergeben
' 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

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
29.04.2009, 12:26
Beitrag #3

Flagman Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Apr 2009

7.1
2008
de

4500
Schweiz
LabVIEW Array an C++ DLL übergeben
Danke für die schnelle Antwort.

Hat ketzt soweit geklappt wie gewünscht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.04.2009, 17:14
Beitrag #4

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
LabVIEW Array an C++ DLL übergeben
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.04.2009, 10:44 (Dieser Beitrag wurde zuletzt bearbeitet: 30.04.2009 10:57 von Flagman.)
Beitrag #5

Flagman Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Apr 2009

7.1
2008
de

4500
Schweiz
LabVIEW Array an C++ DLL übergeben
@Rolfk

Gibt es keine Möglichkeit, dass ich die Arraygrösse im C++ Code auslesen kann ohne dass ich diese übergeben muss?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.04.2009, 18:34 (Dieser Beitrag wurde zuletzt bearbeitet: 30.04.2009 18:37 von abrissbirne.)
Beitrag #6

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
LabVIEW Array an C++ DLL übergeben
' 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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
30.04.2009, 18:42
Beitrag #7

Flagman Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Apr 2009

7.1
2008
de

4500
Schweiz
LabVIEW Array an C++ DLL übergeben
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.04.2009, 19:25
Beitrag #8

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
LabVIEW Array an C++ DLL übergeben
' 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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.05.2009, 11:54
Beitrag #9

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
LabVIEW Array an C++ DLL übergeben
' 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

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 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Array mit unbekannter Größe übergeben Curtis Newton 6 7.988 03.06.2008 13:04
Letzter Beitrag: Curtis Newton
  Lab VIEW DLL in C# 2D Array an Lab VIEW übergeben Gortosch 2 6.496 02.06.2008 16:05
Letzter Beitrag: Gortosch
  2 Dimen. Array an Dll übergeben calimero 2 5.706 06.12.2005 13:16
Letzter Beitrag: Winzler

Gehe zu: