2016-03-28 3 views
1

2次元配列から4つのセルの平均をとるコードを書いた。条件は、最後の列/行を無視しない場合は、列と行を偶数値にする必要があるということです。2D配列が与えられた - 元の配列の値を使用して新しい配列を作成したい

これはヘッダーファイルの一部であることを忘れていました.2D配列はmain()を含む別のファイルの配列[x] [y]として定義されています。 pastebin.com/LUXW5X6b

これを考えると、ヒープにアクセスして変更を加えるためにポインタとmallocを使用するのが最善の方法だと思います。これを達成するにはどうすればいいですか?

uint8_t *half(const uint8_t array[], 
       unsigned int cols, 
       unsigned int rows) { 
    // your code here 
    int i, j; 
    uint8_t new_rows = rows/2; 
    uint8_t new_cols = cols/2; 
    uint8_t new_array[new_rows][new_cols]; 
    if (new_rows % 2 != 0) { 
     new_rows = new_rows - 1; 
    } 
    if (new_cols % 2 != 0) { 
     new_cols = new_cols - 1; 
    } 
    for (i = 0; i < new_rows; i++) { 
     for (j = 0; j < new_cols; j++) { 
      new_array[i][j] = average(array[2*i][2*j], 
             array[2*i+1][2*j], 
             array[2*i+1][2*j+1], 
             array[2*i][2*j+1]); 
     } 
    } 
    return NULL; 
} 
+1

array []は1dです。 – user3528438

答えて

1

引数配列を2次元配列として宣言する必要があります。 C99では、次の構文を使用して寸法を指定することができます

uint8_t *half(unsigned int cols, unsigned int rows, 
       const uint8_t array[][cols]) { 
} 

別の問題があります:このオブジェクトはすぐに機能が戻るなどとして無効になるので、あなたが自動ストレージでローカル配列へのポインタを返すことはできません。アレイは、その最初の要素へのポインタ(そのポインタに崩壊)として渡され

int half(unsigned int cols, unsigned int rows, 
     const uint8_t array[rows][cols], 
     uint8_t output[rows/2][cols/2]) 
{ 
    unsigned int new_rows = rows/2; 
    unsigned int new_cols = cols/2; 

    for (unsigned int i = 0; i < new_rows; i++) { 
     for (unsigned int j = 0; j < new_cols; j++) { 
      output[i][j] = average(array[2 * i ][2 * j ], 
            array[2 * i + 1][2 * j ], 
            array[2 * i + 1][2 * j + 1], 
            array[2 * i ][2 * j + 1]); 
     }  
    } 
    return 1; 
} 

メモ、最初に単純な解決策は、呼び出し元関数の宛先アレイを割り当て、機能halfに渡すことですトン場合は整数の除算が既に0に向かって丸めとしてnew_rowsnew_cols上の余分なテストが不要なように見えることも

int half(unsigned int cols, unsigned int rows, 
     const uint8_t array[][cols], 
     uint8_t output[][cols/2]) ... 

注:プロトタイプでの寸法は、単にコンパイラによって無視され、上記の定義は同等です元の配列のサイズが奇数の場合、縮小された配列は正しく計算され、最後の行および/または列は無視されます。

+0

私は、配列がmain()であらかじめ定義されていることを忘れてしまったことに感謝しました。これは私のメインのhttp://pastebin.com/LUXW5X6bです –