AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pchar Rückgabe

Ein Thema von berbog · begonnen am 29. Dez 2002 · letzter Beitrag vom 30. Dez 2002
Antwort Antwort
Seite 2 von 3     12 3      
berbog

Registriert seit: 17. Dez 2002
Ort: Halver
12 Beiträge
 
Delphi 5 Professional
 
#11
  Alt 29. Dez 2002, 13:09
Hallo Alle

Hier der Code
Delphi-Quellcode:
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
[edit=Daniel B]Delphi-Tags; MfG Daniel B.[/edit]
wer früher stirbt ist länger tod
  Mit Zitat antworten Zitat
DerKapitalist

Registriert seit: 25. Dez 2002
37 Beiträge
 
#12
  Alt 29. Dez 2002, 14:17
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]
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#13
  Alt 29. Dez 2002, 14:27
Moin Berbog,

zum einen schreibst Du

Zitat:
Dll Funktion analog1 wird ausgelesen und als Wert angezeigt
zum anderen deklarierst Du eine Varible mit dem Namen analog1.

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 von DerKapitalist:
Bei Übergabe von PChars erhaellst du naemlich keine Kopie der Daten sondern das Original.
Das dürfte wohl von der aufgerufenen Funktion abhängen.
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
DerKapitalist

Registriert seit: 25. Dez 2002
37 Beiträge
 
#14
  Alt 29. Dez 2002, 14:35
@ 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#15
  Alt 29. Dez 2002, 14:55
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
berbog

Registriert seit: 17. Dez 2002
Ort: Halver
12 Beiträge
 
Delphi 5 Professional
 
#16
  Alt 29. Dez 2002, 17:17
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 ?
wer früher stirbt ist länger tod
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17
  Alt 29. Dez 2002, 17:36
Kuck mal in der Hilfe unter DecimalSeparator.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#18
  Alt 29. Dez 2002, 18:08
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
  Mit Zitat antworten Zitat
berbog

Registriert seit: 17. Dez 2002
Ort: Halver
12 Beiträge
 
Delphi 5 Professional
 
#19
  Alt 29. Dez 2002, 19:42
Hallo

Unter DecimalSeparator gibts keinen Eintrag (Schade)

label6.caption := 'Neuer Wert '+ (floattostr(strtofloat(analog1)));
bringt die gleiche Fehlermeldung

gruss Bernd
wer früher stirbt ist länger tod
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#20
  Alt 29. Dez 2002, 20:06
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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz