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 

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!

02.07.2013, 10:24
Beitrag #1

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
02.07.2013, 10:44
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Pointer auf Array mit Labview übertragen und darstellen
Such mal nach dem Schlagwort "MoveBlock".

z.B. hier: https://decibel.ni.com/content/docs/DOC-9091

Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
02.07.2013, 19:16 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2013 19:18 von rolfk.)
Beitrag #3

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
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!

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
03.07.2013, 10:22
Beitrag #4

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



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!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.07.2013, 14:28 (Dieser Beitrag wurde zuletzt bearbeitet: 03.07.2013 14:30 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
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.

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
03.07.2013, 22:13
Beitrag #6

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



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").
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
03.07.2013, 23:00
Beitrag #7

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



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!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.07.2013, 23:19
Beitrag #8

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
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!

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
04.07.2013, 07:04
Beitrag #9

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



RE: Pointer auf Array mit Labview übertragen und darstellen
Das übertragene Array enthält ja auch nur noch Integer-Werte, das sollte also nicht stören, oder?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.07.2013, 08:18 (Dieser Beitrag wurde zuletzt bearbeitet: 04.07.2013 08:22 von rolfk.)
Beitrag #10

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
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.

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
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Datenübergabe an DLL Pointer to Pointer Reiling 2 9.646 02.02.2018 10:59
Letzter Beitrag: Reiling
  Absturz durch unzulässige Pointer VS_03 3 10.376 28.10.2016 18:32
Letzter Beitrag: VS_03
  dll mit Pointer auf komplexe Struktur einbinden Wedgewood 11 17.088 27.04.2014 23:44
Letzter Beitrag: Wedgewood
  Pointer und MoveBlock OXO 4 8.291 03.06.2013 16:31
Letzter Beitrag: OXO
  Pointer auf Subarray übergeben Event Horizon 5 7.466 15.07.2012 10:21
Letzter Beitrag: rolfk
  DLL-Einbindung, Struct mit verschiedenen Datentypen als Pointer übergeben hawk72 4 11.113 11.05.2012 14:41
Letzter Beitrag: hawk72

Gehe zu: