2017-06-20 103 views
1

我想通過函數中的指針寫入顏色數組中的元素。該功能是:C:向Raspberry Pi上的數組指針寫入時出現分段錯誤

void setColor(int color1[3],int color2[3], int *red, int *green, int *blue) { 
int redInc = (color2[1]-color1[1])/range; 
int greenInc = (color2[2]-color1[2])/range; 
int blueInc = (color2[3]-color1[3])/range; 

int i = 0; 
while (i < range) { 
    *(red+i) = color1[1] + i*redInc; 
    printf("This is red: %s\n",*(red+i)); 
    *(green+i) = color1[2] + i*greenInc; 
    *(blue+i) = color1[3] + i*blueInc; 
    i++; 
} 
return;}  

範圍被定義爲21裏面的主循環的常數:

int color1[3] = {255,0,0}; 
int color2[3] = {0,255,0}; 

int red[21] = {0}; 
int green[21] = {0}; 
int blue[21] = {0}; 

setColor(color1,color2,red,green,blue); 

我已經盡我的Linux機器上的代碼,它似乎工作,但它在我的樹莓派上分割故障。這是我想如何訪問數組?

+3

'color1 [3]'超出範圍。 – mch

+2

幾乎所有的編程語言中,數組索引都從0開始,而不是1。 – Barmar

+1

投入一些時間學習使用宏而不是醜陋的數字時玩數組 – Zakir

回答

0

這是我如何訪問數組?

是的!數組索引從0開始並以大小-1結束,其中大小是數組的長度。


這裏:

*(blue+i) = color1[3] + i*blueInc; 

color1超出範圍,因爲它有3尺寸:

int color1[3] = {255,0,0}; 

,你訪問它過去color1[2],這將導致未定義行爲,並且很可能是您提到的分段錯誤。

2

C是零索引的,意思如果你有一個陣列3個整型長,具有索引0,1和2

例如訪問它:

int ex[3] = {1,2,3}; 
printf("%d %d %d", ex[0], ex[1], ex[2]); 

將輸出:

1 2 3 

所以,你需要做的是檢查你的代碼,並檢查你在哪裏索引數組不正確,這看起來像所有的功能void setColor(int color1[3],int color2[3], int *red, int *green, int *blue)

+0

好的。不能相信我錯過了錯過的錯誤。這已被糾正。但它在我的Linux機器上工作。它只是應該爲每個條增量使用不同顏色的狀態欄。但是當我在我的Raspberry Pi上編譯它時,它會發生故障。 – calvinjarrod

+0

@calvinjarrod正如其他答案中所提到的,索引超過數組的末尾是未定義的行爲。所以有時候它不會讓程序崩潰,但這並不意味着它按照你的意圖工作。這可能與你的變量'範圍'有關。我正在查看帖子,而您沒有提供它的定義。你說「......在主循環中」。如果'範圍'始終是相同的值,我建議'#define'它。您是否嘗試過使用調試器單步執行代碼? – jacoblaw

0

正如你intialized的arraycolor1[3],索引可以使用的01,並且2,所以你應該改變這種價值,因爲當您嘗試訪問在array位置3,它給出了一個分段錯誤,因爲它已經超出索引。 希望你明白!