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()結果の2番目のコピーではなく、文字列の長さを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

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 に答える
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 に答える