1

関数呼び出しから割り当ての正しいデータ型を見つけるのに助けが必要です。

contentのフィールドのデータを取得しようとしていますN_Vector u。ドキュメントの内容は次のとおりですN_Vector

タイプN_Vectorは次のように定義されます

N_Vector u;
tpedef struct _generic_N_Vector *N_Vector;
struct _generic_N_Vector {
  void *content;
  struct _generic_N_Vector_Ops *ops;
};

..。

[並列NVECTORモジュール]は、のコンテンツフィールドを、N_Vector グローバル長とローカル長を含む構造体、連続するローカルデータ配列の先頭へのポインター、MPIコミュニケーターおよびフラグとして定義します。

struct _N_VectorContent_Parallel {
  long int local_length;
  long int global_length;
  booleantype own_data;
  realtype *data;
  MPI_Comm comm;
}

contentつまり、タイプの構造を_generic_N_Vector「指し示す」ということだと思い_N_VectorContent_Parallelます(右?)。

次に、にアクセスするためにマクロを使用しようとしますcontent。これがのドキュメントですNV_CONTENT_P

v_cont=NV_CONTENT_P(v)タイプのコンテンツ構造v_contへのポインタになるように設定します。N_Vectorstruct _N_VectorParallelContent

構造体の別の名前に注意してください!

どういう意味ですか?私はどのタイプであると宣言v_contしますか?

私は試した

N_Vector u;
...
_N_VectorParallelContent *v_cont1;
_N_VectorContent_Parallel *v_cont2;
v_cont1 = NV_CONTENT_P(u);
v_cont2 = NV_CONTENT_P(u);

ただし、これらの宣言では、「'_ N_VectorContent_Parallel'undeclared...」または「'_N_VectorParallelContent'undeclared...」というエラーが発生しました。

しかし、これらの構造はすでに削除されている必要があるようです。uタイプのを正常に宣言(および使用)しましN_Vectorた。そして、ドキュメントにはN_Vector、これら2つの構造の1つ(または両方)が含まれていると書かれているようです。

では、なぜエラーメッセージが表示されるのでしょうか。 v_cont データを受信 するために宣言する正しいデータ型は何NV_CONTENT_Pですか?

これは長くて詳細な質問であることは知っていますが、それを理解するのに十分な理解がありません。ご協力いただきありがとうございます。

4

1 に答える 1

1

私はこの特定のライブラリに精通していませんが、ドキュメントが少し一貫していないように見えます。

についての宣伝文句の直後にNV_CONTENT_P(v)、それNV_CONTENT_P(v)は次のように定義されていると言います:

#define NV_CONTENT_P(v) ( (N_VectorContent_Parallel)(v->content) )

そのため、その名前のバージョンはおそらく正しいでしょう。そのページにの定義が表示されませんN_VectorContent_Parallelが、おそらくどこかでのようなものとして定義されていますstruct _N_VectorContent_Parallel*。したがって、おそらく次のことができます。

N_VectorContent_Parallel v_cont1 = NV_CONTENT_P(u);

struct構造体の場合、は型名の一部であることを忘れないでください。これは、以下を含めていないため、例でエラーが発生していることを意味しますstruct

// this is an unknown type
_N_VectorParallelContent *v_cont1; 

// this is a "struct _N_VectorParallelContent"
struct _N_VectorParallelContent *v_cont1; 

// But use this one, as it follows the macro
N_VectorContent_Parallel v_cont1;

プリプロセッサがコードに対して行ったことを正確に確認したい場合は、gccの-Eフラグを使用できます。

-E    Stop after the preprocessing stage; do not run the compiler proper. 
   The output is in  the form of preprocessed source code, which is sent to 
   the standard output.
   Input files which don't require preprocessing are ignored.

これは、マクロと複数の複雑なヘッダーファイルの結果を確認する場合に特に便利です。


編集:リンクしたソースから:

typedef struct _N_VectorContent_Parallel *N_VectorContent_Parallel;

これは、 (へのポインタ)N_VectorContent_Parallelと同じであるというタイプ定義です。つまり、次の構文を使用してアクセスできます。struct _N_VectorContent_Parallel *struct _N_VectorContent_Parallelv_cont1->

N_VectorContent_Parallel v_cont1;
printf("%d",v_cont1->local_length);

a->bisは省略形です(*a).b。これは、構造体へのポインタを介して構造体のメンバーにアクセスするために必要な間接参照を記述する、より見栄えの良い方法です。それが紛らわしいと思われる場合は、この質問に対する私の回答を参照してください。

a.b個人的には、このようなポインターを非表示にするtypedefは好きではありません。コードを見ても、またはを使用する必要があるかどうかを判断するのが難しいためですa->b

于 2012-09-03T02:39:50.390 に答える