2014-02-20 61 views
2

我正在通過實施康威的生命遊戲來嘗試我的手。雙指針如何用於矩陣(二維數組)?

我想動態地建立兩個網格(int矩陣),一個用於當前,另一個用於下一代,因此在確定下一代是什麼樣子之後,我只是交換指針。

起初,我試圖絕望地定義像int * grid這樣的網格指針,你不能用第二組括號括起來,如[][],因爲 - 顯然 - 第一組括號返回一個int。

我也嘗試過類似int * grid[HEIGHT][WIDTH],但這給出了將此類指針分配給另一個指針的問題。 (事實上​​,我不知道這在內存中確實會發生什麼!)

在我天真的希望之中,我認爲以下方法可以在絆倒雙引擎之後起作用。該程序編譯,但在指示的線上運行時失敗。 (在Windows中,除了問題事件名稱是APPCRASH之外,我沒有更多的細節。

免責聲明:這不是實際的程序,只是問題的概念證明。

#include <stdio.h> 
#include <stdlib.h> 

int HEIGHT = 20; 
int WIDTH = 20; 

int ** curr_gen; // Current generation 
int ** next_gen; // Next generation 

/* Entry Point main */ 
int main(int argc, char** argv) { 

    // Allocate memory for the grids 
    curr_gen = malloc(sizeof (int) * WIDTH * HEIGHT); 
    next_gen = malloc(sizeof (int) * WIDTH * HEIGHT); 

    curr_gen[0][0] = 0; //<< PROGRAM FAILS HERE 

    // Release heap resources 
    free(curr_gen); 
    free(next_gen); 

    return 0; 
} 
+0

http://c-faq.com/ aryptr/dynmuldimary.html –

+0

你不能有一個鏈接的答案。爲了處理你的情況,你需要了解內存中發生了什麼 – ThunderGr

回答

0

一種常見的方式來做到這一點http://c-faq.com/aryptr/dynmuldimary.html

+0

我喜歡這個解決方案, [0]我仍然遇到分段錯誤,但我會將其作爲單獨的問題發佈。 – mydoghasworms

+0

沒關係,我設法解決了這個問題,所以我會接受這個答案。非常感謝。 – mydoghasworms

+1

請注意,您應該發佈基本部分答案在這裏,在這個網站上,或者你的崗位風險被刪除[參見常見問題解答,它提到的答案几乎不過是一個鏈接。](http://stackoverflow.com/faq#deletion)如果你願意,還包括鏈接,但是作爲「參考」。答案應該獨立,不需要鏈接。 – Taryn

2

您可以簡單地分配空間並將指針轉換爲定義列和行大小的類型。通過[] []查找指針非常昂貴。並建立一個動態的多維數組,這種方式應該保留爲ragid數組.. IE:只在必要時使用它。

您可以定義類型:

typedef int MyArray[20][20]; 

再投malloc的指針到你想要的類型:你有一個常數,在編譯時高度知

MyArray * curr_gen = (MyArray *) malloc(...); 

但是這個假設和寬度。如果它必須是動態的,那麼通過一切手段使用索引到指針表方法。但請記住,查找的實際指針必須在導致管道延遲的最後一分鐘加載,以及可能的緩存未命中。讓它比通過[row * 20 + col]自己做數學貴得多100倍。

所以你應該問自己的真正問題是「它需要快速運行,還是我希望代碼看起來'整潔'?

+0

上面的typedef不能爲我編譯,說「error:expected identifier or'('before'['token'。 – mydoghasworms

+0

對不起,太多的C#。這取代了:typedef int MyArray [20] [20]; – Dan

+0

或指向上述數組的指針:typedef int(* MyArray)[20] [20]; – Dan

0

描述,您可以只使用int*作爲電網的用我的方式類型。

轉換的2D位置由宏到1D定義或一個函數:

#define MATRIX2INDEX(x, y, width) ((x) + (y) * (width)) // `width` is the max of x + 1 :) 
int Matrix2Index(int x, int y, int width) 
{ 
    return MATRIX2INDEX(x, y, width); 
} 

訪問由2D位置int*數據:

int* grid = (int*)malloc(sizeof(int) * WIDTH * HEIGHT); 
grid[MATRIX2INDEX(0, 0, WIDTH)] = 0; // here: get the data you want by 2D position 
free(grid); grid = NULL; 
+1

這是一個危險的宏..考慮當你爲Y值傳遞類似「row + rowOffset」的東西時會發生什麼。行偏移量乘以寬度。而你的破碎。每當你寫這樣一個宏時,你需要明確地強制操作順序:#define MATRIX2INDEX(x,y,width)((x)+(y)*(width)) – Dan

+0

你是對的。謝謝。我修改了它,並會對此更加謹慎。 –