报错:
106 107 C:\Users\Administrator\Documents\main.cpp [Error] cannot convert 'wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'WINBOOL WriteConsoleOutputCharacterA(HANDLE, LPCSTR, DWORD, COORD, LPDWORD)'
代码:
#include <iostream>
#include <Windows.h>
#include <cmath>
using namespace std;
int nScreenWidth = 120;
int nScreenHeight = 40;
float fPlayerX = 0.0f;
float fPlayerY = 0.0f;
float fPlayerA = 0.0f;
int nMapWidth = 16;
int nMapHeight = 16;
float fFOV = 3.14159 / 4.0;
float fDepth = 16.0;
int main()
{
// Create Screen Buffer
wchar_t *screen = new wchar_t[nScreenWidth * nScreenHeight];
HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
SetConsoleActiveScreenBuffer(hConsole);
DWORD dwBytesWritten = 0;
wstring map;
map += L"################";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"#..............#";
map += L"################";
while(1)
{
for(int x = 0; x < nScreenWidth; x++)
{
float fRayAngle = (fPlayerA - fFOV / 2.0f) + ((float)x / (float)nScreenWidth) * fFOV;
float fDistanceToWall = 0;
bool bHitWall = false;
float fEyeX = sinf(fRayAngle);
float fEyeY = cosf(fRayAngle);
while(!bHitWall && fDistanceToWall < fDepth)
{
fDistanceToWall += 0.1f;
int nTestX = (int)(fPlayerX + fEyeX + fDistanceToWall);
int nTestY = (int)(fPlayerY + fEyeY + fDistanceToWall);
if(nTestX < 0 || nTestX > nMapWidth || nTestY < 0 || nTestY >= nMapHeight)
{
bHitWall = true;
fDistanceToWall = fDepth;
}
else
{
if(map[nTestY * nMapWidth + nTestX] == '#')
{
bHitWall = true;
}
}
}
int nCeiling = (float)(nScreenHeight / 2.0) - nScreenHeight / ((float)fDistanceToWall);
int nFloor = nScreenHeight - nCeiling;
for(int y = 0; y < nScreenHeight; y++)
{
if(y < nCeiling)
{
screen[y * nScreenWidth + x] = ' ';
}
else if(y > nCeiling && y <= nFloor)
{
screen[y * nScreenWidth + x] = '#';
}
else
{
screen[y * nScreenWidth + x] = ' ';
}
}
}
screen[nScreenWidth * nScreenHeight - 1] = '\0';
WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth * nScreenHeight, {0, 0}, &dwBytesWritten);
}
return 0;
}
有没有人帮我解决一下呀qwq
类型错误
WriteConsoleOutputCharacter函数的第二个参数是 LPCSTR类型(即 const char类型),而你传递的是 wchar_t类型的字符串。
解决方案是将字符串转换为 char*` 类型,可以使用 WideCharToMultiByte函数进行转换:
// 将字符串转换为 char*
char* str = new char[nScreenWidth * nScreenHeight];
WideCharToMultiByte(CP_ACP, 0, screen, nScreenWidth * nScreenHeight, str, nScreenWidth * nScreenHeight, NULL, NULL);
// 调用 WriteConsoleOutputCharacter
WriteConsoleOutputCharacter(hConsole, str, nScreenWidth * nScreenHeight, {0, 0}, &dwBytesWritten);
delete[] str;
不知道你这个问题是否已经解决, 如果还没有解决的话:从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。
函数声明:
BOOL WINAPI WriteConsoleOutputCharacter(
_In_ HANDLE hConsoleOutput,
_In_ LPCTSTR lpCharacter,
_In_ DWORD nLength,
_In_ COORD dwWriteCoord,
_Out_ LPDWORD lpNumberOfCharsWritten
);
功能:
从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。
参数:
hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_WRITE访问权限。
lpCharacter 要写入控制台屏幕缓冲区的字符串。
nLength 要写入的字符数。
dwWriteCoord 起始位置
lpNumberOfCharsWritten 指向接收实际写入的字符数的变量的指针。
返回值:
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
参考程序:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
#define N 255
int main()
{
int i = 0;
int len = 0;
char *str = "a";
//定义句柄类型的变量
HANDLE hOut = NULL;
//窗口信息结构体
CONSOLE_SCREEN_BUFFER_INFO screenInfo;
//开始位置
COORD posShadow;
//获取标准输出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//获取窗口信息结构体
GetConsoleScreenBufferInfo(hOut, &screenInfo);
//开始位置
COORD pos = {0, 0};
//填充指定数字的字符
len = strlen(str);
WriteConsoleOutputCharacter(hOut, str, len, pos, NULL);
getchar();
//关闭句柄
CloseHandle(hOut);
system("pause");
return 0;
}
执行结果:
官方参考手册: https://docs.microsoft.com/en-us/windows/console/writeconsoleoutputcharacter
类型错误
WriteConsoleOutputCharacter函数的第二个参数是 LPCSTR类型(即 const char类型),而你传递的是 wchar_t类型的字符串。
解决方案是将字符串转换为 char*` 类型,可以使用 WideCharToMultiByte函数进行转换:
// 将字符串转换为 char*
char* str = new char[nScreenWidth * nScreenHeight];
WideCharToMultiByte(CP_ACP, 0, screen, nScreenWidth * nScreenHeight, str, nScreenWidth * nScreenHeight, NULL, NULL);
// 调用 WriteConsoleOutputCharacter
WriteConsoleOutputCharacter(hConsole, str, nScreenWidth * nScreenHeight, {0, 0}, &dwBytesWritten);
delete[] str;