将带有向量的结构存储在共享内存inc C中

时间:2016-03-20 22:09:47

标签: c matrix shared-memory

我正在尝试将2D数组(矩阵)存储在共享内存中。我正在使用ubuntu和C.

这是我的代码:

结构

> # create a small sample set 
> raster <- matrix(sample(3, 25, TRUE), 5)
> raster
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    1    2    3    2
[2,]    2    1    2    1    3
[3,]    2    1    1    2    1
[4,]    1    3    2    3    2
[5,]    1    3    3    1    3
> # create a new value representing the column number (assuming 1-9)
> cols <- apply(raster, 1, function(.row){
+     mCols <- which(.row == max(.row))
+     sum(mCols * 10 ^ (rev(seq_along(mCols)) - 1))
+ })
> cbind(raster, cols)
               cols
[1,] 3 1 2 3 2   14
[2,] 2 1 2 1 3    5
[3,] 2 1 1 2 1   14
[4,] 1 3 2 3 2   24
[5,] 1 3 3 1 3  235

启动矩阵的函数:

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

哦打印功能错了(倒i和k)我觉得很蠢。感谢大家的帮助!

1 个答案:

答案 0 :(得分: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);

此外,您应该检查shmgetshmat系统调用中的错误。 shmat出错时会返回(void *)-1。使用strerror()输出信息性错误消息。