3

GMPlib(多精度計算用のGnuライブラリ)のソースコードを見ると、mp*_t構造を構築するためのこの種のコードが見つかりました。そして、私が行った他のさまざまな作品でそれを複製しましたが、私はそれを完全には理解していません。

typedef struct
{
  int _mp_alloc;           /* Number of *limbs* allocated and pointed
                              to by the _mp_d field.  */
  int _mp_size;            /* abs(_mp_size) is the number of limbs the
                              last field points to.  If _mp_size is
                              negative this is a negative number.  */
  mp_limb_t *_mp_d;        /* Pointer to the limbs.  */
} __mpz_struct;

これは、2つの整数とaを持つ構造の「形状」を定義し、それを次のmp_limb_tようにtypedefすることを理解しています。__mpz_struct

次に、次の行があります。

typedef __mpz_struct mpz_t[1];

そしてしばらくすると、これはもう1つです。

typedef __mpz_struct *mpz_ptr;

2つ目は(関数プロトタイプで使用される)__mpz_struct *への型定義であることを理解していますmpz_ptr

しかし、私は最初のものが何をするのか、そしてなぜそれが機能するのか理解していないので、mpz_tを宣言することができます。なぜそれが機能するのか誰かが説明できますか?

ありがとう!

4

4 に答える 4

4

a を理解する最も簡単な方法は、 Define it like you use ittypedefというルールです。つまり、 a を宣言すると新しい名前が作成されますが、キーワードを削除すると、エイリアス タイプのオブジェクトが取得されます。typedeftypedef

例えば:

typedef __mpz_struct mpz_t[1];

これにより、「mpz_t」と呼ばれる新しい型名が作成されます。しかし、次のように書き直すと:

__mpz_struct some_obj[1];

何でも配列になることがすぐにわかります__mpz_struct。これで、新しい型が何をするかがわかりました。1 つの要素を持つmpz_t aの配列を作成します。__mpz_struct

于 2012-08-29T12:00:53.503 に答える
1
typedef __mpz_struct mpz_t[1];

mpz_t を 1 つの __mpz_struct の配列として定義します。興味があるのは、あなたがそうするなら

mpz_t x;

x を 1 つの __mpz_struct の配列として定義します。もしあなたがそうするなら

void f(mpz_t p) { ... }

f を__mpz_struct へのポインタを取る関数として定義するので、呼び出すことができます

f(x);

f を呼び出し、x の最初の (そして一意の) 要素へのポインターを渡します。f は x を変更する可能性があります。したがって、参照渡しをシミュレートする方法があります。2番目の関心事は、あなたが行う可能性を失っていることです

mpz_t x, y;

x = y;

なぜ面白いのですか?__mpz_struct にはポインターが含まれているためです。また、ポインターをコピーすることは正しいことではありません。ポイントされているものもコピーする必要があります。

ところでva_list、同じように定義されることもあり、それがその使用に関する制約を説明しています。

于 2012-08-29T12:13:27.927 に答える
1

最初のものは mpz_t を 1 つの __mpz_struct の配列に typedef します (typedef の構文は、型を宣言することを除いて、オブジェクトの宣言に使用されるものと同じです)。

余談ですが、typedef ポインターは、適切に const を正しくすることが難しくなるため、あまり良い考えではありません。

于 2012-08-29T12:01:38.133 に答える
0

配列は配列の最初の要素を指すポインターであるため、C の配列は実際にはポインターと同等です。ここでmpz_tは、1の配列を指すように単純に定義されています__mpz_struct

それが役に立ったことを願っています。

于 2012-08-29T12:01:22.347 に答える