0

ポインタのみを受け入れる共有メモリにデータを渡す必要があります。したがって、セマフォをこの構造に含める必要がありますが、そうである場合は値を追加できません。どうすれば修正できますか?したがって、これは構造です:

typedef struct querem_usar {
 int conta_homem;
 int conta_mulher;
 int conta_crianca;

 struct sembuf lock[4];
 struct sembuf unlock[4];

} queremUsar;

そして、これは私がそれを宣言しなければならない方法です:

queremUsar *banheiro;

しかし、次のように、ロックまたはロック解除する値を設定しようとすると:

banheiro->lock[0].sem_num   = 0; 
banheiro->lock[0].sem_op   = -1;
banheiro->lock[0].sem_flg   = 0;
banheiro->unlock[0].sem_num = 0; 
banheiro->unlock[0].sem_op = 1; 
banheiro->unlock[0].sem_flg = 0;

セグメンテーション違反が発生します。私はすでに次のようにmallocを使用しようとしました:

banheiro->lock = (struct sembuf*)malloc(sizeof(struct sembuf));
banheiro->unlock = (struct sembuf*)malloc(sizeof(struct sembuf));

しかし、それは私にエラーを与えました:

error: incompatible types when assigning to type ‘struct sembuf[4]’ from type 
‘struct sembuf *’

直してください。コード全体は次のとおりです: https://gist.github.com/4553796 71行目はコメントしないでください。コードをテストするためにこれを行いました。試してみてください。大学向けなのでまったく複雑ではありません。共有メモリ(shm、スレッドを使用できません)とsemop()をセマフォとして使用する男女共用バスルームの問題である必要があります。

4

2 に答える 2

0

この構造定義を使用

typedef struct querem_usar {
 int conta_homem;
 int conta_mulher;
 int conta_crianca;

 struct sembuf *lock[4];
 struct sembuf *unlock[4];

 } queremUsar;

これはうまくいきます

于 2013-01-17T05:12:40.943 に答える
0

まず、バンヘイロにメモリを割り当てる必要があります。

25 行目で、ポインター「queremUsar *banheiro;」を宣言しています。これは、メモリ内のランダムな領域を指します。したがって、必要なメモリを割り当てる前にアクセスすると、運が良ければ SEGFAULT が発生します。

また、banheiro->lock および banheiro->unlock にメモリを割り当てる必要はありません。メモリへのポインタではなく、'struct sembuf' の配列として定義するためです。

于 2013-01-17T05:22:49.237 に答える