значение типа const char нельзя использовать для инициализации сущности типа lptstr

Ошибка: значение типа «const char*» нельзя присвоить сущности типа «char*»

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ошибка «значение типа «const char [81]» нельзя использовать для инициализации сущности типа «const unsigned char [61]»
Прошу помощи, так как раньше прога работала, сейчас решил вернуться и выдает ошибку: #pragma once.

Ошибка: значение типа «const char *» нельзя использовать для инициализации сущности типа «char *» (строка 8)
#include using namespace std; int main() < int number = 0; char *result; char.

Первый вариант корректный. Второй вариант будет работать только тогда, когда не будет записи по указателю «s». А если записей не будет, то лучше не мучаться и сразу написать как в первом варианте

Добавлено через 1 минуту
Почему запись по такому указателю вызовет проблемы, см. тут: https://www.cyberforum.ru/blogs/18334/blog97.html

Значение типа «const char» нельзя присвоить сущности типа «char*»
Добрый день. Разбираю классы и столкнулся вот с чем. В одной версии visual studio данный код.

Значение типа «const char *» нельзя использовать для инициализации сущности «char*»
Книга Пратта, Лекции и Упражнения. 750 страница, листинг 14.8. В объявлении производного класса.

Значение типа «char *» нельзя присвоить сущности типа «LPWSTR»
значение типа «char *» нельзя присвоить сущности типа «LPWSTR» void AddColToListView(char.

Значение типа «char *» нельзя присвоить сущности типа «LPWSTR»
как исправить эту ошибку значение типа «char *» нельзя присвоить сущности типа «LPWSTR»

Источник

Значение типа «const wchar_t *» нельзя присвоить сущности типа «LPWSTR»

Что нужно поменять в настройках проекта, чтобы исправить эту ошибку?

Проект уже настроен на набор символов Юникода.
В одном проекте это собирается, а в другом нет. При этом код полностью идентичный.

Значение типа «char *» нельзя присвоить сущности типа «LPWSTR»
как исправить эту ошибку значение типа «char *» нельзя присвоить сущности типа «LPWSTR»

Значение типа «char *» нельзя присвоить сущности типа «LPWSTR»
значение типа «char *» нельзя присвоить сущности типа «LPWSTR» void AddColToListView(char.

Peoples, попробовать то я могу, но зачем так извращаться, если проблема в каких-то неверных настройках проекта.

Добавлено через 3 минуты
Azazel-San, повторюсь, студия одна и таже VS 2017. Код один и тот же. Один файл main.cpp
Но, в одном проекте собирается удачно, в другом нет. И даже инфа на основных вкладках свойств проектов выглядит идентичной.
Если нужно могу скинуть проекты целиком.

Вообще, я хотел узнать подробное объяснение, потому что плохо шарю в указателях.
Т.е., как я понимаю, здесь

И если да, то почему вы советуете преобразование в (LPTSTR)_T(«WinSta0\\Default») в той теме. Разве строка от этого перестанет быть константной?

Вообщем, разобрался сам (хотя и хотелось бы получить ответы на вопросы выше).

В проекте, где возникала эта ошибка, стояла опция:

Убрал ее, и всё собралось.

Нет, не перестанет.
Снятие константности с указателя на константу не делает константу неконстантой. Так что строка останется константной, даже при наличии таких указателей на нее. Более того, если мы попробуем изменить через такой указатель константную строку, то выйдем на UB.

Добавлено через 3 минуты

Спасибо. Наконец-то пришло понимание.

Решение

Однако именно в данном случае, мне кажется, нет нужды ломать типизацию. Я бы сделал так:

Источник

E0513 значение типа «const wchar_t *» нельзя присвоить сущности типа «LPWSTR»

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Значение типа «const wchar_t*» нельзя (C2440)
Здравствуйте, давно не писал свой простенький графический движок (около полугода) и недавно снова.

Столкнулся с ошибкой «аргумент типа «const char *» несовместим с параметром типа «LPCWSTR»
Привет, столкнулся с ошибкой «аргумент типа «const char *» несовместим с параметром типа «LPCWSTR»».

тогда оно здесь ругается на имена. E0144 значение типа «const char [5]» нельзя использовать для инициализации сущности типа

Добавлено через 39 секунд
типа «wchar_t [12]»

Решение

Ошибка ‘аргумент типа «const char *» несовместим с параметром типа «LPCWSTR»‘
Здравствуйте, вот только начал изучать библиотеку WinApi и сразу же при первом примере в учебнике.

Как выловить в строке группу символов типа «<" или ">«?
Делаю небольшой инструмент в помощь при разработке ПО (пока для С++, затем подключу и другие).

Ошибка: аргумент типа «char *» не совместим с параметром «LPCWSTR»
Добрый день! Помогите, пожалуйста! Хочу воспользоваться этой функцией: TextOut (HDC hdc, int.

Ошибка: «cannot conver ‘char * to ‘const wchar_t*»
Доброго дня!Есть такая функция для ограничения запуска, в с++6 работает а в 10 ругается на cannot.

Невозможно преобразовать параметр из «const char [12]» в «LPCWSTR»
#include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR.

Источник

Что такое TCHAR, WCHAR, LPSTR, LPWSTR,LPCTSTR (итд)

Многие C++ программисты, пишущие под Windows часто путаются над этими странными идентификаторами как TCHAR, LPCTSTR. В этой статье я попытаюсь наилучшим способом расставить все точки над И. И рассеять туман сомнений.

Читайте также:  Как называется стол под телевизор

В свое время я потратил много времени копаясь в исходниках и не понимал что значат эти загадочные TCHAR, WCHAR, LPSTR, LPWSTR,LPCTSTR.
Недавно нашел очень грамотную статью и представляю ее качественный перевод.
Статья рекомендуется тем кто бессонными ночами копошиться в кодах С++.

В общем, символ строки может быть представлен в виде 1-го байта и 2-х байтов.
Обычно одно-байтовый символ это символ кодировки ANSI- в этой кодировке представлены все английские символы. А 2-х байтовый символ это кодировка UNICODE, в которой могут быть представлены все остальные языки в мире.

Компилятор Visual C++ поддерживает char и wchar_t как встроенные типы данных для кодировок ANSI и UNICODE.Хотя есть более конкретное определение Юникода, но для понимания, ОС Windows использует именно 2-х байтовую кодировку для много языковой поддержки приложений.

Для представления 2-х байтовой кодировки Юникод Microsoft Windows использует UTF16-кодирование.
Microsoft стала одна из первых компаний которая начала внедрять поддержку Юникода в своих операционных системах (семейство Windows NT).

Что делать если вы хотите чтобы ваш С/С++ код был независимым от кодировок и использование разных режимов кодирования?

СОВЕТ. Используйте общие типы данных и имена для представления символов и строк.

Например, вместо того чтобы менять следующий код:

В целях поддержки многоязычных приложений (например, Unicode), вы можете писать код в более общей манере.

В настройках проекта на вкладке GENERAL есть параметр CHARACTER SET который указывает в какой кодировке будет компилироваться программа:

Если указан параметр «Use Unicode Character set», тип TCHAR будет транслироваться в тип wchar_t. Если указан параметр «Use Multi-byte character set» то тогда TCHAR будет транслироваться в тип char. Вы можете свободно использовать типы char и wchar_t, и настройки проекта никоим образом не повлияют на использование этих ключевых слов.

TCHAR определен так:

Макрос _UNICODE будет включен если вы укажите «Use Unicode Character set» и тогда тип TCHAR будет определен как wchar_t. Когда же вы укажите «Use Multi-byte character set» TCHAR будет определен как char.

Помимо этого, для того что была поддержка нескольких наборов символов используя общий базовый код, и возможно поддержки много языковых приложений, используйте Специфические функции (то есть макросы).
Вместо того чтобы использовать strcpy, strlen, strcat (в том числе защищенные варианты функции с префиксом _s), или wcscpy, wcslen, wcscat (включая защищенные варианты), вам лучше использовать функции _tcscpy, _tcslen, _tcscat.

Как вы знаете функция strlen описана так:

И функция wcslen описана так:

Вам лучше использовать _tcslen, который логически описан так:

WC это Wide Character (Большой символ). Поэтому, wcs функции будут для wide-character-string (то есть для большой-символьной-строки).Таким образом _tcs будет означать _T символьная строка. И как вы знаете строки с префиксом _T могут быть типа char или wchar_t.

Но в реальности _tcslen (и другие функции с префиксом _tcs) вовсе не функции, это макросы. Они просто описаны как:

Вы можете просмотреть заголовочный файл TCHAR.H и поискать там еще Макро описания похожее на вышеупомянутое.

Таким образом TCHAR оказывается вовсе не типом, а надстройкой над типами char и wchar_t. Позволяя тем самым выбирать мульти язычное приложение у нас будет или же все таки, одно язычное.

_TPrintChar магическим образом может быть преобразована в функцию принимающая двух байтовый символ в качестве аргумента.

Для этого мы сделаем две различные функции:

И простой макрос скроет разницу между ними:

Клиент просто вызовет функцию как

Заметьте, что TCHAR и _TPrintChar теперь будут сопоставимы с UNICODE или ANSI, а переменная cChar и параметр функции будет сопоставим с типом данных char или wchar_t.

Макросы дают нам обойти эти сложности, и позволяют нам использовать ANSI или UNICODE функции для наших символов и строк. Множество функций Windows описаны именно таким образом, и для программиста есть только одна функция (то есть макрос) и это хорошо.

Приведу пример с SetWindowText:

Есть только несколько функций у которых нету таких макросов, и они только с суффиксом W или A. Пример тому функция ReadDirectoryChangesW, которая не имеет эквивалента в кодировки ANSI.

Как вы знаете, мы используем двойные кавычки для представления строк. Строка представленная в этой манере это ANSI-строка, на каждый символ используется 1 байт. Приведу пример:

Указанная верху строка не является строкой UNICODE, и не подходит для много языковой поддержки. Для того чтобы получить UNICODE строку вам надо использовать префикс L.
Приведу пример:

Поставьте спереди L и вы получите UNICODE строку. Все символы (Я повторяю все символы ) занимают 2 байта, включая Английские буквы, пробелы, цифры и символ null. Объем данных строки Unicode всегда будет кратен 2-м байтам. Строка Unicode длиной 7 символов будет занимать 14 байтов. Если строка Unicode занимает 15 байтов то это не правильная строка, и она не будет работать в любом контексте.

Читайте также:  чем подкормить кабачки летом

Также, строка будет кратна размеру sizeof(TCHAR) в байтах.

Когда Вам нужно жестко прописанный код, вы можете писать код так:

Строки без префикса это ANSI строки, с префиксом L строки Unicode, и строки с префиксом _T и TEXT зависимые от компиляции. И опять же _T и TEXT это снова макросы. Они определены так:

Символ ## это ключ(token) вставки оператора, который превратит _T(«Unicode») в L«Unicode», где строка это аргумент для макроса- если конечно _UNICODE определен.
Если _UNICODE не определен то _T(«Unicode») превратит это в «Unicode». Ключ вставки оператора существовал даже в языке С, и это не специфическая вещь связанная с кодировкой строк в VC++.

К сведению, макросы могут применятся не только для строк но и для символов. Например _T(‘R’) превратит это в L’R’ ну или в просто ‘R’. Тоесть либо в Unicode символ либо в ANSI символ.

Нет и еще раз нет, вы не можете использовать макрос чтобы конвертировать символ или строку в Unicode и не Unicode текст.
Следующий код будет неправильным:

Строки _T( c); _T(str); отлично скомпилируются в режиме ANSI, _T(x) превратится в x, и _T( c) вместе с _T(str) превратятся просто в c и str.
Но когда вы будете собирать проект в режиме Unicode код не с компилируется:

Я не хотел бы вызывать инсульт вашего интеллекта и объяснять почему это не работает.

Существует несколько функций для конвертирования Мульбайтовых строк в UNICODE, о которых я скоро расскажу.

Есть важное замечание, почти все функции которые принимает строку или символ, приоритетно в Windows API, имеют обобщенное название в MSDN и в других местах.
Функция SetWindowTextA/W будет классифицирована как:

Но как Вы знаете, SetWindowText это просто макрос, и в зависимости от настроек проекта будет рассматриваться как:

Так что не ломайте голову если не сможете получить адрес этой функции:

В библиотеке User32.DLL, имеются 2 функции SetWindowTextA и SetWindowTextW которые экспортируются, то есть тут нет имен с обобщенным названием.

Все функции которые имеют ANSI и UNICODE версию, вообще то имеют только UNICODE реализацию. Это значит, что когда Вы вызываете SetWindowTextA из своего кода, передавая параметр ANSI строку — она конвертирует ANSI в UNICODE вызывает SetWindowTextW.
Реальную работу (установку заголовка/названия/метки окна) делает только Unicode версия!

Возьмем другой пример, который будет получать текст окна, используя GetWindowText.
Вы вызываете GetWindowTextA передавая ему ANSI буфер как целевой буфер.
GetWindowTextA сначала вызовет GetWindowTextW, возможно выделяя память для Unicode строки (т.е массив wchar_t).
Затем он с конвертирует Unicode в ANSI строку для вас.

Поэтому очень рекомендуется вызывать напрямую Unicode функции.
В свою очередь, это означает, что вы всегда должны быть нацелены на сборку Unicode версии, а не на сборку ANSI версии, учитывая тот факт, что вы привыкли использовать ANSI строки в течение многих лет.

Да вы можете сохранять и получать ANSI строки, например для записи в файл, или отправки сообщения чата в ваше программе-чата. Функции конвертации существуют для таких нужд.

Замечание: Есть еще одно описание типа: имя ему WCHAR – оно эквивалентно wchar_t.

TCHAR это макрос, для декларирования одного символа. Вы также можете декларировать массив TCHAR. А что если Вы например захотите описать указатель на символы или, константный указатель на символы.
Приведу пример:

После чтения фишек с TCHAR, вы наверное предпочтете использовать именно его. Существуют еще хорошие альтернативы для представления строк в вашем коде. Для этого надо просто включить Windows.h в проект.
Примечание: Если ваш проект включает windows.h (косвенным или прямым образом), вы не должны включать в проект TCHAR.H.
Для начала пересмотрим старую функцию, чтобы было легче понять. Пример функцию strlen.

Которая может быть представлена по другому.

Где LPCSTR описан как:

LPCSTR понимается так.
• LP — Long Pointer (длинный указатель)
• C – Constant (константа)
• STR – String (строка)
По сути LPCSTR это (Длинный) указатель на строку.

Давайте изменим strcpy в соответствие с новым стилем имени типов:

szTarget имеет тип LPSTR, без использования типов языка С. LPSTR определен так:

Заметьте что szSource имеет тип LPCSTR, так как функция strcpy не модифицирует исходный буфер, поэтому выставлен атрибут const. Возвращаемый тип данных не константная строка: LPSTR.

Итак, функции с префиксом str для манипуляции с ANSI строками. Но нам нужна еще для двух байтовых Unicode строк. Для тех же больших символов имеются эквивалентные функции.
Для примера, чтобы посчитать длину символов больших символов(Unicode строки), вы будете использовать wcslen:

Читайте также:  какой можно сахарозаменитель для диабетиков

Прототип функции wcslen такой:

И код выше может быть представлен по другому:

Где LPCWSTR описан так:

LPCWSTR можно понять так:
LP — Long Pointer (Длинный указатель)
C — Constant (константа)
WSTR — Wide character String (строка больших символов)

Аналогичным образом, strcpy эквивалент wcscpy, для Unicode строк:

Который может быть представлен как:

Где szTarget это не константная большая строка (LPWSTR), а szSource константная большая строка.

Существует ряд эквивалентных wcs-функций для str-функций. str-функции будут использоваться для простых ANSI строк, а wcs-функции для Unicode строк.

Хотя Я уже советовал что надо использовать native Unicode функции, а не только ANSI или только синтезированные TCHAR функции. Причина проста — ваше приложение должно быть только Unicode-ным, и вы не должны заботится о том что спортируются ли они для ANSI. Но для полноты картины я и упомянул эти общие отображения (проецирования).

Чтобы вычислить длину строки, вы можете использовать _tcslen функцию (макро).
Который описан так:

Где имя типа LPCTSTR можно понять так
LP — Long Pointer (Длинный указатель)
C — Constant (Константа)
T = TCHAR
STR = String (Строка)

В зависимости от настроек проекта, LPCTSTR будет проецироваться в LPCSTR (ANSI) или в LPCWSTR (Unicode).

Заметьте: функции strlen, wcslen или _tcslen будут возвращать количество символов в строке, а не количество байтов.

Обобщенная операция копирования строки _tcscpy описана так:

Или в еще более обобщенной манере, как:

Вы можете догадаться что значит LPTSTR ))

Примеры использования.

Во первых приведу пример нерабочего кода:

На ANSI сборке, этот код успешно с компилируется потому что TCHAR будет типом char, и переменная name будет массивом char. Вызов strlen для name тоже будет прекрасно работать.

Итак. Давайте с компилируем тоже самое с включенными UNICODE/_UNICODE (в настройках проекта выберите «Use Unicode Character Set»).
Теперь компилятор будет выдавать такого рода ошибки:

И программисты начнут исправлять ошибку таким образом:

И это не усмирит компилятор, потому что конвертирование из TCHAR* в TCHAR[7] невозможно. Такая же ошибка будет возникать когда встроенные ANSI строки передаются Unicode функции:

К сожалению (или к счастью), эта ошибка может быть неправильно исправлена простым приведением типов языка C.

Строка «Saturn» это последовательность 7 байт:

‘S’ (83) ‘a’ (97) ‘t’ (116) ‘u’ (117) ‘r’ (114) ‘n’ (110) ‘\0’ (0)

Но когда вы передаете тот же набор байтов в wcslen, он рассматривает каждые 2 байта как один символ. Поэтому первые 2 байта [97,83] будут рассматриваться как один символ имеющий значение 24915(97

Теперь, Я надеюсь Вы понимаете следующий код:

Продолжая тему. Вы наверное видели некоторые функции/методы которым нужно передавать количество символов, или возвращающие количество символов. Впрочем есть GetCurrentDirectory, в которую надо передавать число символов, а не количество байт.
Пример:

С другой стороны, если вам нужно выделять память для нужного количества символов, вы должны выделять надлежащее количество байт. В C + +, вы можете просто использовать оператор new:

Но если вы используете функции выделения памяти, такие как malloc, LocalAlloc, GlobalAlloc, и т.д., вы должны указывать количество байт!

Как вы знаете необходимо приведение типа возвращаемого значения. Выражение в аргументе malloc гарантирует, что оно выделяет необходимое количество байт — и выделяет места для нужного количества символов.

Источник

Значение типа const char * нельзя присвоить сущности типа char *

Добрый день. Я новичок в c++ и столкнулся с проблемой при написании маленькой программы. Собственно у меня такая ошибка: значение типа «const char *» нельзя присвоить сущности типа «char *»

Я работаю с файлом для чтения данных из ini файла, он выглядит так:

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ошибка E0167 аргумент типа «unsigned char *» несовместим с параметром типа «const char *»
Всем привет, подскажите пожалуйста, в проекте MS Visual Studio 2017 напротив строчки.

n1lsik, у структуры People нет мембера с названием szCustomName, полагаю имеется ввиду name?

что есть Vasya? почему в одном случае вы его используете как int, а в другом как указатель на строку?

Из того что я вижу, вы сильно себе облегчите жизнь, если People::name объявите как std::string name.

Решение

Есть. Если обязательно нужно использовать char*, то:

(1) создать динамическую память под копию строки, которая будет храниться внутри структуры, так как ыы не можете сохранить использовать указатель на временный объект, который возвращается из ReadString(). Использовать для этого можно, например, strdup();
(2) удалять выделенную динамическую память, под name, когда она уже не нужна, например в People::

People();
(3) объявить конструктор для структуры;
(4) внимательно отнестись к операциям копирования данной структуры.

Источник

Портал про кино и шоу-биз