3

いくつかの整数をキューに格納しようとしています。このキューは基本的に、整数 (またはすべての値) をバイト単位で格納する固定サイズの char 配列です。

class fixed_size_queue{
    char *buffer;
    unsigned int head;
    int tail;
    q_typeinfo   tinfo;
public:
    fixed_size_queue(q_typeinfo tinfo_):tinfo(tinfo_) { 
    buffer = new char[MAX_SIZE*tinfo.get_size()];
    head = 0;
    tail = -1;
    }
    char* pop() {
    char* value = buffer+head;
    head++;
    return value;
    }
    void push(char* value) {
    tail++;
    buffer[tail] = *value;
    cout<<"pushing value = "<<(int)*value<<endl; //line 22
    }
};

このキューに値をプッシュしようとするときは、次を使用します。

void push_q(void* value){
    q.push(value);
}

上記で、0 から 127 までの値をプッシュすると、正しくプッシュおよびポップされます。値 128 をプッシュすると、22 行目で「プッシュ値 -128」が出力されます。129 を押すと -127 が出力され、再び 127 に到達してラップアラウンドするまで続きます。

各整数のサイズは、キューの配列では 8 ですが (何らかの理由で切り上げています)、4 で試してみましたが、同じ奇妙なエラーが表示されます。

また、値をプッシュまたはポップするときに「値」をキャストしてchar *にコピーするためにreinterpret_castを使用しようとしましたが、同じことが起こります。誰かが何か間違っていると思いますか?ありがとうございました!

--更新: 最後に、問題は型ではありませんでした。任意の変数のバイトを格納したかっただけです。たとえば、整数は (4) 文字バイトに分割し、配列に格納する必要があります。必要だったのは、整数のデータを char 配列にコピーすることでした! 上記は、毎回 1 バイトしかコピーされないため、機能しませんでした。また、head と tail の増分は +=sizeof(int) にする必要があります。

4

2 に答える 2

0

unsigned charではなくを使用する必要charがあります。そうすれば、すべて問題ありません。

もちろん、実際に255を超える値を格納している場合、または負の値を格納したい場合は、上記で示した以上のことを行う必要があります。

于 2013-01-24T12:21:13.577 に答える
0

あなたが見ているのは、データを aacharデータ型で格納する効果です。これは通常、-127 から +127 までの値を保持できる符号付きの値です (-128 を期待しますが、それは明らかに C++ 仕様です。

この SO question size-of-int-long-etcを見て、アプリケーションに関する知識を使用して、使用するデータ型を決定してください。

于 2013-01-24T12:28:56.270 に答える