2016-03-20 41 views
1

我試圖在共享存儲器中存儲二維數組(矩陣)。我使用的是Ubuntu和C.在共享存儲器inc中存儲一個帶有向量的結構C

這是我的代碼:

的結構

typedef struct { 
    int data[COLUN_CAP]; 
} Colonna; 

typedef struct { 
    int nc; 
    key_t colK; 
    Colonna colonne[10]; 
} Matrix; 

發起矩陣的功能:

void iniz_mat(Matrix *M, int n) { 
    M->nc = n; 
    int i, k; 
    for (i = 0; i < M->nc; i++) {  
     printf("Colonna: %d \n", i); 
     for (k = 0; k < COLUN_CAP; k++) { 
      M->colonne[i].data[k] = rand() % 10; 
     } 
    } 
} 

主程序

key_t shmKM; 
int n; 

shmKM = ftok(PATH_SHM, CHAR_SHMM); 
scanf("%d", &n); 
int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * 10, IPC_CREAT | 0664); 
Matrix *Mat; 
Mat = (Matrix *)shmat(idshmM, 0, 0); 
iniz_mat(Mat, n); 

我ge t分段錯誤(核心轉儲)錯誤。我正在尋找一個列數可變的矩陣,但顯然我不能存儲一個固定的矩陣。提示?


編輯: 所以,我試着列可變量:

typedef struct { 
    int nc; 
    key_t colK; 
    Colonna colonne[]; 
} Matrix; 

當然:

int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * n, IPC_CREAT | 0664); 

它不給任何錯誤,但是當我打印矩陣我只能得到每個柱子的前兩行。

打印功能的代碼如下:

void print_matrix(Matrix *M) { 
    int i, k; 
    for (k = 0; k < COLUN_CAP; k++) { 
     for (i = 0; i < M->nc; i++) 
      printf("%d ", M->colonne[k].data[i]); 
     printf("\n");  
    } 
} 

所以我得到的矩陣的可視化表示。 COLUN_CAP是每列的元素數量,設置爲5


哦,打印功能是錯誤的(倒i和k)我覺得很愚蠢。感謝大家的幫助!

+0

代碼中沒有2D數組。沒有什麼可以作爲一個合適的語義使用。 – Olaf

+0

我怎麼能將這個結構存儲在共享內存中? – alteration

+0

建議您首先添加錯誤檢查代碼以驗證所有函數的返回值。如果沒有顯示錯誤,則使用調試器。最後,如果您仍然無法解決問題,請發佈[最少完整且可驗證的示例](https://stackoverflow.com/help/mcve),其中包含輸入值。 – kaylum

回答

0

在您的示例代碼中,爲什麼要爲10個Colonna結構分配空間? Matrix最多可容納10個Colonna,處理超過10需要靈活的陣列。使用靈活的陣列,您可以爲適當數量的Colonna結構分配空間並以便攜式方式解決它們。使用此:

typedef struct { 
    int data[COLUN_CAP]; 
} Colonna; 

typedef struct { 
    int nc; 
    key_t colK; 
    Colonna colonne[]; 
} Matrix; 

int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * n, IPC_CREAT | 0664); 

Futhermore,你應該檢查在shmgetshmat系統調用錯誤。出錯時,shmat返回(void *)-1。使用strerror()輸出信息錯誤消息。

+0

編輯:它重新啓動虛擬機後實際工作。現在我想通過可變數量的colums。我編輯主帖子,以便我可以編寫我試過的代碼。 – alteration

+0

@alteration:*我只得到每列的前2行* ...'COLUN_CAP'的值是多少?同時發佈打印功能的代碼 – chqrlie

+0

我認爲分段故障錯誤是因爲我沒有在程序結束時釋放內存,所以在幾次運行後我不得不重新啓動。我首先得到的問題是我在主帖的編輯中描述的問題。 – alteration