2

substr() コマンドに問題があります。メモリ管理シミュレーターの例で、1 つのアドレスから 2 つの異なるアドレスを分割しようとしています。以下の例では: LoadParameters 関数は、ビット文字列を分割する場所を計算するために使用される VirtualMemSize と PageFrameLength の値のセットを取得します。

この例では、LoadParameters() はグローバル値である VirtualMemSize と PageFrameLength (それぞれ 20 と 8) の値を格納します。問題は、パラメーターの代わりに数値を入力した場合にのみコードが機能することです。変数を size_t 型にキャストしようとしましたが、うまくいきませんでした:

int main(void) {
    unsigned int VirtPageAddress;                                       
    unsigned int PhysPageAddress;                                       
    unsigned int OffsetAddress;                                         

    LoadParameters();                                           
    int VirtualAddress = 0xCAFEF00D;
    string pagestring;

    // Convert the hex address into a binary string and then
    // split it into page index and offset.

    string bitstring = bitset<sizeof(VirtualAddress) * 8>
                        (VirtualAddress).to_string();       

    cout << dec << VirtualMemSize << endl;
    cout << dec << PageFrameLength << endl;
    cout << bitstring << endl;

    // (Reports: 20, 8 and "11001010111111101111000000001101"

    // Extract relevant bits for the Page Index.

    pagestring = bitstring.substr((32-VirtualMemSize),PageFrameLength);

    // Convert the split string back into a number so that it
    // can be manipulated.

    VirtPageAddress = bitset<sizeof(pagestring)>
                        (pagestring).to_ulong();                          
    cout << "0x" << hex << VirtPageAddress << endl;
    return 0;
}

期待値:「0xef」

出力値:「0x0」

4

1 に答える 1

1

g ++でコンパイルすると、コードは期待どおりに機能します(いくつかのインクルードと定義を追加した後、省略しました)。どのコンパイラを使用していますか?

sizeof(pagestring)は、クラスに含まれる文字列ではなく、クラスのサイズを返すことに注意してください。それがあなたの意図したことではないかと思います。コンパイラ/STLの実装によって間違いなく変わるでしょう。そのテンプレートのインスタンス化で本当に何を意味しますか?

于 2012-04-29T16:09:11.730 に答える