• 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*}

VPS Starter Arubacloud
0 głosów
1,450 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,000 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 (154,780 p.)
Akurat na Windowsie wchar_t ma dwa bajty. Dlaczego? Chyba tylko Bill to wie.
komentarz 30 marca 2020 przez tkz Nałogowiec (42,000 p.)
Faktycznie, na docs'ach ms jest stworzony specjalny typ 32 bitowy, ciekawe...
1
komentarz 30 marca 2020 przez j23 Mędrzec (194,920 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 (154,780 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 (154,780 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,100 wizyt
0 głosów
2 odpowiedzi 1,189 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...