No.5ベストアンサー
- 回答日時:
整数であればmemsetで0を埋めればよいのですが、浮動小数点数やポインタの場合、内部表現が0とは限らないので、次のような関数を使えば一応ループを回避できます。
void fill(int *array, size_t n)
{
if (n > 0)
{
*array = 0;
fill(array + 1, n - 1);
}
}
ここで、arrayの型は必要に応じて変更してください。
例えば、double型の配列ならdouble *arrayとしてください。
あるいは、もう一つの手として、あらかじめ全要素を0で初期化した配列を別に用意しておいてmemcpyでコピーするなら、どんな型でもOKです。
この回答への補足
一応使えているのですがポインタの部分とsize_tの指定が、よく理解できないのでよければ、この文がどのように動いているのか解説してもらえないでしょうか。
補足日時:2007/05/27 01:54回答ありがとうございます。
memsetでは計算したときに違った値を出してくるときがあったので助かりました。
回答ありがとうございました。
No.6
- 回答日時:
すいません。
知識が乏しく、嘘をいってました。インテルコンパイラの説明書リンクします。
ベクトル化って調べるとかなり不明なことが書かれていました。適当なこと言ってしまいました。
インテルコンパイラなら、インテルの言うところのベクトル化をしてくれます。
が正しいです。
インテルの言うところのベクトル化はURLを参考ください。
msnで適当に探したものなので、もしかしたら消えるかも。。
参考URL:http://download.intel.com/jp/developer/jpdoc/cco …
再度の回答ありがとうございます。
ベクトル化については、URLを参照させていただきました。
まだ、理解しきれませんでしたがコンパイラによってはそのような機能があることを知れて勉強になりました。
ありがとうございます。
No.8
- 回答日時:
C99が使えるなら
int x[10];
struct foo
{
int mem[10];
};
*(struct foo*)&x = (struct foo){0};
これなら、内部表現が非0の型でも平気。
No.9
- 回答日時:
#5です。
> 一応使えているのですがポインタの部分とsize_tの指定が、よく理解できないのでよければ、この文がどのように動いているのか解説してもらえないでしょうか。
指定方法ですが、
int a[10];
fill(a, 10);
とします。
動作ですが、再帰的にa[9], a[8], a[7], ..., a[0] に0を埋めているだけです。
ついでに、
> #8
構造体のメンバが配列だけの場合でも、サイズが同じになるかどうかは規格上保証されません。
No.10
- 回答日時:
「ループを使わない目的」はなんですか?
結局、トレードオフになるわけですが、
例えばANo.5のコードはループを再起呼出で置換してるものです。
一般に再起はループより理解しがたい(≒保守しにくい)といわれますし、
別に速度上の優位性があるわけでもないですし(劣るとも限りませんが)。
目的が「ループを使わないでかけるか」というパズル(知的遊戯)なら十分な解ですが、
C言語で再起処理にするメリットが考えにくいところです。
もしも速度に焦点があるなら、実行速度が確保できる可能性が高そうなのは多分、
> あるいは、もう一つの手として、あらかじめ全要素を0で
> 初期化した配列を別に用意しておいてmemcpyでコピーする
これじゃないですかね。
どの程度のメモリが要求されるかは配列サイズ次第ですが、
再起関数を書いてもコード領域は使いますし。
この回答への補足
回答ありがとうございます。
ループを回避したいのは、ある程度ループが繰り替えされるとなぜか
プログラムが強制終了されてしまうからです。
この原因が分かればループを使うのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- マウス・キーボード Google検索の英語キーボード 英語のキーボードの配列が元に戻らなくなりました まえの配列は左上に 1 2022/06/19 11:41
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Excel(エクセル) Excelで、あるセルだけ入力させたい、オートフィルターも使わせたい際のシートの保護 2 2023/02/23 15:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
配列を使わずに、変数名を動的...
-
sinのマクローリン展開
-
C# 配列の変数宣言について。
-
unsigned char配列への入力の仕方
-
配列をEraseしてもメモリが開放...
-
ExcelVBAで質問です。離れた二...
-
テキストファイルから文字列を...
-
パイソンの
-
配列を含む構造体の初期値について
-
配列の参照渡しで型が一致しま...
-
【速いブラインドタッチ】手を...
-
入力関数(配列4個)を作成するプ...
-
複数の選択範囲の行番号を個別...
-
配列内の文字間を排他的論理和...
-
c言語でのヒストグラム作成用の...
-
C言語でのカンマ区切りについて
-
Visual C++で配列を動的に確保...
-
C言語で巨大配列を作るにはどう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報