2012-03-07 11 views
1

私は次元がx * y * zであるいくつかの実際に大きなイメージキューブを扱っています。C配列での参照渡しの3D配列

現在、私はこれが私のためにうまく働いたが、今私は、コードの一部を書き換えることだし、参照することによって配列を渡すことができるようにしたいと思い、このような

int ***input = malloc(sizeof(int **)*(lines)); 
int d; 
int i; 
for(i = 0 ; i<lines ; i++) { 
    input[i] = malloc(sizeof(int *)*bands); 

    for(d = 0 ; d<bands ; d++) { 
     *input[i][d] = malloc(sizeof(int)*(samples)); 
    } 
} 

としてそれらを扱ってきました

私は私が渡す必要行うために考えのような機能がどのように見えるfoo(&input)

foo(int ****input) { 
    *input = malloc(sizeof(int **)*(lines)); 
    int d; 
    int i; 
    for(i = 0 ; i<lines ; i++) { 
     *input[i] = malloc(sizeof(int *)*bands); 

     for(d = 0 ; d<bands ; d++) { 
      *input[i][d] = malloc(sizeof(int)*(samples)); 
     } 

    } 
} 

しかし、最初のfor(i...) `ループに入った後にsegフォルトを受け取ったようです。 ご意見は非常に役に立ちます。ありがとうございます。

+0

'int **** input' ... o_O – Mankarse

+1

C言語では「参照渡し」はありません。常に値渡しです。この場合、値はポインタです。セマンティクスは、多分、あなたがやっていることをよりよく理解するのに役立つでしょう...また、あなたは 'typedef'を考えましたか?ああ、誰かのために 'malloc'の失敗を確認してください。 – littleadv

+0

@Mankarse笑、私はそれがばかげているのは分かっていますが、それは正しい構文ではありませんか? – Ponml

答えて

5

入力が3Dベクトルへのポインタであるとき、これは素晴らしいです:

/* original */ 
input[i] = malloc(sizeof(int *)*bands); 

入力がint ****なると:ベクトルのポインタへのポインタを、この変更が正しくありません:

/* original */ 
*input[i] = malloc(sizeof(int *)*bands); 

あなたは欲しい:

/* original */ 
(*input)[i] = malloc(sizeof(int *)*bands); 

Cでは、*x[y]はを意味する。

Aはるかに単純なことは、ローカル変数を使用することです:

void function(int ****pinput) 
{ 
    int ***input = malloc(/* ... */); 
    /*...code stays the same as before...*/ 
    *pinput = input; /* place it in the location specified by caller */ 
} 

また、の元に、いくつかの文体の調整を行いましょう。 (mallocの故障チェックの欠如を無視する):

int ***input = malloc(lines * sizeof *input); 

int d; 
int i; 

for(i = 0 ; i<lines ; i++) { 
    input[i] = malloc(bands * sizeof *input[0]); 

    /* Noticed an error here: you have *input[i][d] = ... 
     but input[i][d] the pointer to the band; 
     *input[i][d] is input[i][d][0]! */ 
    for(d = 0 ; d<bands ; d++) 
     input[i][d] = malloc(samples * sizeof *input[0][0]); 
} 

私はいくつかの不要な括弧を取り出し、代わりに(int **)、などを繰り返しての、それはポインタ式の型が割り当てられてオフに基づいているようにはsizeof計算を変更しましたに。

+0

+1。インデックスは、参照解除より優先されます。 http://en.cppreference。com/w/cpp/language/operator_precedence – littleadv

+0

または、より一般的には、後置演算子は単項よりも優先順位が高くなります。 – Kaz

+0

多くのおかげで、私は仕事のコードに戻ることができるときにこれをテストします。乾杯。 – Ponml