' 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
), 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.