0

配列のサイズを変更しています。サイズ変更 (サイズを 2 倍にする) は正しく機能しているように見えますが、サイズ変更された配列にさらにテキストを送信すると、サイズ変更前の配列の制限に達すると、"Debug Assertion Failed! Expression: (L"バッファが小さすぎます" && 0)" エラー。私はそれをいくつかの異なる方法で試しましたが、常に同じ結果でした。

    static int ReadBufferSize, totalChars;    
    static char *ReadBuffer = NULL;
    ReadBuffer = (char *)malloc(ReadBufferSize);

    ...

    //Double buffer size.
    if((float)totalChars > (0.75f) * (float)ReadBufferSize)
    {
        char *tempBuffer = NULL;
        tempBuffer = (char *)malloc(2 * ReadBufferSize); 
        if(tempBuffer == NULL)
            free(tempBuffer);
        else
        {
            memcpy(tempBuffer,ReadBuffer,strlen(ReadBuffer)+1);
            free(ReadBuffer);
            ReadBuffer = tempBuffer;
            tempBuffer = NULL;
            ReadBufferSize *= 2;
        }
    }

私のテストでは、ReadBufferSize は最初は 85 文字に設定されています。配列のサイズを変更するコードが実行された後、ReadBuffer 内のテキストは引き続き画面に表示されます。さらに文字を入力すると、それらが配列に送信され、そこから画面に表示されます。しかし、文字数が 85 文字に達すると、「Debug Assertion Failed! Expression: (L"Buffer is too small" && 0)」というエラーが表示されますが、170 文字分のスペースがあるはずです。私も次のことを試しました。

//Double buffer size.
if((float)totalChars > (0.75f) * (float)ReadBufferSize)
{
    char* temp = 0;
    temp = new char[2 * ReadBufferSize];
    for(unsigned int i = 0; i < strlen(ReadBuffer); i++)
        temp[i] = ReadBuffer[i];
    temp[strlen(ReadBuffer)] = '\0';
    delete[] ReadBuffer;
    ReadBuffer = temp;
    temp = 0;
    ReadBufferSize *= 2;
}

私も試しました:

malloc(2 * ReadBufferSize * sizeof(char));

と:

strcpy_s(tempBuffer, strlen(ReadBuffer)+1, ReadBuffer);

どうもありがとう。

4

2 に答える 2

3

完全な最小限のプログラムを提供していないため、何が問題なのかを判断するのは困難です。通常、プログラムをデバッガーで起動し、関数内にブレークポイントを配置して、問題を再現する必要があります。strlen() のようなすべての変数と関数を見てください。予期しない値が返される場合があります。

トピック外ですが、実際のアプリケーションでは、メモリ管理に関するすべてのトリックを自動的に行う std::string を使用することをお勧めします。

于 2012-08-20T09:57:19.880 に答える
1

私はそれを考え出した。問題に気付いたときに、より多くの情報を提供するためにコードをさらに投稿しようとしていました。配列のサイズに使用していた「pageSize」変数がありました。次に、サイズを動的に変更したいとき、「ReadBufferSize」変数を作成して、配列サイズをページ サイズから分離しました。残念ながら、配列に文字を入れていたコードのセグメントにまだ「pageSize」がありました。

strcat_s(ReadBuffer, pageSize, keystroke);

私は今それをに変更しました

strcat_s(ReadBuffer, ReadBufferSize, keystroke);

すべてが機能しているようです。ご覧いただきありがとうございます。私は、問題は配列のサイズを変更するためのコードのセクションにあるに違いないという考えに固執しました。

于 2012-08-21T13:18:27.883 に答える