LabVIEWForum.de - C-DLL, Speicherüberschreibung, Arraygröße

LabVIEWForum.de

Normale Version: C-DLL, Speicherüberschreibung, Arraygröße
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
' schrieb:Ich nehme mal an, dass du probierst, für das "Rückgabe-Array" in LabVIEW per "Initialize Array" Speicher zu reservieren und beim Eingang "element" einfach auf "Create->Constant" geklickt hast. Damit wird dir eine Konstante vom Datentyp "double" erzeugt. Umstellen auf Datentyp "single geht über "Rechter Mausklick->" und dann siehe Screenshot:
[attachment=44215:Image01.png]

Moin,

@ Jens
Die Representation des Eingangs vom "initialize array" kann ich leider nicht umstellen, da dort der "Call Library Node" angeschlossen ist.

' schrieb:Aber Du hast wohl den Parameter in der Call Library Node nicht als Array definiert
doch, als Array...

Hier nochmal der komplette C-Code mit allen benötigten Funktionen. Die eigentliche Funktion "void correl" steht ganz unten.

[code]// Spectral Analysis


#include "extcode.h"
#include "nrutil.h"
#include <math.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

#define NRANSI
#define NR_END 1
#define FREE_ARG char*
#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr




__declspec(dllexport) void correl(float data1[], float data2[], unsigned long n, float ans[]);

//********************************************************************************​
************

void nrerror(char error_text[])
/* Numerical Recipes standard error handler */
{
' schrieb:Moin,

@ Jens
Die Representation des Eingangs vom "initialize array" kann ich leider nicht umstellen, da dort der "Call Library Node" angeschlossen ist.

Du stehst total auf dem Schlauch, sorry!

Wenn Du eine C Funktion aufrufst musst Du alle Parameter der Funktion VOR dem Aufruf festlegen. Natürlich kannst Du das Initialize Array nicht mit dem Array füttern dass aus der CLN kommt. Du musst mit InitializeArray ein entsprechendes Array mit der richtigen Länge erzeugen und am Eingang (sprich links an der CLN) anschliessen so dass die DLL Funktion auch einen Buffer hat in den sie die Resultate schreiben kann.

Die DLL Funktion ist rein C und C schreibt vor dass der Aufrufer alle eventuellen Buffer vor dem Aufruf einer Funktion anlegen muss. Da hast Du kein LabVIEW dass Dir schon brav das Händchen hält und wann immer das nötig ist ganz automatisch die entsprechenden Buffer anlegt und wieder aus dem Speicher entfernt. Dies ist ganz einfach C und LabVIEW kann Dir nur die Werkzeuge geben aber nicht die Arbeit abnehmen, da es ganz einfach nicht genug Informationen dazu hat und diese auch auf keine mögliche Weise selber erhalten kann.

Wenn Du schon C programmieren willst und nicht die eingebauten Funktionen in LabVIEW verwenden willst solltest Du Dir wirklich die Mühe machen um erst mal ein gutes C Tutorial durchzuarbeiten. Pointers, Arrays und Funktionsaufrufe sollten dort schon minimal gut erklärt werden um Dir das nötige Basiswissen zu geben, um auch solche Funktionen von LabVIEW aus aufzurufen.

Da ist aber ein Punkt der mir ziemliche Sorgen bereitet. Die Funktion correl() scheint am Ende den Buffer von ans mit free() friezugeben. Wenn das wirklich so sein soll denke ich mal dass Du diese Funktion nicht ohne Anpassungen von LabVIEW aufrufen kannst. Warum sollte die Funktion das tun, schliesslich willst Du in diesem Buffer doch das Resultatarray ins LabVIEw bekommen? Wenn die DLL versucht einen Buffer den sie von LabVIEW erhalten hat mit der C Runtime Funktion free() freizugeben geht das garantiert sehr falsch.

Rolf Kalbermatter
' schrieb:Da ist aber ein Punkt der mir ziemliche Sorgen bereitet. Die Funktion correl() scheint am Ende den Buffer von ans mit free() friezugeben. Wenn das wirklich so sein soll denke ich mal dass Du diese Funktion nicht ohne Anpassungen von LabVIEW aufrufen kannst. Warum sollte die Funktion das tun, schliesslich willst Du in diesem Buffer doch das Resultatarray ins LabVIEw bekommen? Wenn die DLL versucht einen Buffer den sie von LabVIEW erhalten hat mit der C Runtime Funktion free() freizugeben geht das garantiert sehr falsch.

Ja, hab vergessen "free()" rauszunehemen. Hatte vorher mit "malloc" und realloc" experimentiert.

Also "free(ans);" gehört NICHT in den Code!
Und der Anschluss am Knoten sollte so aussehen:

[attachment=16562]

Gruß, Jens
' schrieb:Und der Anschluss am Knoten sollte so aussehen:

[attachment=44222:Image01.png]

Gruß, Jens


Spitze! vielen Dank Männer! Wald
Seiten: 1 2
Referenz-URLs