2014-03-07 98 views
1

所以我開始使用SDL和C開發遊戲,在第一個小時內只有2個函數,沒有太多的行,所以控制檯崩潰了。我得到了一個包含結構SDL_Rect(對於int x,y表面的座標)的二維數組結構。控制檯在for循環中崩潰

我做了一個函數,通過使用兩個for循環來初始化我的數組的所有座標。錯誤似乎在第一次循環的第二次迭代結束時發生,當代碼進入第三次循環時。我在測試循環的每個階段測試數組的值,並在每次分配之前和之後做出猜測。

這裏是我的功能:

void InitializeCoordinate(BrickStruct (*Grid)[10][12]) 
{ 
    int i=0,j=0; 
    for(i=0;i<10;i++) 
    { 
     for(j=0;j<12;j++) 
     { 
      Grid[i][j]->Coordinate.x = j*80; 
      Grid[i][j]->Coordinate.y = i*40; 
     } 
    } 
} 

這裏是我的結構:

typedef struct BrickStruct 
{ 
    int type; 
    SDL_Rect Coordinate; //Struct using 2 int x,y to define coordinates of a surface 
}BrickStruct; 

而在我的主,我創建了Grid結構,我通過我的Grid我的功能。這是SDL_Surface *ecran=NULL;SDL_Init(SDL_INIT_VIDEO)之間:這一切

BrickStruct Grid[10][12]; 
InitializeCoordinate(&Grid); 

。我和我的同事在這個問題上停留了幾個小時。控制檯代碼錯誤報告是-1073741510和-1073741819(0xc0000005)。 也許一個好的靈魂會引導我們走向好的道路? :)

在此先感謝

+1

'void InitializeCoordinate(BrickStruct Grid [10] [12])'''Grid [i] [j] .Coordinate.x = j * 80;''和InitializeCoordinate(Grid);'。數組參數總是按指針傳遞,而不是按值傳遞,所以不用擔心。 – pasztorpisti

回答

1

您正在傳遞指向2d數組的指針。

你要做的就是:

Grid[i][j]->Coordinate.x = ... 

等於這樣的:

*(Grid[i][j]).Coordinate.x = ... 

,但是這是錯誤的,你不想做的指針算法,但你的陣列。所以,你必須取消引用指針首先訪問數組:

(*Grid)[i][j].Coordinate.x = ... 

這種方式,您可以訪問陣列和然後做就可以操作。

+2

這是正確的,但作爲一個方面說明,這個函數完全不需要指針。只需直接傳遞數組。 – Chuck

+0

非常感謝。因爲我不喜歡使用指針的'*()'或'(*)'方式,所以我總是更喜歡使用' - >'(爲了方便,習慣和易讀性):還有沒有其他方法除了'(* Grid)[i] [j] .Coordinate.x = ...' 我想知道爲什麼指針在這裏不必要?因爲最後我想改變數組的值,所以我需要將我的數組的地址傳遞給我的函數?!或不 ? – paolovador

+0

@paolovador你不能改變數組,並且數組衰減到一個指針,所以你不必傳遞它的地址。 – this