好的,这是一个新手问题,我明白我为这个函数提供的函数参数可能非常糟糕,但这就是我想要做的:
我有一个80x25的CHAR_INFO(缓冲区)二维数组,每次迭代无限循环都会打印到控制台屏幕。因为缓冲区会不断变化(它像游戏那样的nethack),我想在每个循环中更改数组。
我可以很容易地将循环集成到main函数中,但是为了学习和组织,我想把它拆分成它自己的函数WriteBuffer();我一直在寻找如何通过引用将2D CHAR_INFO数组传递到函数中,以便我可以编辑它,但似乎没有任何工作。请不要告诉我使用矢量或任何东西,我想和我在这里工作。
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#define SCREEN_WIDTH 80
#define SCREEN_HEIGHT 25
using namespace std;
void WriteBuffer(CHAR_INFO **bufferp[][SCREEN_WIDTH]);
int main()
{
//Initialize screen buffer and cursor
HANDLE hConsoleOutput( GetStdHandle(STD_OUTPUT_HANDLE) );
COORD dwBufferSize = { SCREEN_WIDTH,SCREEN_HEIGHT };
COORD dwBufferCoord = { 0, 0 };
SMALL_RECT rcRegion = { 0, 0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1 };
CHAR_INFO buffer[SCREEN_HEIGHT][SCREEN_WIDTH];
CONSOLE_CURSOR_INFO lpConsoleCursorInfo = { 1, false };
SetConsoleCursorInfo(hConsoleOutput, &lpConsoleCursorInfo);
//characters
char characters[3];
characters[0] = static_cast<char>(177);
characters[1] = static_cast<char>(177);
characters[2] = static_cast<char>(177);
characters[3] = static_cast<char>(177);
//colors
ULONG colors[3];
colors[0] = 0x0A;
colors[1] = 0x0B;
colors[2] = 0x0C;
colors[3] = 0x0D;
//begin infinite loop
while (1)
{
ReadConsoleOutput( hConsoleOutput, (CHAR_INFO *)buffer, dwBufferSize,dwBufferCoord, &rcRegion );
WriteConsoleOutput( hConsoleOutput, (CHAR_INFO *)buffer, dwBufferSize,dwBufferCoord, &rcRegion );
Sleep(100);
}
}
void WriteBuffer(CHAR_INFO **bufferp[][SCREEN_WIDTH])
{
int x, y, i = 0;
while(y < SCREEN_HEIGHT)
{
while(x < SCREEN_WIDTH)
{
bufferp[y][x].Char.AsciiChar = characters[i];
bufferp[y][x].Attributes = colors[i];
x++;
}
x = 0;
y++;
}
}
答案 0 :(得分:4)
您可以使用以下任何等效声明:
void WriteBuffer(CHAR_INFO bufferp[SCREEN_HEIGHT][SCREEN_WIDTH]);
void WriteBuffer(CHAR_INFO bufferp[][SCREEN_WIDTH]);
void WriteBuffer(CHAR_INFO (*bufferp)[SCREEN_WIDTH]);
允许使用第二个,因为您可以省略多维数组*的第一个数组维度。第三个是通过指针衰减允许的 - 参数列表中的数组“衰减”到指针并且是等效的。请注意,这只发生一次。您无法使用以下声明:
void WriteBuffer(CHAR_INFO **bufferp);
那是因为CHAR_INFO *bufferp[SCREEN_WIDTH]
衰变为CHAR **bufferp
,但正如您在上面所见,我们有CHAR_INFO (*bufferp)[SCREEN_WIDTH]
这是一个略有不同的野兽。
*您可以省略第一个维度的原因是因为编译器不需要它来计算数组的偏移量。如果您有array[W][H]
和访问元素array[x][y]
,编译器会将其转换为*(&array[0][0] + y*H + x)
。请注意该计算中不需要W
。因此可以在函数的参数列表中省略它。
答案 1 :(得分:1)
在C ++和C中,数组实际上是指针,因此您可以传递指针的值。换句话说,我认为你不应该尝试通过引用传递,而只是通过值传递。此外,变量名后面的“[]”表示它是一个指针---因此,在WriteBuffer的声明中,你基本上写了CHARINFO ****!
(注意(由于我没有足够的回复来评论。:/)一般情况下,如果您尝试调用WriteBuffer,并且发生任何错误,也可能会有帮助。)