Почему не может преобразовать TCHAR* для обугливания*

ошибка C2664: 'strcpy': не может преобразовать параметр 1 из 'TCHAR *' для 'обугливания *' код:

LPCTSTR name, DWORD value
strcpy (&this->valueName[0], name);

ошибка C2664: 'strlen': не может преобразовать параметр 1 от 'LPCTSTR' до 'символа константы *'

LPCTSTR name; 
strlen (name)     

Код выше к классу, который хорошо работает в другом проекте, я не могу найти причину, почему это не работает в этом Проекте VS2010 MS.

8
задан Dylan Corriveau 11 May 2015 в 14:20
поделиться

3 ответа

Вам необходимо использовать такую ​​функцию, как wcstombs , когда определен _UNICODE. Либо так, либо просто используйте _tcslen (см. Generic-Text Routine Mappings ) в строке TCHAR, и компилятор передаст ее либо в strlen, либо в wcslen, в зависимости от того, используете ли вы Unicode или нет. .

13
ответ дан 5 December 2019 в 05:56
поделиться

Заполняемость может немного ввести в заблуждение, и 100% заполняемость не должна быть вашей основной целью. Если вы можете получить полностью объединенный доступ к глобальной памяти, то на высоком GPU 50% заполняемости будет достаточно, чтобы скрыть задержку к глобальной памяти (для плавающих, даже ниже для двойных). Ознакомьтесь с презентацией Advanced CUDA C от GTC в прошлом году для получения дополнительной информации по этой теме.

В вашем случае вы должны измерить производительность как с, так и без установки maxrregcount 16. Задержка локальной памяти должна быть скрыта в результате наличия достаточного количества потоков, при условии, что вы не имеете произвольного доступа к локальным массивам (что приведет к некоалесцированному доступу).

Чтобы ответить на конкретный вопрос о сокращении регистров, выложите код для более подробных ответов! Понимание работы компиляторов в целом может помочь, но помните, что nvcc является оптимизирующим компилятором с большим пространством параметров, поэтому минимизация числа регистров должна быть сбалансирована с общей производительностью.

-121--2943665-

Вероятно, потому, что TCHAR определен как символ в одном из ваших проектов, но не в VS2010, где он, вероятно, wchar_t.

Если проект определяет UNICODE/_UNICODE, что совпадает с определением в параметрах настройки проекта построения в Юникоде, TCHAR будут wchar_t.

Вам, в основном, нужно решить, использовать Юникод или нет, и если да, вам нужно изменить регулярные вызовы strncpy и др. на широкоугольные эквиваленты или использовать t-варианты, которые изменяются так же, как и TCHAR. Просмотрите справку по strncpy или другим функциям, чтобы увидеть, как называются широкие или t-варианты.

Можно также просмотреть MSDN для таких вызовов, как strcpy , где можно увидеть, что широкострочная версия называется wcscpy, а t - _tcscpy. Я бы рекомендовал вам придерживаться t-версий, если вы собираетесь использовать код в различных проектах, которые либо используют Юникод, либо нет, или принять осознанное решение, какой из них вы собираетесь использовать, а затем придерживаться этого. Что лучше зависит от вашего сценария, я бы сказал, и может ссылаться на некоторые «религиозные» мнения...

-121--3456799-

Является ли ваш проект проектом Юникод? Если это так, я полагаю, что TCHAR будет эквивалентен wchar _ t , а не char , что делает попытки преобразования недействительными. Смотрите здесь для получения дополнительной информации.

4
ответ дан 5 December 2019 в 05:56
поделиться

Возможно, потому что TCHAR определен как char в одном из ваших проектов, но не в проекте VS2010, где он, вероятно, wchar_t.

Если ваш проект определяет UNICODE/_UNICODE, что то же самое, что указать в настройках проекта, что это сборка Unicode, то TCHAR будут wchar_t.

По сути, вам нужно решить, использовать Unicode или нет, и если да, то вам нужно изменить обычные вызовы strncpy и др. на широкосимвольные эквиваленты или использовать t-варианты, которые изменяются так же, как и TCHAR. Посмотрите в справке к strncpy или другим функциям, чтобы узнать, как называются широкие или t-варианты.

Вы также можете посмотреть в MSDN такие вызовы, как strcpy, где вы увидите, что широкозарядный вариант называется wcscpy, а t-вариант - _tcscpy. Я бы рекомендовал вам придерживаться t-версии, если вы собираетесь использовать код в различных проектах, которые либо используют UNICODE, либо нет, или принять взвешенное решение, какую из них вы собираетесь использовать, а затем придерживаться ее. Что лучше, зависит от вашего сценария, я бы сказал, и может вызвать некоторые "религиозные" мнения...

7
ответ дан 5 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: