Pointer auf Array mit Labview übertragen und darstellen
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!
Pointer auf Array mit Labview übertragen und darstellen
Hallo,
ich habe folgende Problemstellung:
Ich habe eine cpp-DLL, aus der mir eine Funktion einen Pointer auf ein 2D-Array mit Werten übergibt. Dieses Array würde ich gerne in Labview graphisch darstellen (Übergabe der Breite und Länge des 2D-Arrays ist schon geregelt). Wie mache ich denn das am dümmsten? Kann LabView über den Pointer das Array auslesen? Falls nein, wie übergebe ich das Array sonst am besten?
Vielen Dank
RE: Pointer auf Array mit Labview übertragen und darstellen
(02.07.2013 10:24 )lupus022 schrieb: Hallo,
ich habe folgende Problemstellung:
Ich habe eine cpp-DLL, aus der mir eine Funktion einen Pointer auf ein 2D-Array mit Werten übergibt. Dieses Array würde ich gerne in Labview graphisch darstellen (Übergabe der Breite und Länge des 2D-Arrays ist schon geregelt). Wie mache ich denn das am dümmsten? Kann LabView über den Pointer das Array auslesen? Falls nein, wie übergebe ich das Array sonst am besten?
Vielen Dank
2D Array in C(++) ist sehr undeutlich. C kennt eigentlich keine spezifischen Arraytypen anders dann ein Pointer auf einen Speicherbereich.
Als C Programmierer hat man dann die Wahl um eine von vielen möglichen Varianten zu wählen. Wenn alle Reihen und Kolonnen im 2D Array gleich gross sind ist es am effizientesten wenn man das 2D Array als 1D Array im Speicher ablegt met Reihen * Kolonnen Elementen. Auch hier hat man wieder die Wahl ob man das Array als Reihe * Kolonne oder Kolonne * Reihe im Speicher ablegt.
Wenn die Länge der Reihen oder Kolonnen nicht konstant is, ist es besser um das Array als ein Array von Pointern auf 1D Arrays abszupeichern. Das ist aber dann sowieso Library spezifisch, da der Benützer eines solchen Arrays genau wissen muss welcher Allocator gebraucht wurde um das Array nach Gebrauch auch wieder korrekt freigeben zu können. Und das kann sehr kompliziert sein. malloc() in Library X braucht nicht kompatibel zu sein mit dem free() dass der Aufrufer in seiner Library oder Applikation benützt wenn nicht beide mit der gleichen Compilerversion kompiliert wurden und wird noch zusätzlich kompliziert wenn eine oder beide Komponenten die C Runtime Library statisch hineinlinken.
Der ganzen Rede kurzer Sinn: Erwähnen dass Du ein 2D Array hast ist leider absolut nicht genug Information, um Dir einen guten Rat zu geben, wie dieses in LabVIEW einzubinden wäre!
RE: Pointer auf Array mit Labview übertragen und darstellen
Ich habe ein 2D-Array mit Integer-Werten. Dieses besitzt keine feste Größe, die Anzahl der Reihen und Spalten werden erst zur Laufzeit an Labview übergeben.
Ich habe vor, dieses Array entweder mittels der Boost-Library zu erstellen, oder mittels malloc/new. Könnt ihr mir mit diesen Informationen weiterhelfen? Eindimensionale Arrays mittels malloc kann ich dank dem Link von jg übergeben.
Vielen Dank!
03.07.2013, 14:28 (Dieser Beitrag wurde zuletzt bearbeitet: 03.07.2013 14:30 von rolfk.)
RE: Pointer auf Array mit Labview übertragen und darstellen
(03.07.2013 10:22 )lupus022 schrieb: Ich habe ein 2D-Array mit Integer-Werten. Dieses besitzt keine feste Größe, die Anzahl der Reihen und Spalten werden erst zur Laufzeit an Labview übergeben.
Ich habe vor, dieses Array entweder mittels der Boost-Library zu erstellen, oder mittels malloc/new. Könnt ihr mir mit diesen Informationen weiterhelfen? Eindimensionale Arrays mittels malloc kann ich dank dem Link von jg übergeben.
Vielen Dank!
Es ist immer noch nicht deutlich. Nur weil die Anzahl der Reihen und/oder Kolonnen erst zur Laufzeit bekannt sind ist es noch kein Grund, dass man ein zweidimensionales Array nicht als eindimensionales Array übergeben kann. LabVIEW n-dimensionale Arrays sind grundsätzlich ebenfalls als eindimensionale Arrays im Speicher angelegt.
Das einzige Kriterium das ein solches n-dim Array verbieten würde, wäre wenn die verschiedenen Reihen und/oder Kolonnen innerhalb eines einzigen Arrays unterschiedliche Längen hätten. Solange Dein 2D Array einfach ein rechteckiges Array ist mit denselben Anzahl Reihen und Kolonnen innerhalb des Arrays ist alles in Ordnung.
Und das Hinzuziehen von Boost nur wegen diesem Array is wirklich mit Kanonen auf Spatzen schiessen. Gib uns mal ein Vorbild von C Code wie Du diese Funktion aufrufen würdest und das Array dann ansprichen willst. Das hilft 100 mal mehr als immer wieder vage Informationen was Du denkst machen zu müssen.
RE: Pointer auf Array mit Labview übertragen und darstellen
Aktuell sieht der Code bzw. die zuständige Funktion so aus:
Code:
__declspec(dllexport) int read_files(std::string CCD_Filename, int CCD_Filenumbers, std::string Daisy_Filename)
{
std::ifstream Daisy_in(Daisy_Filename, std::ifstream::in);
std::string inputline;
std::vector<std::string> tempstr;
int i = 1;
do
{
std::string CCD_Filename = boost::lexical_cast<string>(i);
CCD_Filename = CCD_Filename + ".txt";
std::ifstream CCD_in(CCD_Filename, std::ifstream::in);
while(!CCD_in.eof())
{
int j = 0;
std::getline(CCD_in, inputline);
boost::split(tempstr, inputline, boost::is_any_of("\t"));
std::vector<float> v;
for(unsigned int a = 0; a < tempstr.size(); a++)
{
std::istringstream iss(tempstr[a]);
std::copy(std::istream_iterator<float>(iss), std::istream_iterator<float>(), std::back_inserter(v));
};
std::get<0>(DATA[j]) = v[0];
std::get<1>(DATA[j]) = v[1];
j++;
};
CCD_in.close();
i++;
if(i > CCD_Filenumbers)
break;
}while(!Daisy_in.eof());
return 0;
};
Es fehlt noch die Verknüpfung mit zwei weiteren Werten, sodass ich am Ende ein Tupel-Array aus <int, int, std::tuple<float,float>> habe.
Dieses Tupel-Array soll dann umgeformt werden zu einem Tupel-Array mit <float, float, std::tuple<int, int>>. Aufgrund des Einlesevorgangs muss ich diesen Weg gehen, zumindest sehe ich keinen anderen. An LabView selbst soll nur ein Tupel mit den Informationen <float, std::tuple<int, int>> zurückgegeben werden. Daraus soll Labview eine graphische 2D-Matrix erstellen (das int-Tupel gibt den Ort an, der float-Wert die "Farbinformation").
RE: Pointer auf Array mit Labview übertragen und darstellen
Edit: Obiger Code und Ansatz kann als hinfällig betrachtet werden, ich habe eine Lösung gefunden, bei der ich deutlich weniger zu handeln habe (zwei 1d-Arrays, ein 2d-Array) und dieses auch noch einfach an Labview übergeben kann. Code kommt dazu morgen.
Vielen Dank!
RE: Pointer auf Array mit Labview übertragen und darstellen
(03.07.2013 23:00 )lupus022 schrieb: Edit: Obiger Code und Ansatz kann als hinfällig betrachtet werden, ich habe eine Lösung gefunden, bei der ich deutlich weniger zu handeln habe (zwei 1d-Arrays, ein 2d-Array) und dieses auch noch einfach an Labview übergeben kann. Code kommt dazu morgen.
Vielen Dank!
std::string und alles andere mit std:: drin sind C++ Datentypen. Die kann die Call Library Node nicht generieren und auch auf keine einzige Weise verarbeiten. Du musst schon mit Standard C Datentypen arbeiten!
RE: Pointer auf Array mit Labview übertragen und darstellen
(04.07.2013 07:04 )lupus022 schrieb: Das übertragene Array enthält ja auch nur noch Integer-Werte, das sollte also nicht stören, oder?
Also
__declspec(dllexport) int read_files(std::string CCD_Filename, int CCD_Filenumbers, std::string Daisy_Filename)
hat keinerlei Arrays! Was meinst Du den genau?
So wie das aussieht liest Du in Deinem C code ein File ein dass Daten enthält. Wie Du die Daten so in LabVIEW kriegen willst ist mir ziemlich undeutlich und nur zu Deiner Information LabVIEW hat auch FileIO Funktionen die sowohl für String als auch binäre Daten funktionieren. Damit erübrigt sich wahrscheinlich jegliche C Programmierung und damit verbundene Interfaceprobleme komplet für den Code in Deinem Post.