0

我有以下代码:

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());
    //...
}
4

3 回答 3

1

{编辑}

当你想使用函数模板时,你必须匹配所有的参数类型。因此,您必须将字符串的长度而不是 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());
    //...
}
于 2013-01-22T12:10:05.557 回答
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/

于 2013-01-22T12:12:00.167 回答
0

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() );
于 2013-01-22T12:09:22.413 回答