У меня был следующий код:
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());
//...
}
{Редактировать}
Если вы хотите использовать шаблон функции, вы должны сопоставить все типы параметров. Таким образом, вы должны передать длину строки вместо второй копии результата 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());
//...
}
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() );
попробуй с этим
BOOL refreshTextField(CButton* item, wchar_t[] label, long long* number){
//...
wcsncat_s(label, ss.str().c_str(), sizeof(ss.str().c_str()));
//....
}