2016-03-28 17 views
1

Bir 2D dizisinden dört hücrenin ortalamasını alan bir kod yazdım. Koşullar, sütunların ve satırların bir son değer olması gerektiğidir, eğer değilse son sütunu/satırı görmezden geliyoruz.Bir 2D dizi verildiğinde - Orijinal dizideki değerleri kullanarak yeni bir dizi oluşturmak istiyorum

Bunun bir başlık dosyasının parçası olduğunu belirtmeyi unuttum - 2D dizisi ana() içeren başka bir dosyada bir dizi [x] [y] olarak tanımlanır. pastebin.com/LUXW5X6b

Bunu göz önünde bulundurarak, en iyi yaklaşımın yığınlara erişmek ve değişiklik yapmak için işaretçi ve malloc kullanmak olduğuna inanıyorum. -> Bunu başarmak için nasıl giderim?

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 [] is 1d .. – user3528438

cevap

1

Bağımsız değişken dizisini bir 2B dizi olarak bildirmeniz gerekir. C99, bu sözdizimi kullanarak boyutlarını belirtebilirsiniz:

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

başka sorun var: Bu nesne yakında işlev dönünceye kadar geçersiz olur çünkü otomatik depolama yerel diziye gösterici döndüremez. dizileri ilk elemana işaretçileri (bunlar işaretçiler içine bozunma) olarak geçirilir

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; 
} 

Not birinci böylece: basit bir çözüm arayan fonksiyonunda hedef dizi tahsis ve fonksiyon half geçmek için tamsayı bölme zaten 0'a Eğer t doğru yuvarlar olarak new_rows ve new_cols üzerinde ekstra testler gereksiz görünüyor da

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

Not: prototip boyutları sadece derleyici tarafından göz ardı edilir, yukarıdaki tanım eşdeğerdir Orijinal dizinin tek boyutlu boyutları vardır, azaltılmış dizi doğru olarak hesaplanır ve son satırı ve/veya sütunu dikkate almaz.

+0

Dikkat edin, anladım ki, dizinin main() içinde önceden tanımlanmış olduğunu detaylandırmayı unuttum. Bu benim ana -http: //pastebin.com/LUXW5X6b –

İlgili konular