• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

cannot convert 'wchar_t*' to 'LPCSTR {aka const char*}

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,746 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Szymczak_7 Obywatel (1,860 p.)

Wie ktoś jak rozwiązać ten problem?

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

using namespace std;

int nScreenWidth = 120;
int nScreenHeight = 40;

float fPlayerX = 0.0f;
float fPlayerY = 0.0f;
float fPlayerA = 0.0f;

int nMapHeight = 16;
int nMapWidth  = 16;

int main()
{
    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++)
        {
            cout << "\0" << endl;
        }

        screen[nScreenWidth * nScreenHeight - 1] = '\0';
        WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth * nScreenHeight, { 0,0 }, &dwBytesWritten);
    }

    return 0;
}

cannot convert 'wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'BOOL WriteConsoleOutputCharacterA(HANDLE, LPCSTR, DWORD, COORD, PDWORD)

 

 

komentarz 30 marca 2020 przez tkz Nałogowiec (42,020 p.)
Będzie obcinane. wchar_t, to 4 bajty, a char, to 1 bajt. Czy na pewno tego chcesz?
komentarz 30 marca 2020 przez tangarr Mędrzec (155,140 p.)
Akurat na Windowsie wchar_t ma dwa bajty. Dlaczego? Chyba tylko Bill to wie.
komentarz 30 marca 2020 przez tkz Nałogowiec (42,020 p.)
Faktycznie, na docs'ach ms jest stworzony specjalny typ 32 bitowy, ciekawe...
1
komentarz 30 marca 2020 przez j23 Mędrzec (195,220 p.)

@tangarr,
  Dlaczego? Chyba tylko Bill to wie.

Dlatego, że Windows pierwotnie miał kodowanie UCS-2 (później rozwinięto to do UTF-16), które było dobrym konsensusem między wygodą używania kodowania ANSI a zaletami unikodu. Nie wiem, czy jest jakaś platforma, której głównym kodowaniem jest UTF-32.

1 odpowiedź

0 głosów
odpowiedź 30 marca 2020 przez tangarr Mędrzec (155,140 p.)
wybrane 30 marca 2020 przez Szymczak_7
 
Najlepsza

WindowsAPI dostarcza większość funkcji operujących na tekście w dwóch wariantach: ASCII (char) i Unicode16 (wchar_t).
Konfiguracja twojego kompilatora/projektu powoduje, że makra wywołują wersje ASCII.
Zamiast makra WriteConsoleOutputCharacter użyj bezpośrednio funkcji WriteConsoleOutputCharacterW

komentarz 30 marca 2020 przez Szymczak_7 Obywatel (1,860 p.)
Dzięki,działa.
komentarz 30 marca 2020 przez Szymczak_7 Obywatel (1,860 p.)
Da się jakoś zmienić zestaw znaków kompilatora na unicode, w codeblocks'ie?
komentarz 30 marca 2020 przez tangarr Mędrzec (155,140 p.)

Prawdopodobnie wystarczy zdefiniować UNICODE i _UNICODE na początku pliku main.cpp (przed jakimikolwiek includami)

#define UNICODE
#define _UNICODE
#include <iostream<
#include <Windows.h>

(nie testowałem)

Podobne pytania

0 głosów
2 odpowiedzi 1,241 wizyt
0 głosów
2 odpowiedzi 1,420 wizyt

93,116 zapytań

142,097 odpowiedzi

321,676 komentarzy

62,453 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...