2013-10-16 14 views
0

我已經嘗試了兩種方式的許多不同變體,並且無法獲得它來求和數組。它作爲指針傳入函數,需要計算平均值和返回值。C - 使用指針的數組的總和

unsigned char calcMean(unsigned char *buffer, int height, int width) 
{  
    unsigned char mean, sum=0; 
    counter i, k; 
    int size; 

    size = width*height; 

    mean = 0; 
    for (i = 0; i < size; i++) { 
     sum += buffer[i]; 
    } 

    /* 

    for(k=0;k<(width*height);k++) 
    { 
    mean = mean + *Buffer; 
    frameBuffer++; 
     printf("%d\n", mean); 
    }   
    */ 

    return sum; 

} 
+6

'sum'可能是出於'無符號char'類型的範圍。考慮聲明爲像int這樣的更大數據類型的變量。 – sgarizvi

+0

你會得到什麼輸出?在調試器下運行時,「buffer [i]」中有哪些值? – Steve

+0

緩衝區是如何填充的?當你運行這段代碼時會發生什麼?你爲什麼總結字符而不是整數?你有沒有試過調試器? – Salgar

回答

2

mean可以是一個字符,因爲你會被size分來計算的話。但是sum本身可以高達size * 255(unsigned char的8位)。 width * height也可能溢出。

爲了在安全側(32個或64位機),可以這樣考慮:

16位* 16位整數將需要32位整數(用於維)。 大小最大爲4294967295的無符號字符數組需要64位的總和。

因此,如果可能的話,使用顯式整數大小(C99):

uint8_t calcMean(uint8_t *buffer, uint16_t height, uint16_t width) 
{  
    uint64_t sum=0; 
    size_t i; 
    size_t size;//size_t is large enough to store a pointer, 
       //so it would have 32 or 64bits on corresponding platforms 
       //(see uintptr_t, etc.) 

    size = ((size_t)width)*((size_t)height); 

    for (i = 0; i < size; i++) { 
     sum += buffer[i]; 
    } 

    return sum/size; 
} 
+3

或者只是在任何地方使用'size_t'。 – 2013-10-16 10:36:28

+0

你說得對,我應該提到'size_t'。當以64位模式構建時,size_t會超出這些要求,但這並沒有太大區別。不過,爲了自我解釋代碼,仍然可以將'uint16_t'用於'width'和'height'。 – Sam

0

要爲buffer[]陣列緩衝區溢出守護自己,假設你有數組定義並與值進行初始化,沿傳遞數組的大小指針指向數組的第一個元素,而不是當前使用的方法calcMean()

電話calcMean()應爲:

uint8_t array_name[3]={1,2,3}; /* Array size and values assumed */ 
... 
calcMean(array_name, sizeof(array_name)) 

calcMean()定義應爲:

uint8_t calcMean(uint8_t *buffer, size_t buffer_size) 
{ 
    uint64_t sum=0; 
    size_t i; 

    for(i = 0; i < buffer_size; i++) 
    { 
     sum += buffer[i]; 
    } 
    ..../*Do whatever you want if at all needed */ 

    return (sum/size); 
}