2012-03-21 11 views
0

私はセマフォを作成するプログラムを持っています。私はSETALLを使用しようとする。しかし、私は範囲外数値の範囲外

数値結果として間違っている何

if((temp_semid = semget(IPC_PRIVATE, 250, 0666 | IPC_CREAT)) != -1) 
{  
    semun arg; 
    ushort array[100]; 
    memset(array,0, 100); 
    arg.array = array; 
    if(semctl(temp_semid, 0, SETALL, arg) == -1){ 
    std::cout << " failed to setall semaphore" << std::endl; 
    std::cout << strerror(errno) << std::endl; 
    break; 
    }  
} 

をerrnoにエラーが出ますか?

+6

'std :: cout'がinteferesを' errno'で使うのは不安ですが、 'semtctl'を呼び出した直後に' errno'の値を保存して正しい 'errno'値。また、 'memset()'はあまり正しくありません: 'memset(array、0、100 * sizeof(ushort));または' ushort配列[100] = {0}; '。 – hmjd

答えて

0

これは機能しました。

if((temp_semid = semget(IPC_PRIVATE, 250, 0666 | IPC_CREAT)) != -1) 
{  
    semun arg; 
    ushort array[100] = { 0 }; 
    arg.array = array; 
    if(semctl(temp_semid, 0, SETALL, arg) == -1){ 
    std::cout << " failed to setall semaphore" << std::endl; 
    std::cout << strerror(errno) << std::endl; 
    break; 
    }  
} 

私は間違った方法でのmemsetを使用していました。それを指摘するhmjdに感謝します。

+0

実際には、0も必要ありません。あなたが書いているのは、配列 'array'を最初の要素ushort(int(0))と他のすべての要素をゼロで初期化して初期化します。次のように書くことができます: 'ushort array [100] = {};'。完全性のために、「ushort array [100] = {1、2、3}; '最初の3つの要素に1と2と3を割り当て、他のすべての要素には0を割り当てます。 – Jan