![]() |
Hallo Alle
Hier der Code
Delphi-Quellcode:
[edit=Daniel B]Delphi-Tags; MfG Daniel B.[/edit]
var
analog1: Pchar; begin analog1 := strAlloc(20);//speicher reservieren label3.caption := inttostr ((ND_Readchanai(1,1,0,analog1)));// Dll Funktion analog1 wird ausgelesen und als Wert angezeigt label4.caption := (analog1); //wird richtig als +0029 ausgegeben Ist aber bis zur Fehlermeldung noch nicht passiert (wird Ohne follgende Zeile aber ausgegeben series1.AddX(strtoint(analog1));//erzeugt den Fehler |
hast du die DLL selbst geschrieben? Ist es möglich das non-printable ASCII Characters in der DLL rückgabe auftauchen? Weil warum sollte man einen Zahlenwert als PChar übergeben, wenn da nich was seltsames drinnen auftauchen kann, was keine zahl ist.
Ich kanns mir zwar nicht vorstellen, aber mach mal ein TypeCast von analog1 mit string (string(analog1)) bevor du StrToInt aufrufst, denn tatsaechlich wird der PChar auch typegecastet wenn du ihn Caption zuweist( TCaption = type string). Vielleicht gibts ja ein Problem mit dem #0 Zeichen eines PChars. keine ahnung, ausprobieren. naheliegender ist allerdings, dass analog1 nonprintable characters enthaellt nachtrag: mach mal strlen(analog1) -> Bekommst du wirklich 5 raus?[/code] |
Moin Berbog,
zum einen schreibst Du Zitat:
Hast Du jetzt also eine Variable und eine Funktion mit gleichem Namen? Dann wäre noch die Frage was die Dokumentation für die DLL Funktion über die zu übergebenden Parameter aussagt. Eine Meldung "4|" ist kein gültiger Integerwert weist eigentlich darauf hin, dass analog1 ins Nirwana zeigt und keinen definierten Wert enthält. Um zumindest vor Aufruf der Funktion zu wissen, was analog1 enthält solltest Du den Speicher ggf. mit AllocMem reservieren, oder aber mit FillChar/ZeroMemory auf binär 0 initialisieren (Achtung, bei AllocMem muss vermutlich ein Byte mehr reserviert werden als gedacht, um Platz für die terminierende 0 zu haben) @DerKapitalist Zitat:
Wenn der, wie zumindest in der Windows API meist üblich, ein Pointer auf einen Buffer übergeben werden soll, in den die Funktion ihr Ergebnis schreiben soll, wird es wohl eher eine Kopie sein. |
@ Christian
du hast ja recht mit dem Nirvana, das wuerde ich ja auch sagen, wenn er aber nicht vorher schonmal den richtigen Wert aus der Variable rausbekommen hat. Oder wie wuerdest du dir das sonst erklaeren? Ich kann mir das nur so erklaeren, dass die Variable von irgendwas modifziert wird |
Moin Kapitalist,
das seh' ich ähnlich. Eine Möglichkeit wäre, dass vor der Exception erzeugenden Zeile noch etwas passiert, was hier fehlt, eine andere, die so etwas mehr in Deine Überlegungsrichtung geht, wäre, dass die DLL die Adresse speichert, und immer wieder neue Werte reinschreibt. So etwas allerdings programmseitig abzufangen, wird interessant. ;-) Es fehlen halt noch Informationen über die Funktion. |
Hallo
Ich habe festgestellt, das der Rückgabewert noch eine Stelle hinter dem Komma enthält, die allerdings nicht durch Komma sondern einen Punkt getrennt ist. Das wurde allerdings nicht angezeigt. Nun gehe ich davon aus, das die Fehlermeldung durch den Dezimaltrennpunkt verursacht wurde. Weiß einer von euch wie ich eine entsprechende Umwandlung vornehmen kann ? |
Kuck mal in der Hilfe unter DecimalSeparator.
|
Hallo, außerdem musst du dann statt IntToStr bzw. StrtoInt FloatToStr bzw. StrToFloat nehmen da es sich dann ja nicht um eine Integer Zahl handelt.
Gruß, Sebastian |
Hallo
Unter DecimalSeparator gibts keinen Eintrag (Schade) label6.caption := 'Neuer Wert '+ (floattostr(strtofloat(analog1))); bringt die gleiche Fehlermeldung gruss Bernd |
Hallo Bernd!
Welche Delphi-Version hast Du denn? Bei mir reicht nach F1 im Index "deci" - und er zeigt mir "DecimalSeparator (Variable)" an. Die ist übrigens in der Unit "SysUtils", sollte man mit uses einbinden! Gruß Dietmar Brüggendiek |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz