AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

32 Bit Wert verschieden interpretieren

Ein Thema von zeras · begonnen am 17. Mai 2012 · letzter Beitrag vom 17. Mai 2012
Antwort Antwort
Seite 1 von 2  1 2   
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.556 Beiträge
 
Delphi 11 Alexandria
 
#1

32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 16:54
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?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:13
Inwiefern werden die "falsch angefaßt"? Beispielcode?
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.556 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:23
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?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:25
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;

Geändert von Popov (17. Mai 2012 um 17:36 Uhr)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.556 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:41
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?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:47
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?
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.556 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:48
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:53
Ich kann das vielleicht nicht so richtig rumbringen.
Weil m.E. Quellcode fehlt.

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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:54
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.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.556 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: 32 Bit Wert verschieden interpretieren

  Alt 17. Mai 2012, 17:57
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf