0

問題を次のコードに切り分けました。

#include <windows.h>
using namespace std;

const wchar_t* readLine(int posX, int posY, int len) {
  wchar_t* wcharFromConsole = new wchar_t[len];
  COORD pos = {posX,posY};
  DWORD dwChars;
  ReadConsoleOutputCharacterW(GetStdHandle(STD_OUTPUT_HANDLE),
    wcharFromConsole,  // Buffer where store symbols
    len,     // Read len chars
    pos,    // Read from row=8, column=6
    &dwChars);  // How many symbols stored
  wcharFromConsole [dwChars] = L'\0'; // Terminate, so string functions can be used
  return wcharFromConsole;
}

int main() {
  for (int i = 0; i <= 63; i++) {
    readLine(0,0,80);
  }
  system("pause");
}

問題は、ループが 63 回未満実行されている場合に機能し、コンソールからロードされた文字の長さが 80 未満の場合にも機能することです...ここで何が起こっているのかわかりません。明示的に閉じる必要があるリソースはありますか...しかし、関数が閉じると、そのすべてのリソースも閉じる必要があるのはなぜですか。しかし、ここで何が起こっているのかわかりません。コンパイルされたプログラムは (エラーなしで) 黙ってsystem()機能する前に終了します。プロジェクトからコードの一部を削除したため、他のエラー コードがありました。プログラムが異常な方法で終了を要求したこともあれば、プログラムがハングしてキーボード入力の受け入れを停止したこともありました。

- 編集:

提案に従ってコードを更新しました:

#include <iostream>
#include <windows.h>

using namespace std;

const wchar_t* readLine(int posX, int posY, int len) {
  wchar_t* wcharFromConsole = new wchar_t[len];
  COORD pos = {posX,posY};
  DWORD dwChars = 0;
  if(!ReadConsoleOutputCharacterW(GetStdHandle(STD_OUTPUT_HANDLE),
    wcharFromConsole,  // Buffer where store symbols
    len,     // Read len chars
    pos,    // Read from row=8, column=6
    &dwChars))  // How many symbols stored
  {
    cout << "ReadConsoleOutputCharacterW failed, code" << GetLastError() << endl;
  }
  wcharFromConsole [dwChars] = L'\0'; // Terminate, so string functions can be used
  return wcharFromConsole;
}

int main() {
  for (int i = 0; i <= 100; i++) {
    cout << "loop count: " << i << endl;
    readLine(0,0,80);
  }
  system("pause");
}

出力:

loop count: 0
loop count: 1
loop count: 2
loop count: 3
// [...]
loop count: 63
loop count: 64

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

(最初に切り取ったものでは、エラーはまったく発生しませんでした。)

4

2 に答える 2

1

それはおそらく「1つずつオフ」です。「Len」文字にスペースを割り当て、「Len」文字を読んでいますが、最後に \0 を追加しています。

new を変更して Len+1 を割り当てると、おそらく問題ありません。

于 2012-07-21T19:32:12.353 に答える
1

dwCharsReadConsoleOutputCharacterWとして渡す必要がありますdwChars -1。配列の末尾を上書きしています。

于 2012-07-21T19:33:15.753 に答える