0

すべてのプログラミング フォーラムには、何百もの配列トピックがあります。たぶん数千。毎日。しかし、それらのどれもこの側面に触れていません。

配列は 0 からインデックス付けされるため、1 から始まるデータにアクセスすることがよくあります。その理由は、ゼロ フィールドは通常、多数の名前付き変数の代わりに、列または行の合計、およびステータス フラグを保持するのに適しているためです。の 4 番目のエントリは 3 ではなく 4 として表示されるため、常に読む方が理にかなっています。建物の 1 階を「1」、次の階を「2」または 2 階と呼ぶ人もいます。地上 1 階を 1 などと呼ぶ人もいます。このため、人々は建物の中で迷子になります。要求の厳しい CAD の世界では、思考の流れを妨げるものはすべて、どんなに些細な混乱であっても、収入の損失に等しいものです。したがって、私は自然な概念モデルにできるだけ近い配列が好きです。

最初の質問は..これは受け入れられる慣行ですか?もしそうでなければ、なぜですか?自分のコードを読んでいるのは私だけですが、それを共有することはめったにありません。慣習から離れすぎないことに価値があると思います。少なくとも私が血まみれの道を歩むなら、その理由は明らかです。

さらにいくつかの質問があり、それらは独自のスレッドに値する可能性がありますが、それらはすべて何らかの形で互いに関連しているため、それらもレイアウトします.

また、ソフトウェアが使用される現実の世界では、これらのケースが発生しないため、配列の一部が冗長であることがよくあります。質問 2: 大きな配列を使用するのではなく、データの使用を再考して、これらのデッド エリアが最小限に抑えられる、同様の小さな配列にすることは許容される慣行ですか? 上記の質問にどのように関連するかというと、これは、それ自体が不要になる可能性のあるゼロ-ゼロ フィールドのさらに別のセットになるということです。「記憶はたくさんある」という感情があることは知っていますが、どういうわけか、私はただのずさんな考えにすぎません。

そして私の最後の質問: 時折、インデックスにオフセットを追加して、ユーザー履歴を処理する余分な次元**に対応しています

printf("   %s \t %d \n", foo[i],bar[i][c]);
printf("   %s \t %d \n", foo[i],bar[i][c+1]);
printf("   %s \t %d \n", foo[i],bar[i][c+2]);

だから私はここでいくつかのことを心配しています. アクセスごとに計算を行うのはスピードヒットですか? モバイル アプリの世界では、これは回避できた可能性のあるバッテリーの使用量を表しているのでしょうか?

** これを読んでいる初心者のために、3 次元配列をルービック キューブと考えれば、4 次元以上の配列は簡単に理解できます。あなたが座っている部屋の中にもう1つまたは2つのキューブを横に置くと、4つになります. 部屋でいっぱいの建物は 5 番目であり、建物の都市ブロックが 6 であり、都市の州が 7 であり、国などがそれ以上です。

4

1 に答える 1

0

トレードオフを理解するための良い出発点は、あなたが話していることの名前を知ることです。これは「ゼロベースの番号付け」と呼ばれ、ウィキペディアで読むことができます。

http://en.wikipedia.org/wiki/Zero-based_numbering

ゼロは直感に反するという考えには長い歴史があり、 「自然数」という用語にそれを含めるべきかどうかは今日まで議論されています。私はそれが自然だと思います、そしてその正面玄関を含む建物の床には0のラベルを付けることを好みます(そして地下駐車場のレベルは-1、-2、-3 ...)

(それから、私は、循環定数が円周率の現在の値の2倍になるべきであるという考えを支持していました。これは、その傾向がインターネット上で大きくなる何年も前のことです。)

ダイクストラは、ゼロベースのインデックス付けが理にかなっていると主張しました。彼の理論的根拠は、プログラマーは、境界として-1を呼び出さなくても、範囲内の数値ゼロについて話せるようにしたいと考えているということです。

http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

トレンドに逆らい、1ベースの番号付けを使用している現代語の中には、fiatによるRebolと慣例によるLuaがあります。Rebolは本当によく考えられていると思いますが、これは私が同意しない決定の1つです。一般的に言って、1ベースのシステムによってもたらされる利点は標準を持っていることよりも重要であると私は感じています...そしてプロセッサアーキテクチャはこの点ですぐに変わることはないでしょう。

さて、このビットについては:

私はまだ多くの場合、1から始めて自分のデータにアクセスします。ゼロフィールドである理由は、通常、多数の名前付き変数の代わりに、列または行の合計、およびステータスフラグを保持するのに適しています。

それは非常に危険な行為のように聞こえます。この方法で配列を悪用すると、言語が持つ境界チェック機能を破壊しているため、問題が発生します。極端に言えば、このプログラミング方法では、個別の変数を完全に排除する必要があります。構造と型システムには理由があります。

これに関して:

時々、余分な次元に対応するためにインデックスにオフセットを追加しているので(...)、ここでいくつかのことを心配しています。アクセスごとに計算を行っていますか?モバイルアプリの世界では、これは回避できたはずのバッテリー使用量を表していますか?

これらの追加にかかる時間は、正しい配列境界を使用しないことで発生するバグと比較して、懸念事項が最も少ないことを保証します。

于 2012-11-17T22:35:27.380 に答える