2016-03-20 22 views
1

私は共有メモリに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)私はとても馬鹿だと感じます。みんな助けてくれてありがとう!

+0

コードに2D配列がありません。適切なセマンティクスを持つものとして使用することはできません。 – Olaf

+0

この構造体を共有メモリにどのように格納できますか? – alteration

+0

まず、エラーチェックコードを追加して、すべての関数の戻り値を検証することをお勧めします。それでもエラーが表示されない場合は、デバッガを使用してください。そして、それでも解決できない場合は、入力値を含めた[最小限の完全で検証可能な例](https://stackoverflow.com/help/mcve)を投稿してください。 – kaylum

答えて

0

サンプルコードでは、なぜ10 Colonna構造体の部屋を割り当てますか? Matrixには最大10個のコロンナのためのスペースがあり、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

編集:実際にはVMを再起動した後に動作しました。今度は可変数の列を渡したいと思います。メインポストを編集して、私が試したコードを書くことができます。 – alteration

+0

@alteration:*各列の最初の2行だけを取得します* ... 'COLUN_CAP'の値は何ですか?また、印刷機能のコードを投稿してください – chqrlie

+0

私はプログラムの終わりにメモリを解放しなかったので、私が思ったセグメンテーションフォールトエラーは、いくつかの実行後に再起動しなければならなかったと思います。最初に私が得た問題は、私がメインポストの編集で説明した問題でした。 – alteration

関連する問題