嘗試初始化時
charInfo[]
通過任何數量的迭代(或任何回圈)的 for 回圈,程式意外終止,沒有說明原因。
#include <stdlib.h>
#include <windows.h>
int main(){
//Create handle for screen buffer & pointer for accesing console cursor information
HANDLE handleNewScreenBuffer;
CONSOLE_CURSOR_INFO *ConsoleCursorInfo;
//Create rectangle & character info array to be drawn on screen
SMALL_RECT rectangle = {0, 0, 64, 7};
CHAR_INFO charInfo[520];
COORD coordBufSize = {65, 8};
COORD coordBufCoord = {0, 0};
handleStandardOut = GetStdHandle(STD_OUT_HANDLE);
handleNewScreenBuffer = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
GetConsoleCursorInfo(handleNewScreenBuffer, ConsoleCursorInfo);
ConsoleCursorInfo->bVisible = 0;
SetConsoleCursorInfo(handleNewScreenBuffer, ConsoleCursorInfo);
// Write green background and red & to character info array
for (int x = 0; x < (sizeof(charInfo)/4); x){
charInfo[x].Attributes = BACKGROUND_GREEN | FOREGROUND_RED;
charInfo[x].Char.AsciiChar = (char)'&';
}
WriteConsoleOutput(handleNewScreenBuffer, charInfo, coordBufSize, coordBufCoord, &rectangle);
SetConsoleActiveScreenBuffer(handleNewScreenBuffer);
Sleep(5000);
return 0;
}
注意:手動初始化值時,沒有問題,程式按預期運行。這里控制臺視窗的第一個和最后一個方塊被正確初始化。
charInfo[0].Attributes = BACKGROUND_GREEN | FOREGROUND_RED;
charInfo[0].Char.AsciiChar = (char)'&';
charInfo[519].Attributes = BACKGROUND_GREEN | FOREGROUND_RED;
charInfo[519].Char.AsciiChar = (char)'&';
注意:我也明白這是一種過時的做事方式,我只是在探索一下。
進入回圈時陣列是否離開范圍?這沒有任何意義,但我不確定這可能發生的任何其他原因。
更新:經過進一步檢查,似乎可以通過洗掉
handleStandardOut = GetStdHandle(STD_OUT_HANDLE);
解決問題的方法來簡化上面的代碼。
仍然提出一個問題,為什么建立輸出緩沖區的句柄(無論如何現在都不需要,但我離題了)會導致這種奇怪的行為。
uj5u.com熱心網友回復:
洗掉handleStandardOut = GetStdHandle(STD_OUT_HANDLE);
可以解決問題。正如@yano 所說,未初始化的*CONSOLE_CURSOR_INFO
指標正在導致不可預測性。通過創建CONSOLE_CURSOR_INFO
物件,然后創建指向所述物件的指標,因為可以重新添加CONSOLE_CURSOR_INFO *ConsoleCursorInfoPtr = &ConsoleCursorInfo;
行并且行為正常。handleStandardOut = GetStdHandle(STD_OUT_HANDLE);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489310.html