喫茶XRAYトップページ

[スレッド全体
]

[10378] Re:ありがとうございました。返信 削除
2016/9/11 (日) 11:46:34 taka
▼ nyさん
> LCardinal := Cardinal(StrToInt64(LText));
> これでうまく変換できました。
> LCardinal := StrToInt64(LText);
> これでもエラーになりませんが「0」がかえってくることがありました。

型の数値の範囲を外れると0になったり想定外の数値になります。

例:Cardinal(StrToInt64('-1'));         結果: 4294967295
例:Cardinal(StrToInt64('4294967296')); 結果: 0

Cardinalは、符号なし整数なので (Cardinal  0..4294967295)
文字列から「0または正数」に変換するので以下の処理が必要です
・負の数値の文字列の処理
 エラーとするか、0にするか,Cardinalの最大値とするか
・オーバーフローの処理
 エラーとするか、0にするか,Cardinalの最大値とするか

直接 Cardinal変数に代入するのではなく
一度Int64型の変数に代入してから処理してください。

procedure TForm1.Button1Click(Sender: TObject);
var
  v : Cardinal;
  i64 : int64;
begin
  i64 := StrToInt64('4294967296');
  if (i64 < 0) then
  begin
//   raise EIntError.Create('正数を入力してください');
    i64 := 0;
  end;
  if (i64 > $FFFFFFFF) then
  begin
//   raise EIntOverflow.Create('Cardinalのサイズを超えました');
   i64 := $FFFFFFFF;
  end;
  v := Cardinal(i64);
  ShowMessage(IntToStr(v));
end;


[10382] Re2:ありがとうございました。返信 削除
2016/9/13 (火) 16:48:39 Mr.XRAY
▼ takaさん

> 直接 Cardinal変数に代入するのではなく
> 一度Int64型の変数に代入してから処理してください。


確かに.
変数の型の範囲には十分注意ですね.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82