24.01.2014, 08:46
(Dieser Beitrag wurde zuletzt bearbeitet: 24.01.2014 08:47 von Klausenwirt.)
Beitrag #1
|
Klausenwirt
LVF-Grünschnabel
Beiträge: 23
Registriert seit: Jan 2014
2013
2013
DE
|
String an DLL übergeben
Hallo,
beim Aufruf der DLL kommt es immer wieder zu Abstürzen von LabVIEW, auch wenn ich gar nicht im Debug-Modus bin, sondern Linien im Diagramm ziehe. C++ fügt am Ende eines Strings 0x00 an, um das Ende auch anzukündigen. LabVIEW teilt Funktionen die Länge des Strings am Anfang mit. Da ein String ja ein Array aus charctern ist, dachte ich, so wie im Bild würds gehn. Aber es hilft nicht wirklich. Ich dachte, so kann ich den Array künstlich größer machen bzw. Felder im Array initialisieren, aber mit nichts füllen. Damit wäre dann der Array größer (nicht der String, die Leerzeichen haben die Länge 0) und es wäre genug Puffer für die DLL vorhanden.
Gibts da eine bessere Lösung?
Variablen in der DLL:
Startwert = unsigned short int (ist auch Ergebnis)
Command = char *
Länge = unsigned short int
Aufrufkonvention: C
|
|
|
24.01.2014, 09:03
(Dieser Beitrag wurde zuletzt bearbeitet: 24.01.2014 09:10 von GerdW.)
Beitrag #2
|
GerdW
______________
Beiträge: 17.467
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: String an DLL übergeben
Hallo Wirt,
Zitat:Ich dachte, so kann ich den Array künstlich größer machen bzw. Felder im Array initialisieren, aber mit nichts füllen.
Hast du mal zu Testzwecken die Länge deines Strings vor und nach dem AppendString verglichen?
Was wird es wohl bringen, wenn ich an einen String x-mal einen leeren String anhänge?
Ich nehme einen String der Länge "n" und hänge x-mal einen String der Länge Null daran an. Was wird wohl bei dieser Rechnung "Länge = n + x*0" herauskommen ???
Manchmal soll ja Nachdenken nicht schaden. Und wenn man sich dann nicht sicher ist, sollten man einfache Tests, wie oben genannt, bemühen…
Ich dachte, das Problem mit den Abstürzen wäre behoben? Und jetzt stürzt dir LabVIEW schon beim Editieren ab?
|
|
|
24.01.2014, 09:32
Beitrag #3
|
Klausenwirt
LVF-Grünschnabel
Beiträge: 23
Registriert seit: Jan 2014
2013
2013
DE
|
RE: String an DLL übergeben
Die leeren Strings waren dazu da, um im Array neue Felder anzulegen, die aber leer sind. Damit wird Speicher belegt, der mit den Abschlusszeichen gefüllt werden kann, oder? Mein Problem (siehe vorheriger Thread) ist bei Langzeittests nicht behoben.
|
|
|
24.01.2014, 09:36
(Dieser Beitrag wurde zuletzt bearbeitet: 24.01.2014 09:38 von GerdW.)
Beitrag #4
|
GerdW
______________
Beiträge: 17.467
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: String an DLL übergeben
Hallo Wirt,
Zitat:Die leeren Strings waren dazu da, um im Array neue Felder anzulegen, die aber leer sind.
Welches Array? Siehst du da irgendein Array? Ich sehe nur Strings…
Wenn du Bytes an den String anhängen willst, dann solltest du nicht-leere Strings anhängen. Eine Stringkonstante wie diese hier
sollte dabei hilfreich sein…
Alternativ kannst du auch ein Array of U8 mit der gewünschten Länge initialisieren und als String umgewandelt an deinen String-Input anhängen!
|
|
|
24.01.2014, 10:37
Beitrag #5
|
Klausenwirt
LVF-Grünschnabel
Beiträge: 23
Registriert seit: Jan 2014
2013
2013
DE
|
RE: String an DLL übergeben
Ein String ist ja ein Array aus dem Basistyp Char, wenn man es genau nimmt.
Ich hänge jetzt 10 mal 0x04 an den String, also wird 10 mal das Ende des Telegramms übertragen. In der DLL findet eine CRC-Prüfung statt, mein Ergebnis wird dadurch falsch. Es ist schon richtig, dass ich als String-Format CStr ausgewählt hab?
|
|
|
24.01.2014, 10:44
Beitrag #6
|
GerdW
______________
Beiträge: 17.467
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: String an DLL übergeben
Hallo Wirt,
Zitat:Ein String ist ja ein Array aus dem Basistyp Char, wenn man es genau nimmt.
Du kannst aber nicht einfach Regeln aus dem C-Bereich nach LabVIEW übertragen!
Ein String ist ein String und ein U8-Array ist ein U8-Array. Punkt.
Zitat:Ich hänge jetzt 10 mal 0x04 an den String, also wird 10 mal das Ende des Telegramms übertragen. In der DLL findet eine CRC-Prüfung statt, mein Ergebnis wird dadurch falsch.
Ja, das ist nun mal so, wenn man einen anderen String als gefordert überträgt. Warum hängst du auch 0x04 an statt 0x00? Du änderst sowohl den Stringinhalt als auch dessen Länge, indem du da Zeichen anhängst - und wunderst dich über das Ergebnis?
Zum CStr kann ich nichts sagen: Ich kenne deine DLL nicht. Frag doch mal RolfK…
|
|
|
24.01.2014, 10:59
Beitrag #7
|
Klausenwirt
LVF-Grünschnabel
Beiträge: 23
Registriert seit: Jan 2014
2013
2013
DE
|
RE: String an DLL übergeben
Ich hab schon auch 0x00 versucht, aber das Ergebnis ist auch falsch.
Kann ich mit LabVIEW für die DLL mehr Speicher bereitstellen, wegen der Ankündigung des Stringendes?
|
|
|
24.01.2014, 11:17
Beitrag #8
|
GerdW
______________
Beiträge: 17.467
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: String an DLL übergeben
Hallo Wirt,
erstens übernimmt LabVIEW die korrekte String-Terminierung selbst, wenn man den entsprechenden Übergabetyp einstellt (soweit ich weiß, habe mich damit noch nicht im Detail beschäftigen müssen).
Zweitens steht es dir frei, einen längeren String als gefordert bereitzustellen, der DLL aber nur die tatsächlich genutzte Länge mitzuteilen…
|
|
|
26.01.2014, 21:24
Beitrag #9
|
|
|
27.01.2014, 09:04
|
Klausenwirt
LVF-Grünschnabel
Beiträge: 23
Registriert seit: Jan 2014
2013
2013
DE
|
RE: String an DLL übergeben
Die DLL wurde in C++ geschrieben. Welche Parameter muss ich dann ändern?
|
|
|
| |