簡體   English   中英

將帶有向量的結構存儲在共享內存inc C中

[英]Store a struct with vectors in shared memory inc C

我正在嘗試將2D數組(矩陣)存儲在共享內存中。 我正在使用ubuntu和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);

我收到分段錯誤(核心轉儲)錯誤。 我當時想要存儲一個列數可變的矩陣,但顯然我不能存儲一個固定的矩陣。 提示?


編輯:所以,對於我嘗試的可變數量的列:

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)我覺得很蠢。 感謝大家的幫助!

在您的示例代碼中,為什么要為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);

此外,您應該檢查shmgetshmat系統調用中的錯誤。 shmat返回(void *)-1出錯。 使用strerror()輸出信息錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM