我有以下代码:
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不喜欢我的"label"因为它是一个数组函数是这样调用的
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());
//...
}
{Edit}
当你想使用函数模板时,你必须匹配所有的形参类型。因此,您必须将字符串的长度而不是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() );
try with this
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/