2016-10-18 8 views
0

メモリアドレスに2次元の浮動小数点配列を作成しようとしています。 これは私が持っているものです:私はこのラインで「飛び出す」だアドレスの2次元浮動小数点配列

float ** adresse = (float**)(0xC0000001); 
uint8_t dim1Size = 16; 
uint16_t dim2Size = 11; 
for(int i = 0; i < dim1Size; i++) 
{ 
    adresse[i] = (float*)(adresse+dim1Size*sizeof(float*) + dim2Size*sizeof(float)); 
} 

:だから私は何か間違ったことをやっている

adresse[i] = (float*)(adresse+dim1Size*sizeof(float*) + dim2Size*sizeof(float)); 

。 あなたは何が間違っているのか、なぜか私に言うことができますか?

+0

データは2次元配列やポインタベースのルックアップテーブルの場合は明確にしてください。あなたは2D配列を話していますが、コードには2D配列はありません。 – Lundin

+0

実際の2次元配列を作成することはできませんが、配列の境界次元を静的(コンパイル時)に指定することはできません。あなたはポインタを使用しており、ポインタは配列と同じものではありません。 –

答えて

2

コードには多くの前提があります。

ポインタに整数の変換は実装が定義される:

(float**)(0xC0000001); 

得られたポインタが正しく参照される型のために整列されなければなりません。 1で終わるアドレスはおそらくfloat *型に対して正しく整列されていません。

これを修正したら、float型ポインターの配列とfloat型の2次元配列の2つの割り当てを持つ必要があります。

float ** adresse = //aligned and valid memory of size sizeof(float*) * dim1Size 
float* objects = //aligned and valid memory of size sizeof(float) * dim1Size * dim2Size 

次に、ポインタ配列を反復処理:

for(size_t i = 0; i < dim1Size; i++) 
{ 
    adresse[i] = objects + dim1Size; 
} 
+0

ここでの主な問題は、そのアドレスに配置されたポインタ配列ではなく、浮動小数点数の2次元配列である可能性が最も高いことです。この場合、この回答は役に立ちません。 – Lundin

関連する問題