[Delphi]Integer型の配列をループなしで初期化したい
- 2006/04/18
- 08:12
778 名前:名前は開発中のものです。[] 投稿日:2006/04/04(火) 01:22:30 ID:6l9yFxzU
ループを使わないで配列を任意の値で埋める方法なんだけど、値が1バイトの時は
FillCharを使うとして、Integer等の時もループを使わないで済む方法は
あるんでしょうか?
例 a: array[0..100] of Integerの各要素を-1で埋めたい
ループを使う場合の方法
例)
for i:=0 to 100 do
begin
a[i]:=-1;
end;
これをやってくれる関数は無いのかという質問
もし配列を0で埋めたいならFillCharやZeroMemoryやFillMemoryが使えます
例)
FillChar(a,SizeOf(a), 0);
FillMemory(@a, SizeOf(a), 0);
ZeroMemory(@a, SizeOf(a)); //ゼロで埋めるための専用API
ただしこれらの関数では1バイトの数でしか埋めることが出来ません
質問ではIntegerで埋めたいと言っています。
なぜInteger型の配列には使えないかというと……
Integerのサイズを調べてみます。
SizeOf(Integer)
4を返すので4バイトです。
(ヘルプを見ると符号付き 32 ビットと書いてありました。)
もし配列を1で埋めると……
例)
FillChar(a,SizeOf(a), 1);
結果)
16843009
配列の値がそれぞれ16843009になってしまいます。
これは(01010101)(16進数)となってしまうからです。
本当は(00000001)(16進数)が望んだ結果です。
しかし、1バイト単位(01)でしか埋めることが出来ないので(01 01 01 01)となってしまったのです。
4バイト単位で配列を埋めてくれる関数も無いので質問の答えは「そんな方法はない」になります。
779 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 01:32:52 ID:jXr9r2Xj
>>778
ないっす・・・
for使うしかないと思う
forでなんか不都合ある?
780 名前:名前は開発中のものです。[] 投稿日:2006/04/04(火) 01:55:54 ID:6l9yFxzU
そう。ないのね。
別に不都合はないです。あれば使いたかった。
781 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 02:31:40 ID:ZQ16+LwC
ま、FillChar ;も内部でループ回してるだけだしなー
782 名前:名前は開発中のものです。[] 投稿日:2006/04/04(火) 02:44:07 ID:8yBi0Id5
>>778
自分でそういう手続きを書けばいいと思うよ
しかし気になるレスが……
783 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 08:08:17 ID:gUmPrsFh
>>778
-1なら$FFで梅なよ
787 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 11:37:10 ID:jXr9r2Xj
まあ、-1ならそれでいいわなw
余談ですが、このレスは間違ってると思いこんでいました。
「-1を$FFと表現方法を変えても意味がない。Byte(-1)でもいいじゃないか。
それより問題は4バイトをそれぞれ違う値で埋める方法があるかどうかなんだ。」
当時はキャストの問題を指摘していると早合点して深く考えていませんでした。
後から検証してわかったのですがFillCharの引数はマイナスでもエラーはでません。
その後、レスの正しさに気づくのに1万と2000秒かかりました。
実際に(FF)(16進数)で埋めたらどうなるのか。
もちろん(FFFFFFFF)(16進数)になります。
これはIntegerでは-1です。
(※利用したコンパイラではIntegerは符号付き32ビットでした。マイナスは2の補数で表現します。)
つまり、(FFFFFFFF)(16進数)は-1になります。
「ループを使わないで配列を任意の値で埋める」を条件付きながら達成してしまいました。
0や-1の他にも1バイトずつに区切って同じ数になる数(16843009、33686018など)なら初期化できます。(色情報ぐらいでしか実用性はなさそうですが)
0や-1で初期化したいことはよくあるので覚えておくと便利かもしれません。
ループを使わないで配列を任意の値で埋める方法なんだけど、値が1バイトの時は
FillCharを使うとして、Integer等の時もループを使わないで済む方法は
あるんでしょうか?
例 a: array[0..100] of Integerの各要素を-1で埋めたい
ループを使う場合の方法
例)
for i:=0 to 100 do
begin
a[i]:=-1;
end;
これをやってくれる関数は無いのかという質問
もし配列を0で埋めたいならFillCharやZeroMemoryやFillMemoryが使えます
例)
FillChar(a,SizeOf(a), 0);
FillMemory(@a, SizeOf(a), 0);
ZeroMemory(@a, SizeOf(a)); //ゼロで埋めるための専用API
ただしこれらの関数では1バイトの数でしか埋めることが出来ません
質問ではIntegerで埋めたいと言っています。
なぜInteger型の配列には使えないかというと……
Integerのサイズを調べてみます。
SizeOf(Integer)
4を返すので4バイトです。
(ヘルプを見ると符号付き 32 ビットと書いてありました。)
もし配列を1で埋めると……
例)
FillChar(a,SizeOf(a), 1);
結果)
16843009
配列の値がそれぞれ16843009になってしまいます。
これは(01010101)(16進数)となってしまうからです。
本当は(00000001)(16進数)が望んだ結果です。
しかし、1バイト単位(01)でしか埋めることが出来ないので(01 01 01 01)となってしまったのです。
4バイト単位で配列を埋めてくれる関数も無いので質問の答えは「そんな方法はない」になります。
779 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 01:32:52 ID:jXr9r2Xj
>>778
ないっす・・・
for使うしかないと思う
forでなんか不都合ある?
780 名前:名前は開発中のものです。[] 投稿日:2006/04/04(火) 01:55:54 ID:6l9yFxzU
そう。ないのね。
別に不都合はないです。あれば使いたかった。
781 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 02:31:40 ID:ZQ16+LwC
ま、FillChar ;も内部でループ回してるだけだしなー
782 名前:名前は開発中のものです。[] 投稿日:2006/04/04(火) 02:44:07 ID:8yBi0Id5
>>778
自分でそういう手続きを書けばいいと思うよ
しかし気になるレスが……
783 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 08:08:17 ID:gUmPrsFh
>>778
-1なら$FFで梅なよ
787 名前:名前は開発中のものです。[sage] 投稿日:2006/04/04(火) 11:37:10 ID:jXr9r2Xj
まあ、-1ならそれでいいわなw
余談ですが、このレスは間違ってると思いこんでいました。
「-1を$FFと表現方法を変えても意味がない。Byte(-1)でもいいじゃないか。
それより問題は4バイトをそれぞれ違う値で埋める方法があるかどうかなんだ。」
当時はキャストの問題を指摘していると早合点して深く考えていませんでした。
後から検証してわかったのですがFillCharの引数はマイナスでもエラーはでません。
その後、レスの正しさに気づくのに1万と2000秒かかりました。
実際に(FF)(16進数)で埋めたらどうなるのか。
もちろん(FFFFFFFF)(16進数)になります。
これはIntegerでは-1です。
(※利用したコンパイラではIntegerは符号付き32ビットでした。マイナスは2の補数で表現します。)
つまり、(FFFFFFFF)(16進数)は-1になります。
「ループを使わないで配列を任意の値で埋める」を条件付きながら達成してしまいました。
0や-1の他にも1バイトずつに区切って同じ数になる数(16843009、33686018など)なら初期化できます。(色情報ぐらいでしか実用性はなさそうですが)
0や-1で初期化したいことはよくあるので覚えておくと便利かもしれません。
- テーマ:プログラミング
- ジャンル:コンピュータ
- カテゴリ:オレ的学習
- CM:0
- TB:0