Member 12711426 Ответов: 3

Ошибка C2440: '=' : не удается преобразовать из 'wchar_t *' в 'unsigned char *'


Я создал массив n unsigned char вот так,


unsigned char* m_buffer[50];

и я инициализирую вот так


m_buffer[50] = (wchar_t*)calloc(AU_DATA_BUF, sizeof(wchar_t));

вот я и добрался

невозможно преобразовать из 'wchar_t *' в 'unsigned char *' ошибка ,
не могли бы вы сказать мне, как его напечатать

Что я уже пробовал:

unsigned char* m_buffer[50];


m_buffer[50] = (wchar_t*)calloc(AU_DATA_BUF, sizeof(wchar_t));

3 Ответов

Рейтинг:
28

Richard MacCutchan

Вы не можете выделить блок памяти с помощью calloc и назначьте его таким образом. Возвращаемое значение calloc это указатель, поэтому вы должны хранить его в указателе, например так:

unsigned char* m_buffer;

m_buffer = (unsigned char*)calloc(AU_DATA_BUF, sizeof(unsigned char));

// or if you really want wide characters

wchar_t* m_buffer;

m_buffer = (wchar_t*)calloc(AU_DATA_BUF, sizeof(wchar_t));


Рейтинг:
2

CPallini

В вашем коде есть (по крайней мере) две проблемы.

  1. Вы пытаетесь назначить блок динамической (кучной) выделенной памяти массиву (который, кстати, уже выделен в стеке).
  2. Вы назначаете несовместимые типы, w_char и unsigned char.


Пожалуйста, обратите внимание, calloc не C++ способ выделения динамической памяти (new это так) и, во всяком случае, new это редко требуется. Вы могли бы вместо этого использовать std::array например ,
std::array<unsigned char, 50> ab;
std::array<wchar_t, 30> aw;

для памяти фиксированного размера или, как было предложено, std::vector например ,
std::vector<unsigned char> vb
std::vector<wchar_t> vw;
для динамически выделяемого объекта.


Рейтинг:
13

Rick York

Ричард прав. В общем, в C++ вы должны использовать new и delete, но еще лучше использовать STL-объекты. Std::vector<puchar> скорее всего, сработает для вас.

В редких случаях я использую calloc и free я использую этот маленький макрос :

#define AllocateMemory(count,type)	(type*)calloc(count,sizeof(type))

// example usage to get 50 pointers :

PUCHAR * m_buffer = AllocateMemory( 50, PUCHAR );
Приведение не требуется, потому что оно выполняется в макросе.

Вы действительно хотите, 50 указателей или вы хотите, чтобы массив из 50 байт? Это не ясно из вашего вопроса, потому что он смешивает их. Пример показывает, как получить 50 указателей. Используя макрос, вот как получить 50 байт :
UCHAR * m_buffer = AllocateMemory( 50, UCHAR );


Richard MacCutchan

Хороший макрос, но я думаю, что ваше определение указателя немного странное.

Rick York

Я пересмотрел второй пример, чтобы он соответствовал первому. Это то, что вы имели в виду, или это ПУЧАР?

Richard MacCutchan

Нет, это квадратные скобки, которые объявляют переменную как массив, а не указатель. Так и должно быть:

PUCHAR m_buffer = AllocateMemory( 50, UCHAR );
// or
UCHAR* m_buffer = AllocateMemory( 50, UCHAR );

Rick York

Хорошо - я изменю это. Спасибо.

Это то, о чем я часто забываю. Эта нотация не работает в таких объявлениях, поэтому я обычно вообще избегаю ее использовать.