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 

Delphi DLL in LabVIEW



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!

06.11.2006, 15:19
Beitrag #11

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Delphi DLL in LabVIEW
' schrieb:ich bin mal wieder auf Probleme gestoßen.
Ach Gott, wer hat die nicht. Wink

Zitat:
Code:
SetLength(arr, n);
for i:=0 to n do
Wenn das Array N Elemente hat und bei 0 anfängt, wie groß ist dann der letzte Index: N oder N-1? (Das gilt im übrigen in Delphi wie in C++ wie in LV). Sei froh, dass du überhaupt was gesehen hast. Normalerweise führt eine Indexüberschreitung zu einer AccessViaolation. Wink

Ich will doch mal kucken, wie ich das gemacht habe.

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
06.11.2006, 19:44
Beitrag #12

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Delphi DLL in LabVIEW
Von der Methode, den Speicher durch Delphi zur Verfügung zu stellen, rate ich ab. Möglicherweise sind die Memorymanager von Delphi und LV nicht kompatibel.

Besser ist, den Speicherbereich durch LabVIEW zur Verfügung zu stellen und durch Delphi die Daten dorthin schreiben zu lassen.

Wenn die Länge in LV unbekannt ist, wie folgt vorgehen: Länge aus DLL holen, Array in LV initialisieren, Pointer auf Datenwerte an DLL und Daten hinschreiben lassen.


Angehängte Datei(en)
Sonstige .zip  Array_in_DLL.zip (Größe: 24,08 KB / Downloads: 198)

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
08.11.2006, 12:54
Beitrag #13

brenner2305 Offline
LVF-Grünschnabel
*


Beiträge: 14
Registriert seit: Aug 2006

7.00
2006
kA

1097
Deutschland
Delphi DLL in LabVIEW
Danke für die Infos! Das sieht richtig gut aus. Was ich noch nicht richtig verstanden habe, ist, was der Befehl

move(DynArr[0], PInt^, 4*anz);

macht. (Er übergibt die Daten:)OK). Die Delphi Hilfe hat mir da nicht weitergeholfen. Warum 4*anz, hat bestimmt was mit dem Pointer zu tun?
Kann man move auch verwenden wenn das Array 2-Dimensional ist?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.11.2006, 14:43
Beitrag #14

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Delphi DLL in LabVIEW
' schrieb:move(DynArr[0], PInt^, 4*anz);
MOVE = Speicher kopieren von Quelle nach Ziel. ANZ (respektive 4*ANZ) = Anzahl Bytes, die kopiert werden sollen. Da der Datentyp INTEGER ist, muss also die gewünschte Anzahl Integerwerte mit 4 multipliziert werden um auf die Anzahl der zu kopierenden Bytes zu kommen.

Zitat:Kann man move auch verwenden wenn das Array 2-Dimensional ist?
Im Prinzip ja. Voraussetzung wäre lediglich, dass die Daten linear hintereinander stehen.

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
09.11.2006, 16:33
Beitrag #15

brenner2305 Offline
LVF-Grünschnabel
*


Beiträge: 14
Registriert seit: Aug 2006

7.00
2006
kA

1097
Deutschland
Delphi DLL in LabVIEW
Ich probiere grade ein 2D Array an LabVIEW zu übergeben, aber der Move-Befehl will nicht so wie ich. Vielleicht kannst du das fix korrigieren? Rolleyes

Danke Schön!


Sonstige .zip  DLL_mit_2D_Array.zip (Größe: 26,52 KB / Downloads: 245)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.11.2006, 21:26
Beitrag #16

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Delphi DLL in LabVIEW
' schrieb:Vielleicht kannst du das fix korrigieren?
Schau'mer mal.

Beachte Erstens:
In Delphi ist die Reihenfolge Länge/Breite andersherunm als in LV

Beachte Zweitens:
In Delphi kann jeder Index eine eigene Länge haben. z.B.:
SetLength(DynArr[0], 1234);
SetLength(DynArr[1], 12);
SetLength(DynArr[3], 234);
SetLength(DynArr[4], 34); usw.
Deswegen liegen die Daten des gesamten Felder nicht hintereinander.

Wegen beider Gründe kann also nicht mit einem move kopiert werden.


Angehängte Datei(en)
Sonstige .zip  DLL_mit_2D_Array.zip (Größe: 56,14 KB / Downloads: 172)

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
Anzeige
15.11.2006, 13:31
Beitrag #17

s200rs Abwesend
LVF-Gelegenheitsschreiber
**


Beiträge: 75
Registriert seit: Jul 2005

7.1 / 8.5.1
2002
DE

02826
Deutschland
Delphi DLL in LabVIEW
' schrieb:[attachment=30007:attachment]

Der Code in Delphi sieht so aus:
...

Folgendes passiert dann:
(1) Der erste Wert in der Schleife der DLL ist i:=0. D.h. müsste dann arr[i];=i+3 =0+3=3 sein. Im Ausgabearray in LV erscheint aber der Wert 4.
(2) Im Ausgabearray sind beim ersten Durchlauf schon drei Felder initialisiert mit diesen Werten (4,0,0). Warum?
(3) Erhöht man die "Arraylaenge" werden die drei initialisierten Felder gefüllt (4,5,6). Bei weiterer Erhöhung der Arraylänge, werden keine anderen Werte mehr ausgegeben.


Hallo,

Tschuldigung, wenn ich mich hier mal kurz einklinke, habe nämlich nicht so viel Ahnung von Delphi, hab zwar Programmierung mit Turbo Pascal begonnen, bin aber im Studium auf C umgepolt worden...

Vielleicht solltest Du folgendes beachten:
Bei LabVIEW sieht ein eindimensionales Array im Speicher so aus, daß die ersten 4 Byte die Anzahl der folgenden Feldelemente in Form einer vorzeichenbehafteten 32-Bit-Zahl (I32) angeben. Erst danach folgen dann die einzelnen Feldelemente. Ein LabVIEW-Feld hat daher immer mindestens eine Größe von 4 Byte, auch wenn es leer ist. In diesen Bytes stehen bei einem leeren Feld nur Nullen.
Wenn Du dann genau auf diesen vier Bytes herumschreibst, interpretiert LabVIEW das als geänderte Feldlänge und dann bekommst Du eine Fehlermeldung (oder LabVIEW wird mal eben beendet Grrr), weil LabVIEW dann auf Speicherplätzen sucht, die gar nicht dafür reserviert sind, bei der Speicherfreigabe sieht's ähnlich aus.

Daher ist es sicherer, vor dem Aufruf von externem Code, sei's als CIN oder als DLL-Knoten, ein Feld mit der erwarteten Größe zu initialisieren (also muß Elementtyp und Feldgröße vorher bekannt sein), dieses dann an die externe Funktion zu übergeben und dort dann nur die ermittelten Werte auf die jeweilige bereits reservierte Speicherposition des übergebenen Feldes zu kopieren. Dann liegt die Speicherreservierung und -freigabe ausschließlich bei LabVIEW.

Ich glaube, mich daran zu erinnern, daß bei Pascal zumindest bei Strings das erste Byte die String-Länge gespeichert hat. Ein String ist ja auch nur ein Feld. Wenn nun Felder genau so aufgebaut sind, ist das obige Ergebnis nicht verwunderlich. Das erste Byte wird in der nicht angezeigt, weil es die Länge beinhaltet und die 3 angezeigten sind die 3 restlichen des LabVIEW-Feld-Kopfes.

Weiß aber nicht, ob man das von Pascal nun auf Delphi so übertragen kann, habe von der Entwicklung nichts mehr mitbekommen. Aber es ist nur so 'ne Idee.

________________

LV 7.1; 8.5
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.11.2006, 20:07
Beitrag #18

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Delphi DLL in LabVIEW
' schrieb:Wenn Du dann genau auf diesen vier Bytes herumschreibst, interpretiert LabVIEW das als geänderte Feldlänge und dann bekommst Du eine Fehlermeldung (oder LabVIEW wird mal eben beendet Grrr), weil LabVIEW dann auf Speicherplätzen sucht, die gar nicht dafür reserviert sind
Genau so kann es sein - das dumme nur ist: Es muss nicht so sein. Der aber trotzdem vorhandene Fehler macht sich dann erst drei Jahre später beim Kunden bemerkbar.

Zitat:Dann liegt die Speicherreservierung und -freigabe ausschließlich bei LabVIEW.
Genau dieses sollte immer angestrebt werden, ob man nun Felder, Strings, PChar oder gar Klassen aus einer (Delphi-)DLL lesen will.

Zitat:Ich glaube, mich daran zu erinnern, daß bei Pascal zumindest bei Strings das erste Byte die String-Länge gespeichert hat.
Auch für Strings ist die Zeit nicht stehengeblieben. Der von dir beschriebene String heißt in Delphi ShortString, ein normaler String ist ein ANSISTRING bzw. WideString. Ein "normaler" String kann bis zu 2GB Daten aufnehmen und hat anstelle von nur ein Byte einen "Overhead" von 12 Byte.

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


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Fehler beim Schließen des VIs nach Delphi-DLL-Aufruf Bärbel 10 12.655 11.11.2013 11:44
Letzter Beitrag: andreaskoller
  Datenübergabe aus Delphi-DLL in LabVIEW kokisan2000 5 6.525 13.11.2009 19:42
Letzter Beitrag: Y-P
  Delphi-DLL mit globalen Variablen Bärbel 4 5.665 15.07.2009 06:32
Letzter Beitrag: rolfk
  LabVIEW DLL für Delphi erstellen hoho 6 7.925 12.01.2007 21:38
Letzter Beitrag: hoho
  Einbinden einer Delphi-dll Svenni 6 7.786 17.10.2006 12:05
Letzter Beitrag: Svenni

Gehe zu: