аргумент типа "const wchar t*" не совместим с параметром типа "WCHAR *" (aka "wchar_t *")
При написании кода выскакивает такая ошибка:
аргумент типа "const wchar t*" не совместим с параметром типа "WCHAR *" (aka "wchar_t *")
Код:
m_compileshaderfromfile(L"shader.fx", "VS", "vs_4_0", &pVSBlob);
Использую Microsoft Visual Studio 2022, кодировка стоит Unicode. Пробовал вот так:
Код:
const char* filenamestr = "shader.fx";
WCHAR filename[256];
MultiByteToWideChar(CP_UTF8, 0, filenamestr, -1, filename, sizeof(filename) / sizeof(WCHAR));
m_compileshaderfromfile(filename, "VS", "vs_4_0", &pVSBlob);
но тогда не компилируется shader.fx. Возможно не находит файл. В общем, возвращает 0. shader.fx лежит в папке с исполняемым файлом. Конфигурация Release. Объявление функции:
HRESULT m_compileshaderfromfile(WCHAR* FileName, LPCSTR EntryPoint, LPCSTR ShaderModel, ID3DBlob** ppBlobOut);
Скрин:
Ответы (1 шт):
Как видите сами, функция описана как
HRESULT m_compileshaderfromfile(WCHAR* FileName, LPCSTR EntryPoint, LPCSTR ShaderModel, ID3DBlob** ppBlobOut);
Т.е. первый параметр — строка, содержимое которой может меняться (WCHAR* FileName
), в то время как вы передаете строковый литерал, который изменяться не может.
Решение — создать такую изменяемую строку и передать, что вы и начали делать, но не довели до конца. Вот так будет логичнее:
WCHAR filename[256] = L"shader.fx";
или использовать wcscpy
для копирования.
С другой стороны, есть у меня подозрение, что эта строка реально никак не изменяется в функции (зачем бы менять переданное имя файла?!), что это просто недосмотр при проектировании... так что можно было бы использовать const_cast
для приведения (именно для таких случаев const_cast
и создавался). Но для этого нужна гарантия именно такого поведения функции. Если вы ее дать не в состоянии — лучше не используйте метод с приведением...
P.S. Как выяснилось из следующего вопроса, это ВАША функция. Тогда не морочьте голову, никаких кастов и переменных — просто объявляйте первый параметр как const WCHAR*
!