Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi 32 Bit Wert verschieden interpretieren (https://www.delphipraxis.net/168368-32-bit-wert-verschieden-interpretieren.html)

zeras 17. Mai 2012 15:54

32 Bit Wert verschieden interpretieren
 
Hallo,

ich bekomme über eine Schnittstelle 32 Bit Werte. Diese sind aber manchmal Single Zahlen, Longword und manchmal LongInt. Wenn ich diese falsch "anfasse", kommt immer wieder Fehler bei Bereichsüberschreitung. Wie macht ihr das?
Nehmt ihr mehrere verschiedene Variablen und deklariert sie dann über absolute auf die selbe Adresse oder wie macht ihr das?

Delphi-Laie 17. Mai 2012 16:13

AW: 32 Bit Wert verschieden interpretieren
 
Inwiefern werden die "falsch angefaßt"? Beispielcode?

zeras 17. Mai 2012 16:23

AW: 32 Bit Wert verschieden interpretieren
 
Ist ein wenig schwer zu erklären.
Wie gesagt, ich bekomme 4 Bytes und muss diese unterschiedlich interpretieren (single, longword, longint). Dann muss dieser Wert aber wieder an eine Funktion weitergereicht werden. Da ich aber nur diese 4 Bytes habe, weiß ich nicht, wie ich diese dann weiterreichen kann.

WriteToSvr(Adr, v) wobei hier v ein single wäre
WriteToSvr(Adr, v) wobei hier v ein longword wäre
WriteToSvr(Adr, v) wobei hier v ein longint wäre

Vielleicht irgendein Pointer, der alles beinhalten kann?

Popov 17. Mai 2012 16:25

AW: 32 Bit Wert verschieden interpretieren
 
Zum Prüfen

Delphi-Quellcode:
    { Prüft ob String ein Integerwert ist }
function IsValidInteger(S: String): Boolean;
var
  I, Code: Integer;
begin
  Val(S, I, Code);
  Result := Code = 0;
end;

    { Prüft ob String ein Currencywert ist }
function IsValidCurrency(S: String): Boolean;
var
  C: Currency;
begin
  Result := TextToFloat(PChar(S), C, fvCurrency);
end;

    { Prüft ob String ein Extendedwert ist }
function IsValidExtended(S: String): Boolean;
var
  E: Extended;
begin
  Result := TextToFloat(PChar(S), E, fvExtended);
end;
Ok, ich sehe du brauchst, LongInt, LingWord und Double. LongInt kannst du mit der oberen Funktion testen, für Single kannst du dir mit TryStrToFloat eine Funktion erstellen.

Delphi-Quellcode:
function TryStrToFloat(const S: string; out Value: Double): Boolean; overload;

//Ungeprüft

    { Prüft ob String ein Double ist }
function IsValidDouble(S: String): Boolean;
var
  Value: Double ;
begin
  Result := TryStrToFloat(S, Value);
end;

zeras 17. Mai 2012 16:41

AW: 32 Bit Wert verschieden interpretieren
 
Ich kann das vielleicht nicht so richtig rumbringen.

Als Quelle kommen 4 Bytes an. Durch Festlegung weiß ich, dass es Single, Longword oder LongInt ist. Diese können dann mittels verschiedener Spinedits verändert werden. Dazu habe ich dann an Hand der Kennung den Wert jeweils in ein Single, Longword oder LongInt gespeichert. Nun muss ich aber die verschiedenen Werte wieder über eine Funktion wieder in die 4 Bytes zurückbekommen. Vielleicht muss ich irgendwie mit overload arbeiten?

Popov 17. Mai 2012 16:47

AW: 32 Bit Wert verschieden interpretieren
 
Also nochmal, du muß es nicht prüfen, du weißt ob es Single, LongInt, LongWord ist, du willst nur wissen wie du es weiter leiten kannst?

zeras 17. Mai 2012 16:48

AW: 32 Bit Wert verschieden interpretieren
 
Zitat:

Zitat von Popov (Beitrag 1166966)
Also nochmal, du muß es nicht prüfen, du weißt ob es Single, LongInt, LongWord ist, du willst nur wissen wie du es weiter leiten kannst?

Ja, ich habe dann wieder eine Funktion, die die Daten wieder wegschreibt und dort werden einfach 4 Bytes gesendet.

Delphi-Laie 17. Mai 2012 16:53

AW: 32 Bit Wert verschieden interpretieren
 
Zitat:

Zitat von zeras (Beitrag 1166962)
Ich kann das vielleicht nicht so richtig rumbringen.

Weil m.E. Quellcode fehlt.

Zitat:

Zitat von zeras (Beitrag 1166962)
Als Quelle kommen 4 Bytes an. Durch Festlegung weiß ich, dass es Single, Longword oder LongInt ist. Diese können dann mittels verschiedener Spinedits verändert werden. Dazu habe ich dann an Hand der Kennung den Wert jeweils in ein Single, Longword oder LongInt gespeichert. Nun muss ich aber die verschiedenen Werte wieder über eine Funktion wieder in die 4 Bytes zurückbekommen. Vielleicht muss ich irgendwie mit overload arbeiten?

Ein wenig Quellcode sagt manchmal mehr als tausend Wörter.

Popov 17. Mai 2012 16:54

AW: 32 Bit Wert verschieden interpretieren
 
Hilft dir das weiter?

Delphi-Quellcode:
procedure MyTest(Value: Double); overload;
begin
  ShowMessage(FloatToStr(Value));
end;

procedure MyTest(Value: LongInt); overload;
begin
  ShowMessage(IntToStr(Value));
end;

procedure MyTest(Value: LongWord); overload;
begin
  ShowMessage(IntToStr(Value));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d: Double;
  i: LongInt;
  w: LongWord;
begin
  d := 1.7e308;
  i := -2147483647;
  w := 4294967295;

  MyTest(d);
  MyTest(i);
  MyTest(w);
end;
Und wie gesagt, ob du d oder i oder w als Variable nimmst, mußt du selbst vorher prüfen.

zeras 17. Mai 2012 16:57

AW: 32 Bit Wert verschieden interpretieren
 
Zitat:

Zitat von Popov (Beitrag 1166973)
Hilft dir das weiter?

Delphi-Quellcode:
procedure MyTest(Value: Double); overload;
begin
  ShowMessage(FloatToStr(Value));
end;

procedure MyTest(Value: LongInt); overload;
begin
  ShowMessage(IntToStr(Value));
end;

procedure MyTest(Value: LongWord); overload;
begin
  ShowMessage(IntToStr(Value));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d: Double;
  i: LongInt;
  w: LongWord;
begin
  d := 1.7e308;
  i := -2147483647;
  w := 4294967295;

  MyTest(d);
  MyTest(i);
  MyTest(w);
end;
Und wie gesagt, ob du d oder i oder w als Variable nimmst, mußt du selbst vorher prüfen.

So werde ich wohl erst mal ins Rennen gehen. Das sollte in etwa dem entsprechen, was ich brauche.
Vielen Dank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.
Seite 1 von 2  1 2      

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