![]() ![]() |
||||||
1 | ||||||
Значение типа "const wchar_t *" нельзя присвоить сущности типа "LPWSTR"30.11.2018, 16:03. Показов 7406. Ответов 14
Метки нет Все метки)
(
Здравствуйте!
Что нужно поменять в настройках проекта, чтобы исправить эту ошибку?
В одном проекте это собирается, а в другом нет. При этом код полностью идентичный. Спасибо.
0
|
|
30.11.2018, 16:03 | |
Ответы с готовыми решениями:
14
Значение типа "char *" нельзя присвоить сущности типа "LPWSTR" Значение типа "char *" нельзя присвоить сущности типа "LPWSTR" Error: значение типа "const char" нельзя присвоить сущности типа "double" Как исправить ошибку: Значение типа "const char *" нельзя присвоить сущности типа "char *"? |
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
30.11.2018, 16:14 | 2 |
Dragokas, Значение типа "char *" нельзя присвоить сущности типа "LPWSTR"
Смотрите последние посты, мб поможет
0
|
![]() ![]() |
|
30.11.2018, 18:07 [ТС] | 4 |
Peoples, попробовать то я могу, но зачем так извращаться, если проблема в каких-то неверных настройках проекта.
Добавлено через 3 минуты Azazel-San, повторюсь, студия одна и таже VS 2017. Код один и тот же. Один файл main.cpp Но, в одном проекте собирается удачно, в другом нет. И даже инфа на основных вкладках свойств проектов выглядит идентичной. Если нужно могу скинуть проекты целиком.
0
|
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
30.11.2018, 18:17 | 5 |
Dragokas, ну, могу предположить что не все настройки идентичны тогда, у вас ошибка, типо, вы пытаетесь объекту
LPWSTR присвоить LPCWSTR , вы хотели исправить ошибку в коде или в настройках проекта, если второе, то заголовок темы вы подобрали не тот ![]()
0
|
![]() ![]() |
|
30.11.2018, 18:45 [ТС] | 6 |
Вообще, я хотел узнать подробное объяснение, потому что плохо шарю в указателях.
Т.е., как я понимаю, здесь LPWSTR lpDesktop - (LP) указатель на (WSTR) юникодную строку. "WinSta0\\Default" - константная строка. _T - макрос, указывающий, что при настройках проекта на набор символов "Юникод", строка будет интерпретироваться как юникодная. Соответственно присвоение невозможно так как ожидается буфер с выделенной памятью с доступом Read/Write, а я подаю ReadOnly (т.е. константную). Правильно ли я понимаю? И если да, то почему вы советуете преобразование в (LPTSTR)_T("WinSta0\\Default") в той теме. Разве строка от этого перестанет быть константной? ======= Вообщем, разобрался сам (хотя и хотелось бы получить ответы на вопросы выше). В проекте, где возникала эта ошибка, стояла опция: Ещё стояла:
1
|
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
30.11.2018, 18:51 | 7 |
Соглашусь, возможно это и не лучший вариант
![]()
0
|
16469 / 8968 / 2199
Регистрация: 30.01.2014
Сообщений: 15,571
|
|
30.11.2018, 23:46 | 8 |
Нет, не перестанет.
Снятие константности с указателя на константу не делает константу неконстантой. Так что строка останется константной, даже при наличии таких указателей на нее. Более того, если мы попробуем изменить через такой указатель константную строку, то выйдем на UB. Добавлено через 3 минуты В Си-шных, особенно старых интерфейсах, такое довольно часто можно наблюдать. Функция, или в данном случае структура, получает указатель на неконстанту, но при этом гарантируется, что не будет меняться через него содержимое объекта. Соглашение на уровне договоренностей, и, может быть, описания в документации. Так что, если нам такие гарантии даны, то можно сделать явный каст.
1
|
16469 / 8968 / 2199
Регистрация: 30.01.2014
Сообщений: 15,571
|
||||||
01.12.2018, 01:03 | 10 | |||||
![]() Решение
Ну так это зависит от ситуации. В том числе и документацией или словами разработчика, или просмотром тобой исходников, чтобы убедиться в этом.
Собственно const - это автоматизированный контроль этих гарантий компилятором. Разработчик поставил const - значит возложил обязанность контроля на компилятор, не поставил - значит возложил эту обязанность на программиста. Естественно лучше, когда автоматизированный инструмент проверяет для тебя контракты, я думаю, с этим никто не будет спорить. Но реальность такова, что иногда приходится убеждать инструмент, что ты лучше знаешь, что делаешь ![]() Однако именно в данном случае, мне кажется, нет нужды ломать типизацию. Я бы сделал так:
1
|
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
01.12.2018, 01:17 | 12 |
Да, точно, все верно, это же указатели, спасибо за поправку.
Ну, я говорил что это не лучший вариант ![]() Еще вроде есть вариант с wcscpy (надеюсь правильно написал)?
0
|
16469 / 8968 / 2199
Регистрация: 30.01.2014
Сообщений: 15,571
|
|
01.12.2018, 01:27 | 13 |
Для начала знать бы по какой.
![]() Но если речь, например, о CreateProcess, то там нигде явно не указано, что lpDesktop будет изменяться. Также явно указано, что все значения из этой структуры копируются без изменений в создаваемый процесс. Также по смыслу и описанию этого поля нигде не предполагается, что оно предназначено для записи. Если же какое-то из параметров функции может быть изменено изнутри, то об этом явно написано, например, как написано про lpCommandLine. Т.е. можно сделать вывод, что некоторое обещание есть, но до гарантии не дотягивает. В общем, я предлагаю все-таки не ломать типизацию, тем более это решение здесь никак не повлияет негативно - зато код будет без подозрительных кастов (или опасных вседозволяющих флагов компилятора). Добавлено через 54 секунды Она тут не подойдет. Там же в структуре просто указатель, а не буфер.
1
|
![]() ![]() |
||||||
01.12.2018, 01:44 [ТС] | 14 | |||||
Ну я думаю, можно было бы сделать так:
static у вас, я так понимаю, чтобы после выполнения CreateProcess и копирования структуры в системную область, указатель продолжал указывать на валидную память даже после выхода из процедуры. Хотя как по мне такое актуально только для каких-нибудь асинхронных функций, где структура может не успеть скопироваться. В конкретном же случае, структура будет копироваться вместе с данным (не только указатель), т.к. нормальная работа порожденного процесса гарантируется и после завершения родительского.
0
|
16469 / 8968 / 2199
Регистрация: 30.01.2014
Сообщений: 15,571
|
|
01.12.2018, 02:05 | 15 |
Да, конечно.
static там не для этого, а просто чтобы постоянно не копировать строку в массив на стеке, в случае многократного вызова этой функции, где будет этот код. Если у вас свои пожелания на счет этого, то я разумеется ничего не навязываю.
1
|
01.12.2018, 02:05 | |
Помогаю со студенческими работами здесь
15
Ошибка: значение типа "const char*" нельзя присвоить сущности типа "char*" Ошибка "значение типа "const char [81]" нельзя использовать для инициализации сущности типа "const unsigned char [61]"
Динамические массивы: значение типа "int *" нельзя присвоить сущности типа "int"
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |