2014-10-07 34 views
-1

我在另一個程序中使用此方法時出現分段錯誤。我已經證實我的指針是正確的,並且這個問題肯定在這個函數中。我假設我試圖訪問我實際上無法訪問的內存。我的問題的解決方案,將不勝感激將像素減半像素

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

int length = ((floor(cols/2)) * (floor(rows/2))); // change when we must ignore odd rows/cols 
uint8_t* newimg = malloc(length * sizeof(uint8_t)); 
memset(newimg, 0, length); 
int count = 0; 
for(unsigned int c = 0; c < cols; c+=2){  
    for(unsigned int r = 0; r < rows; r+=2){ 
     uint8_t first = array[(c - 1) + ((r - 1) * cols)]; 
     uint8_t second = array[c + ((r - 1) * cols)]; 
     uint8_t third = array[(c - 1) + (r * cols)]; 
     uint8_t fourth = array[c + (r * cols)]; 
     uint8_t mean = (first + second + third + fourth)/4; 
     newimg[count] = mean; 
     count++; 
      } 
} 

return newimg; 

} 
+0

你的調試器說什麼? – 2014-10-07 18:18:38

+0

它給予em沒有任何跡象表明有什麼錯誤,但是當編譯出現seg故障時,明顯是出現 – 2014-10-07 18:24:20

+2

您不需要使用「floor」。對於非負整數,「n/2」與「floor(0.5 * n)」相同。 – 2014-10-07 18:26:36

回答

0

我想通了。首先,我有一個seg故障,因爲我從第一個數組的錯誤部分開始,在第一次迭代期間,我會從索引中減去一個並超出數組邊界。其次,我以錯誤的順序繪製了新圖像,這是通過切換我的for循環標題的順序來彌補的,我正在繪製圖像而不是沿着它,並且我生成的圖像看起來像是一團糟。我的代碼現在可用,謝謝你的輸入eveyrone

0

我相信在這部分

 uint8_t first = array[(c - 1) + ((r - 1) * cols)]; 
    uint8_t second = array[c + ((r - 1) * cols)]; 
    uint8_t third = array[(c - 1) + (r * cols)]; 
    uint8_t fourth = array[c + (r * cols)]; 
    uint8_t mean = (first + second + third + fourth)/4; 

這裏計算的結果可能是引起更大的應該是,以檢查該打印結果使用計算printf並檢查它是否不超過數組大小

1

想在這個代碼時會發生什麼cr0

uint8_t first = array[(c - 1) + ((r - 1) * cols)]; 
uint8_t second = array[c + ((r - 1) * cols)]; 
uint8_t third = array[(c - 1) + (r * cols)]; 

0,0如果你正在試圖訪問數組的-1-cols-cols,並且-1元素這是最容易出界外。

+0

這個建議解決了我的seg錯誤,我改變了for循環開始的地方。這種方法的要點是拍攝圖像並將其縮小,當圖像被打印時,它是原始圖像的像素混亂,所以有一個問題得到解決,但這裏是另一個我會很感激的幫助。我的算法有些不妥 – 2014-10-07 18:28:19

+0

你到底想要做什麼?它看起來像是通過對像素進行平均來調整圖像大小50%。 (RGB,調色板索引等)中的像素是什麼顏色格式? – uesp 2014-10-07 18:34:28

+0

你是對的,我將圖像減半。我相信這是RGB – 2014-10-07 18:43:25