2017-10-10 7 views
0

私は学校のプロジェクトで作業していますが、すべてが機能していますが、コンパイル時に "ポインタと整数の比較"という警告が表示されます。なぜこれが起こるのか誰も説明できますか?私は以下の4つの共用メモリ初期化について、同じ警告を得る。私は比較を行うためにさまざまな方法を試みました。私が読んだ限り、shmgetとshmatはエラーで-1を返します。警告が出ても、コードは完璧に機能します。私はエラーを促すために変更を加えました。これらの警告は、shmat行に促されます。下記の最小限のコード。共有メモリ - 警告:ポインタと整数の比較

//-------------------------------------------------- 
//Variables 
//-------------------------------------------------- 

//Shared memory variables 
int (*clockVar)[2]; 
int *turn; 
int (*shmMsg)[2]; 
enum state {idle, want_in, in_cs, done, dne} *flag; 
long *pidList; 

//Shared memory keys 
key_t clockKey; 
key_t turnKey; 
key_t msgKey; 
key_t flagKey; 
key_t pidKey; 

//Shared memory IDs 
int clockID = 0; 
int turnID = 0; 
int msgID = 0; 
int flagID = 0; 
int pidID = 0; 
//-------------------------------------------------- 
//Key Initialization 
//-------------------------------------------------- 

clockKey = ftok("ftok_clock", 13); 
if (clockKey == -1){ 
    perror("Clock: Failed to load ftok file"); 
    return 1; 
} 

msgKey = ftok("ftok_msg", 17); 
if (msgKey == -1){ 
    perror("Message: Failed to load ftok file"); 
    return 1; 
} 

flagKey = ftok("ftok_flag", 15); 
if (flagKey == -1){ 
    perror("Flag: Failed to load ftok file"); 
    return 1; 
} 

pidKey = ftok("ftok_pids", 17); 
if (pidKey == -1){ 
    perror("PID: Failed to load ftok file"); 
    return 1; 
} 

//-------------------------------------------------- 
//Shared Memory Initialization 
//-------------------------------------------------- 

//Initializing shared memory for clock counter 
clockID = shmget(clockKey, sizeof(int[2][1]), IPC_CREAT | 0666); 
if (clockID == -1){ 
    perror("Clock: Failed to designate shared memory"); 
    return 1; 
} 

clockVar = shmat(clockID, 0, 0); 
if (clockVar == (int*)-1){ 
    perror("Clock: Failed to attach shared memory"); 
    return 1; 
} 

//Initializing shared memory for the Message array 
msgID = shmget(msgKey, sizeof(int[2][1]), IPC_CREAT | 0666); 
if (msgID == -1){ 
    perror("Message: Failed to designate shared memory"); 
    return 1; 
} 

shmMsg = shmat(msgID, NULL, 0); 
if (shmMsg == (int*)-1){ 
    perror("Message: Failed to attach shared memory"); 
    return 1; 
} 

//Initializing shared memory for flag counter 
flagID = shmget(flagKey, sizeof(enum state[maxProc]), IPC_CREAT | 0666); 
if (flagID == -1){ 
    perror("Flag: Failed to designate shared memory"); 
    return 1; 
} 

flag = shmat(flagID, NULL, 0); 
if (flag == (enum state*)-1){ 
    perror("Flag: Failed to attach shared memory"); 
    return 1; 
} 

//Initializing shared memory for the process count array 
pidID = shmget(pidKey, sizeof(int), IPC_CREAT | 0666); 
if (pidID == -1){ 
    perror("PID: Failed to designate shared memory"); 
    return 1; 
} 

pidList = shmat(pidID, NULL, 0); 
if (pidList == (int*)-1){ 
    return 1; 
} 

編集:提案された編集。フラグの比較ではエラーは発生しません(enum state *)。今私は警告を得る:別のポインタ型の比較は、他の3つ(clockVar、shmMsg、およびpidList)のキャストが欠けている。私は宣言を上に追加しました。私はここでいくつかの構文をちょうど混乱させていると確信しています。ありがとう!

+0

'shmget'は' int'を返します。どのタイプがあなたの '* ID'変数ですか? – yano

+0

私は上記の変数を追加し、Felixによる提案された変更を(おそらく間違って)実装しました。メモを追加しました。 – Arcie

答えて

2

shmat()ポインタを返し、整数と比較しています。 shmat() manpageを参照してください:

成功時shmat()は、接続された共有メモリセグメントのアドレスを返します。

// [...] 
shmMsg = shmat(msgID, NULL, 0); 
if (shmMsg == (void*) -1){ 
    //[...] 

とあなた:エラー(void *) -1

は、このようなあなたのコード( void *shmMsg;、あなたがあなたの質問には表示されませんあなたの変数宣言は、この場合には、正しい種類を持っていると仮定)を変更し

返されますうまくいくはずです。

+0

私はこれを実装しようと上記のコードを編集し、それは列挙型ではなく、intポインタ配列では機能しました。私は間違って何をしていますか? – Arcie

関連する問題