FillChar()の第3引数の型について

解決


れお  2021-02-02 10:46:17  No: 149577  IP: [192.*.*.*]

System.FillCharの第3引数についてご教授ください。

http://docwiki.embarcadero.com/Libraries/Sydney/ja/System.FillChar
を参照すると、第3引数は「Value: Ordinal」と記述されておりますが、
Ordinalという型は何をusesすれば使用できるようになるのでしょうか。

お手数ですがご教授頂ければと思います。

編集 削除
mam  2021-02-02 12:34:59  No: 149578  IP: [192.*.*.*]

ヘルプには
Value は Byte 型または AnsiChar 型 とあります。

procedure TForm1.Button1Click(Sender: TObject);
var ast:AnsiString;
    len:integer;
begin
  setlength(ast,10);
  len:=Length(ast);
  FillChar(ast[1],len,AnsiChar('a'));
  ShowMessage(ast);
end;

procedure TForm1.Button2Click(Sender: TObject);
var b:TBytes;
    len:integer;
begin
  setlength(b,10);
  len:=Length(b);
  FillChar(b[0],len,0);
  ShowMessage(IntToStr(b[9]));
end;

ご参考まで、私はTBytes等を0に初期化する場合はZeroMemoryを使うことが多いです。
procedure TForm1.Button3Click(Sender: TObject);
var b:TBytes;
begin
  setlength(b,10);
  ZeroMemory(@b[0],length(b));
end;

編集 削除
れお  2021-02-02 23:16:19  No: 149579  IP: [192.*.*.*]

mamさん、ご回答ありがとうございます。

私はFillChar()の処理を以下のように変えたいと考えておりました。
******************
procedure FillCharEx(var X; Count: Integer; Value: Ordinal)
begin
  if ( Count < 64 ) then begin
    FillCharFast( X, Count, Value );
  end else begin
    System.FillChar( X, Count, Value );
  end;
end;
******************
そこで第3引数をどのように記述すればコンパイルが通るのか知りたかったのです。

以上、Ordinalについてもう少し情報を頂けると幸いです。

編集 削除
HFUKUSHI  2021-02-03 02:53:10  No: 149580  IP: [192.*.*.*]

上記のFillCharのdocwikiにあるとおり、FillCharは組み込みルーチンです(コンパイラマジックとかプリミティブとも呼ばれることがあります)。
http://docwiki.embarcadero.com/RADStudio/Sydney/ja/Delphi_%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3
これらの関数は基本的にコンパイラレベルで処理されているため、同様の処理を作ることはできませんが、
> Value は Byte 型または AnsiChar 型
とあるので、
procedure FillCharEx(var X; Count: Integer; Value: Byte); overload;
procedure FillCharEx(var X; Count: Integer; Value: AnsiChar); overload;
とオーバロードを2つ用意すればいいように思います。

参考にしてください。

編集 削除
Mr.XRAY  2021-02-05 10:07:41  No: 149582  IP: [192.*.*.*]

> Ordinalという型は何をusesすれば使用できるようになるのでしょうか。
> 以上、Ordinalについてもう少し情報を頂けると幸いです。

組み込みルーチンの説明のレスがあるので余計なお世話で不要かとは思いますが,
Ordinal は組み込みルーチン内だけで使用されている「型名」でしょう.
どのユニットにも定義はありません.つまり使用できません.
同じ組み込みルーチンの Ord 関数の引数も Ordinal です.
Ord は Ordinal の略でしよう.おそらく.

英語圏の方であればそのままですが,Ordinal の意味は順序値 (または順序型) です.
ただし,FillChar の第 3 引数は 1 バイト ( $0 ~ $FF),
Ord 関数の引数は 2 バイト ( $0 ~ $FFFF - Delphi 2007 以前では 1 バイト) です.
              
順序型なので文字も使用できます.
FillChar の第 3 引数には 65 も $41 も #$41 も AnsiChar('A') も使用できます

[ 単純型(Delphi) - RAD Studio - 順序型 ]
http://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E5%8D%98%E7%B4%94%E5%9E%8B%EF%BC%88Delphi%EF%BC%89#.E9.A0.86.E5.BA.8F.E5.9E.8B

http://docwiki.embarcadero.com/RADStudio/Sydney/en/Simple_Types_(Delphi)#Ordinal_Types

編集 削除
れお  2021-02-12 03:40:05  No: 149594  IP: [192.*.*.*]

お返事が遅くなり申し訳ありません。

皆様ご回答ありがとうございました。
非常に勉強になりました。

編集 削除