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 

C-DLL, Speicherüberschreibung, Arraygröße



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!

03.02.2009, 09:27 (Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2009 10:49 von jg.)
Beitrag #11

Pacco di Bango Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Feb 2009

8.5.1
2008
de_en

17491
Deutschland
C-DLL, Speicherüberschreibung, Arraygröße
' 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 */
{


Angehängte Datei(en)
Sonstige .dll  LockIn2.dll (Größe: 29 KB / Downloads: 196)

Sonstige .vi  CrossCorrel.vi (Größe: 22,3 KB / Downloads: 203)

Der Fehler sitzt immer vor der Maschine.
[altes Schneidersprichwort]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.02.2009, 09:38 (Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2009 09:52 von rolfk.)
Beitrag #12

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
C-DLL, Speicherüberschreibung, Arraygröße
' 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

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.02.2009, 10:38
Beitrag #13

Pacco di Bango Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Feb 2009

8.5.1
2008
de_en

17491
Deutschland
C-DLL, Speicherüberschreibung, Arraygröße
' 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!

Der Fehler sitzt immer vor der Maschine.
[altes Schneidersprichwort]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.02.2009, 10:49
Beitrag #14

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
C-DLL, Speicherüberschreibung, Arraygröße
Und der Anschluss am Knoten sollte so aussehen:

   

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
03.02.2009, 11:51
Beitrag #15

Pacco di Bango Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Feb 2009

8.5.1
2008
de_en

17491
Deutschland
C-DLL, Speicherüberschreibung, Arraygröße
' schrieb:Und der Anschluss am Knoten sollte so aussehen:

[attachment=44222:Image01.png]

Gruß, Jens


Spitze! vielen Dank Männer! Wald

Der Fehler sitzt immer vor der Maschine.
[altes Schneidersprichwort]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Gehe zu: