C ++ массив wchar_t для указателя и использования функции

У меня был следующий код:

wchar_t recordsText[64] = L"Records: ";
std::wstringstream ss2;
ss2 << c;
wcsncat_s(recordsText, ss2.str().c_str(), sizeof(ss2.str().c_str()));
((CButton*)GetDlgItem(IDC_RECORDS))->SetWindowTextW(recordsText);

Это сработало довольно хорошо, но я хочу поместить это в функцию … нет ничего проще, чем я думал. но я получаю глупую ошибку.

моя функция была эта:

BOOL refreshTextField(CButton* item, wchar_t* label, long long* number){
std::wstringstream ss;
ss << number;
wcsncat_s(label, ss.str().c_str(), sizeof(ss.str().c_str()));
item->SetWindowTextW(label);
return true;
}

но wcsncat_s не нравится моя «метка», потому что это массив и функция вызывается так:

refreshTextField(((CButton*)GetDlgItem(IDC_SENT_PACKAGES)), L"Packages send:  ", &sentPackages);

(кстати: я знаю, что это не должно быть приведено к CButton, потому что это поле редактирования :-D, но это не имеет значения в данный момент.)

проблема в массиве wchar_t, я не знаю, как правильно добавить его в мою функцию. Надеюсь, вы можете дать мне полный ответ.

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

BOOL refreshTextField(CButton* item, wchar_t** label, long long* number){
//...
wcsncat_s(*label, sizeof(*label), ss.str().c_str(), sizeof(ss.str().c_str()));
//....
}

и это:

BOOL refreshTextField(CButton* item, wchar_t* label, long long* number){
//...
wcsncat_s(label, sizeof(*label), ss.str().c_str(), sizeof(ss.str().c_str()));
//....
}

РЕДАКТИРОВАТЬ:

Итак, решение было таким:

вызов:

refreshTextField(mySelectedUIItem, L"testlabel", sizeof(L"testlabel"), 4);

функция:

BOOL refreshTextField(CButton* item, wchar_t* label, size_t lableSize, long long* number)
{
std::wstringstream ss;
ss << number;
wcsncat_s(label, labelSize, ss.str().c_str(), ss.str().length());
//...
}

0

Решение

{Редактировать}

Если вы хотите использовать шаблон функции, вы должны сопоставить все типы параметров. Таким образом, вы должны передать длину строки вместо второй копии результата c_str () в шаблон wcsncat_s:

wcsncat_s(recordsText, ss2.str().c_str(), ss2.str().length());

Это разрешит к прототипу

template <size_t size>
errno_t _mbsncat_s(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count
); // C++ only

{/Редактировать}

Без шаблона применяется следующее:

Вы не можете передать массив в функцию. Функция будет принимать только указатель. Доступ к массиву можно получить с помощью указателя внутри функции. Но вы теряете информацию о размере массива.

Поскольку указатель указывает только на первый элемент массива, который вы не можете использовать

sizeof(*somePointer);

потому что это дает вам размер первого элемента массива.

Вам необходимо изменить список параметров refreshTextField. Так как label Аргумент указывает на выходную переменную, вам нужен размер переменной в качестве дополнительного параметра. например.:

BOOL refreshTextField(CButton* item, wchar_t* label, size_t lableSize, long long* number)
{
std::wstringstream ss;
ss << number;
wcsncat_s(label, labelSize, ss.str().c_str(), ss.str().length());
//...
}
1

Другие решения

SizeOf (ss2.str (). c_str ())

Результат функции c_str() является wchar_t*, sizeof( wchar_t* ) 4 или 8 байт (в 32- или 64-битной системе соответственно). Вы должны использовать wstring::length() функция вместо:

wcsncat_s( label, ss.str().c_str(), ss.str().length() );
0

попробуй с этим

BOOL refreshTextField(CButton* item, wchar_t[] label, long long* number){
//...
wcsncat_s(label, ss.str().c_str(), sizeof(ss.str().c_str()));
//....
}

http://www.cplusplus.com/faq/sequences/arrays/sizeof-array/

0
По вопросам рекламы [email protected]