在编写c++代码时遇到关于WriteConsoleOutputCharacter函数的报错,求解决

报错:

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;

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: 【C语言】控制台窗口图形界面编程(四):文本输出中的 03. WriteConsoleOutputCharacter函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。

    函数声明:

    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;