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!

04.07.2013, 08:37
Beitrag #11

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



RE: Pointer auf Array mit Labview übertragen und darstellen
Das wäre eine Überlegung, alles mit Labview zu machen.
Zum Code: Wie gesagt, ist in der Überarbeitungsphase, von daher ist der obige Code nicht mehr in Verwendung.
Aber auf jeden Fall vielen Dank für die Hilfe!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
04.07.2013, 14:50
Beitrag #12

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



RE: Pointer auf Array mit Labview übertragen und darstellen
So, ich habe meinen Code mal überarbeitet:
Code:
__declspec(dllexport) int* gen_WLTable(std::string CCD_Filename)
{
    int *ptr;
    ptr = &WAVENUMBERS[0];
    std::ifstream LUT(CCD_Filename, std::ifstream::in);
    std::string inputline;
    std::vector<std::string> tempstr;
    int i = 0;
    while(!LUT.eof())
    {
        std::getline(LUT, inputline);
        boost::split(tempstr, inputline, boost::is_any_of("\t"));
        std::vector<float> v;
        std::istringstream iss(tempstr[0]);
        std::copy(std::istream_iterator<float>(iss), std::istream_iterator<float>(), std::back_inserter(v));
        if(v.size())
        {
            WAVENUMBERS[i] = (int)(v[0]+0.5);
            i++;
        };
    };
    SIZEOFWN = i;
    return ptr;
};
(Funktion, um WAVENUMBERS zu füllen, und den Pointer darauf zurückzugeben)
Nur weiß ich jetzt noch nicht, wie ich den String in die obige Funktion bekomme. Wie mache ich denn das am dümmsten?
Umsatteln auf eine reine LabView-Version geht leider nicht, da in der Zwischenzeit noch ein paar Funktionen, die ich nur ungern umbauen möchte, hinzugekommen sind.
Vielen Dank!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.07.2013, 15:29 (Dieser Beitrag wurde zuletzt bearbeitet: 04.07.2013 15:41 von rolfk.)
Beitrag #13

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Pointer auf Array mit Labview übertragen und darstellen
(04.07.2013 14:50 )lupus022 schrieb:  So, ich habe meinen Code mal überarbeitet:
Code:
__declspec(dllexport) int* gen_WLTable(std::string CCD_Filename)
{
    int *ptr;
    ptr = &WAVENUMBERS[0];
    std::ifstream LUT(CCD_Filename, std::ifstream::in);
    std::string inputline;
    std::vector<std::string> tempstr;
    int i = 0;
    while(!LUT.eof())
    {
        std::getline(LUT, inputline);
        boost::split(tempstr, inputline, boost::is_any_of("\t"));
        std::vector<float> v;
        std::istringstream iss(tempstr[0]);
        std::copy(std::istream_iterator<float>(iss), std::istream_iterator<float>(), std::back_inserter(v));
        if(v.size())
        {
            WAVENUMBERS[i] = (int)(v[0]+0.5);
            i++;
        };
    };
    SIZEOFWN = i;
    return ptr;
};
(Funktion, um WAVENUMBERS zu füllen, und den Pointer darauf zurückzugeben)
Nur weiß ich jetzt noch nicht, wie ich den String in die obige Funktion bekomme. Wie mache ich denn das am dümmsten?
Umsatteln auf eine reine LabView-Version geht leider nicht, da in der Zwischenzeit noch ein paar Funktionen, die ich nur ungern umbauen möchte, hinzugekommen sind.
Vielen Dank!

Also wenn Du mit String den CCD_filenamen Parameter meinst, das geht grundsätzlich nicht. Da musst Du doch wirklich ein char* übergeben und den std:string halt in der Funktion von diesem erzeugen. C++ und Templates ist ja alles schön und gut, aber nur wenn Du sowohl den Caller als die Funktion selber voll unter Kontrolle hast. Ansonsten ist das praktisch nicht zu managen und im Fall von LabVIEW (und jeder anderen Applikation, auch solchen in C wo man meist nicht sicher weiss mit welcher C und C++ Runtime die Library gelinkt wurde) hat man nunmal vor allem Probleme.

Zudem, planst Du wirklich um WAVENUMBERS als globales Array irgendwo anzulegen und durch eine weitere Funktion in LabVIEW zu lesen? Das kann ja heiter werden! Ahh nein Du übergibst das Array als return value. Das ist ja genau so schlimm. LabVIEW kann keine Arrays als return value einlesen, da es ja keinerlei Möglichkeit hat zu bestimmen wieviele Elemente es den aus dem Array in ein LabVIEW Array kopieren kann.

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, 15:37
Beitrag #14

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



RE: Pointer auf Array mit Labview übertragen und darstellen
Wenn ich das ganze nicht als globales Array anlege, dann ist es doch nach Aufruf und Beendigung der Funktion wieder verschwunden, und kann daher nicht von extern gelesen werden, oder irre ich mich da? Was wäre denn eine bessere Alternative?
Den String ersetze ich mal durch einen char*, vielen Dank für den Hinweis.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.07.2013, 15:48 (Dieser Beitrag wurde zuletzt bearbeitet: 04.07.2013 15:53 von rolfk.)
Beitrag #15

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Pointer auf Array mit Labview übertragen und darstellen
(04.07.2013 15:37 )lupus022 schrieb:  Wenn ich das ganze nicht als globales Array anlege, dann ist es doch nach Aufruf und Beendigung der Funktion wieder verschwunden, und kann daher nicht von extern gelesen werden, oder irre ich mich da? Was wäre denn eine bessere Alternative?
Den String ersetze ich mal durch einen char*, vielen Dank für den Hinweis.

Und wenn Du es als globales Array anlegst, wer dealloziert es dann und wann? Höre ich Memory leak? Die bessere Alternative wäre um das Array als Parameter zu übergeben. Das ist auch nicht trivial, denn dynmische Arrays zwischen DLLs zu übergeben ist grundsätzlich schwierig. Entweder übergibst Du C Array Pointer und allozierst die vor dem Aufruf entsprechend oder Du liest Dich ein in das External Code Referenz manual von LabVIEW und erzeugst richtige LabVIEW Arrays in Deinem C Code. Wenn Du dazu die LabVIEW Memory Manager Funktionen verwendest kann Dein C Code Arrays erzeugen und manipulieren die LabVIEW direkt verarbeiten kann und dann kannst Du die dynamisch in Deiner C Funktion anlegen und resizen.

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, 16:05 (Dieser Beitrag wurde zuletzt bearbeitet: 04.07.2013 16:10 von lupus022.)
Beitrag #16

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



RE: Pointer auf Array mit Labview übertragen und darstellen
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!


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.07.2013, 09:01 (Dieser Beitrag wurde zuletzt bearbeitet: 09.07.2013 09:04 von rolfk.)
Beitrag #17

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Pointer auf Array mit Labview übertragen und darstellen
(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. Big Grin
Hier müsste man den Array Parameter als Array, 2 Dimensional, Pointer to Handle konfigurieren.

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
11.07.2013, 10:10
Beitrag #18

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



RE: Pointer auf Array mit Labview übertragen und darstellen
(09.07.2013 09:01 )rolfk schrieb:  
(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.
Zumindest zeigt mir das so die LabView-Hilfe an, dass ich eine "Datenquelle" benötige und eine "Datensenke". Aber ich denke, das Problem konnte ich lösen.
Den Code schau ich mir mal an, aber bin noch am Überlegen, ob es sich noch lohnt, diesen jetzt umzusetzen, oder erst später, da die aktuelle Version halbwegs funktioniert (Stichwort: Speicherleck), und ich meine BA demnächst abgeben muss.
Vielen Dank für die Hilfe!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.07.2013, 20:38
Beitrag #19

lupus022 Offline
LVF-Grünschnabel
*


Beiträge: 42
Registriert seit: May 2013

2012
-
DE



RE: Pointer auf Array mit Labview übertragen und darstellen
So, ich bin gerade wieder am Code dran, und habe folgende Frage:
Ich habe ein simples Array von Pointern auf Pointer-Arrays (int **array), das ich dynamisch erstellen und löschen kann.
Dieses wird mit folgendem Code erstellt:
Code:
int ** testptr = NULL;
int ** gen_multiarr(int row, int col)
{
    testptr = new int*[row];
    for(int i = 0; i < row; i++)
        testptr[i] = new int[col];
    for(int i = 0; i < row; i++)
        for(int j = 0; j < col; j++)
            testptr[i][j] = i+j;
    return testptr;
}

void del_multiarr(int ** ptr)
{
    delete[] *ptr;
    delete[] ptr;
};
Wenn ich diese Funktion dann mit Labview aufrufe, und das erste Mal dereferenziere (mit GetValueByPointer.xnode), erhalte ich ein 1D-Array mit [row]-Pointern, was ja logisch ist. Wenn ich diese Pointer dann erneut [col]-mal dereferenziere (mit GetValueByPointer.xnode), erhalte ich als Werte jedoch wieder irgendwelchen hohen Zahlen, und nicht die Werte, die ich in das Array hineingeschrieben habe. Das VI dazu ist im Anhang.
Wieso?
Vielen Dank!


Angehängte Datei(en)
11.0 .vi  Test2.vi (Größe: 19,85 KB / Downloads: 171)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.07.2013, 22:13 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2013 22:24 von jg.)
Beitrag #20

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
Unter der Annahme, dass der Datentyp int bei deinem C-System int32 ist und du unter einem 32bit-Betriebssystem arbeitest:
Wieso holst du die Adressen als U64 ab?
Wieso holst du die Werte als U64 ab?

Kannst du vielleicht die TestDLL.dll zu deinem letzten VI ebenfalls bereit stellen?

EDIT: Vielleicht stimmt auch die ByteOrder des abgeholten Wertes nicht. Das Resultat schon im HEX-Code angeschaut?

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


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

Gehe zu: