Typumwandlung, welche Variante zieht ihr vor.

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Typumwandlung, welche Variante zieht ihr vor.

Beitrag von corpsman »

Hossa,

Ich habe einen String, welcher eine Vorzeichenbehaftete int16 Zahl darstellt. Dieser String sollte aber eigentlich eine Vorzeichenlose Int16 Zahl sein.

D.h. im Bereich 0.. 2^15-1 sind beide Interpretationen Gleich, danach wird die eine Negativ interpretiert, die andere entsprechend nicht. Zur Umwandlung habe ich mir die beiden Routinen

Code: Alles auswählen

Function convertsigned1(data: String): String;
Var
  i: word;
  s: Smallint;
  v: variant;
Begin
  s := strtoint(data);
  v := s;
  i := v;
  result := inttostr(i);
End;
 
Function convertsigned2(data: String): String;
Var
  i: ^word;
  s: Smallint;
Begin
  s := strtoint(data);
  i := @s;
  result := inttostr(i^);
End;


geschrieben. Beide funktionieren, die Frage ist nun was wäre der "Sauberere" Programierstiel ? Als 3. Option gäbe es auch noch die Mathematische Variante

Code: Alles auswählen

 
Function convertsigned3(data: String): String;
Var
  i: word;
  s: Smallint;
Begin
  s := strtoint(data);
  If s >= 0 Then
    i := s
  Else
    i := 65536 + s;
  result := inttostr(i);
End;   

Nur ist mir diese "zu rechenintensiv". So welche Variante würdet ihr nun Vorziehen ?

Gruß

Corpsman
--
Just try it

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: Typumwandlung, welche Variante zieht ihr vor.

Beitrag von diogenes »

Ich würd's mit

Code: Alles auswählen

function Signed2UnsignedStr( NumStr: string): string;
 var
  S: SmallInt;
begin
  S := StrToInt( NumStr);
  Result := IntToStr( PWord( @S)^)
 end;

probieren. Ähnlich Deiner 2. Variante, nur kompakter und mit einem Minimum an Variablenzuweisungen, die auch Zeit fressen.
Ceterum censeo computatores per Pascal docendos esse.

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Typumwandlung, welche Variante zieht ihr vor.

Beitrag von MmVisual »

Code: Alles auswählen

Result := IntToStr( StrToIntDef(sData, 0)); // << Rückgabe 0 wenn im String keine Zahl steht.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Typumwandlung, welche Variante zieht ihr vor.

Beitrag von corpsman »

@Mm Visual,

es geht nicht darum zu prüfen ob der String eine Gültige Zahl hat.

Sondern darum eine Zahl in String Form in die Byte Form zu konvertieren, und dann dieses Bitmuster als eine andere Zahlendarstellung zu interpretieren und daraus wieder einen String zu erzeugen.

Ein Beispiel in 8-Bit

Code: Alles auswählen

 
Binärdarstellung | Signed Interpretation | Unsigned Interpretation
------------------------------------------------------------------
00000000         | 0                     | 0
01111111         | 127                   | 127
10000000         | -128                  | 128
11111111         | -1                    | 255
 


Die von mir und diogenes geposteten Routinen wandeln einen String von "Signed Interpretation" in "Unsigned Interpretation" um.
--
Just try it

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Typumwandlung, welche Variante zieht ihr vor.

Beitrag von Michl »

Umwandlung ohne Zuweisung von Variablen funktioniert doch aber auch:

Code: Alles auswählen

Function convertsigned(data: String): String;
Begin
  result := inttostr(word(strtoint(data)));
End;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten