私は共有メモリに2D配列(行列)を格納しようとしています。共有メモリinc内のベクトルで構造体を格納するC
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);
を
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;
}
}
}
主なプログラム:私はUbuntuのを使用していますし、C.
は、これは私のコードです:
構造体
typedef struct {
int data[COLUN_CAP];
} Colonna;
typedef struct {
int nc;
key_t colK;
Colonna colonne[10];
} Matrix;
行列を開始機能
geg tセグメンテーションフォルト(コアダンプ)エラー。私は可変量の列を持つ行列を格納しようとしていましたが、明らかに固定された列を格納することはできません。ヒント?
編集:
typedef struct {
int nc;
key_t colK;
Colonna colonne[];
} Matrix;
そしてもちろんを:私が試した列の可変量について ので、
int idshmM = shmget(shmKM, sizeof(Matrix) + sizeof(Colonna) * n, IPC_CREAT | 0664);
それはすべてのエラーを与えるものではありませんが、私私は各列の最初の2行を取得する行列を印刷します。
印刷機能のためのコードは以下の通りです:
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)私はとても馬鹿だと感じます。みんな助けてくれてありがとう!
コードに2D配列がありません。適切なセマンティクスを持つものとして使用することはできません。 – Olaf
この構造体を共有メモリにどのように格納できますか? – alteration
まず、エラーチェックコードを追加して、すべての関数の戻り値を検証することをお勧めします。それでもエラーが表示されない場合は、デバッガを使用してください。そして、それでも解決できない場合は、入力値を含めた[最小限の完全で検証可能な例](https://stackoverflow.com/help/mcve)を投稿してください。 – kaylum