2010-12-07 12 views
0

最初のエラー:C - 1次元配列を2つにマップする - なぜこれは機能しないのですか?

error: a value of type "float *" cannot be used to initialize an entity of type "float (*)[2000]" 

HERESに関連するコード:私は後で関数に二重ポインタを渡すと、参照できるように2次元にそれを正規化しようとしてい

#define opType float 
const int N = 2000; 
opType *a_h,*b_h,*d_h, *a_d,*b_d, *d_d; 
opType (*normalized_a)[N] = a_h; 
opType (*normalized_b)[N] = b_h; 
opType (*normalized_d)[N] = d_h; 

opType (*normalized_a_d)[N] = a_d; 
opType (*normalized_b_d)[N] = b_d; 
opType (*normalized_d_d)[N] = d_d; 

2つの次元は略式のブラケット構文を使用します。私はCUDAを使用していますので、メモリをコピーするための1次元宣言が必要です。上記の作業を行う方法はありますか?

この構築物は、あなたの配列の初期化のためのデータがどこから来るか、私は表示されませんhttp://forums.nvidia.com/index.php?showtopic=83941&view=findpost&p=475901

int linear[10*32]; // linear array 
int (*twodim)[32] = linear; // interpreted as a two-dimensional [10][32] array. 
assert(&twodim[2][4] == &linear[2*32 + 4]); // these are the same 
+2

'typedefを使用してください。 – nmichaels

+0

良いキャッチ、私は将来を考えています。 –

答えて

2

から借用されますが、エラーメッセージは非常に明確である: あなたは6つのアレイ、そのそれぞれを宣言します2000浮動小数点ポインタが含まれています。もちろん、これらの配列のいずれかを浮動小数点ポインタで初期化することはできません。

あなたの基本データはどのような形式で、どのように使用したいですか?

編集: OK、あなたのコメントをもとに、あなたが

値で埋め
float myData[N][N]; 

のようなものを持っています。このフォームでは、すでにmyData [i] [j]としてアクセスできます。さて、あなたはちょうどあなたがまたmyDataFlatを介してアクセスすることができます

float *myDataFlat = (float*)myData; 

のようなフロートポインタにそれを上にキャストした場合、[私はN + jを*]。

+0

編集を参照してください。私のベースデータはN * N個のフロートに割り当てられます。私は基本的に 'float x [N] [N]'をシリアル化しようとしていますが、何らかの形でもシリアル形式でも2次元(二重ポインタ)であるかのように参照できます。 –

0

配列に変数を初期化することはできません。一部のメンバーをconstantに初期化することができます。 その場合、それは次のようになります。

opType (*normalized_a)[N] = {0}; /* all members 0 */ 

か、ループまたはにmemsetを使用することができます。

0

私はCの専門家ではありません。私はエラーが型不一致のためだと思います(C++であったようです)。
私はあなたが割り当てにいくつかのキャストを行う必要があると思います。それは読みやすくするには、typedefを紹介する必要があります:私はあなただけの楽しみのためにグローバル変数を使用していると仮定

typedef float opType; 
const int N = 2000; 
typedef opType (*TPointerToArray)[N]; // may be defined outside of a function 
opType *a_h; // no value assigned yet 
TPointerToArray normalized_a; // no value assigned yet 

void MyCode() 
{ 
    ... 
    a_h = ...; // i don't know how the value is assigned; it should be done first 
    ... 
    normalized_a = (TPointerToArray)a_h; // "normalization" 
    normalized_a[100][200] = 900; // usage 
    ... 
} 

を。それは大したことではありません。
このコードでは、技術的には、normalized_aは配列へのポインタですが、配列の配列または2次元配列として考えることができます。

関連する問題