0

float a[]この配列に a とオフセットを取り、そのオフセットの要素を返す関数を書いているとします。署名を使用することは合理的ですか

float foo(float* a, off_t offset);

それのための?またはoff_t、任意の要素サイズのポインター演算ではなく、バイト単位のオフセットにのみ関連していますか? つまりa[offset]、いつオフセットがタイプであるかを言うのは合理的off_tですか?

GNU C ライブラリ リファレンス マニュアルには次のように書かれています。

off_t
     This is a signed integer type used to represent file sizes. 

しかし、それは私に多くを教えてくれません。

私の直感では、答えは「いいえ」です。 a[offset] で使用される実際のアドレスは + sizeof(float) * offset のアドレスであるため、「sizeof(float) * offset」は でありoff_t、 sizeof(float ) は でありsize_t、どちらも「次元」を持つ定数です。

注:オフセットは負になる場合があります。

4

4 に答える 4

2

size_torをインデックスのタイプとして使用できますptrdiff_t(2番目のパラメーターは、オフセットよりも浮動小数点配列内のインデックスです)。

あなたの使用はインデックスであり、オフセットではありません。標準のoffsetofマクロは、バイト オフセットを返すように定義されていることに注意してください。

実際には、配列に何十億ものコンポーネントがあると思わない限り、intorを使用することもできます。unsigned

必要に応じて#include <stdint.h>(または<cstdint>最近の C++ を使用して) int32_t、インデックスのような明示的なサイズの型を使用することができます。

ソースの読みやすさの理由から、次のように定義できます。

  typedef unsigned index_t; 

後でそれを使用します。

  float foo(float a[], index_t i); 

私の意見ではint、インデックスのタイプとして使用する必要があります。(ただし、範囲外のインデックスは適切に処理します)。

于 2013-07-15T07:50:55.973 に答える
1

私はそれが適切ではないと言うでしょう、なぜなら

  1. off_tファイルサイズを表すために(使用されることを意図して)使用されます
  2. off_tサインタイプです。

私はsize_type(通常、の「typedef」された名前size_t)に行きます。これは、stdコンテナーで使用されるものです。

于 2013-07-15T07:51:27.003 に答える
0

おそらく答えはptrdiff_t?を使用することです。これ...

  • 負になる可能性があります。
  • 違いはバイト単位ではなく、要素の種類に応じた任意のサイズの単位であることを示しています。

どう思いますか?

于 2013-07-15T08:02:02.890 に答える