C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: intからLPCWSTRへの変換


(過去ログ 121 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■72409 / inTopicNo.1)  intからLPCWSTRへの変換
  
□投稿者/ OROCHI (35回)-(2014/06/08(Sun) 01:56:05)

分類:[C/C++] 

OS:Windows7
開発環境:Visual Studio 2013
言語:C++

こんにちは
現在LPCWSTR形式へint型の数値を文字列として代入したいのですが書き方がよくわかりません
(LPCSTRではありません、ワイドの方です)
内部的にはLPCWSTRはwchar_t*と同義なので、_swprintfで以下のように書けるかと思ったのですが、第1引数のパラメーターの互換性がないと言われてアウトでした
どなたかこのような変換の書き方をご存知の方、御回答お願いします

(失敗した書き方)
int input = 270;
LPCWSTR strten;
_swprintf(strten, L"%d", input);

何かLPCWSTRの変換には専用の関数でもあるんでしょうか?

引用返信 編集キー/
■72410 / inTopicNo.2)  Re[1]: intからLPCWSTRへの変換
□投稿者/ しま (70回)-(2014/06/08(Sun) 03:12:18)
No72409 (OROCHI さん) に返信
>
> 現在LPCWSTR形式へint型の数値を文字列として代入したいのですが書き方がよくわかりません
> 内部的にはLPCWSTRはwchar_t*と同義なので、_swprintfで以下のように書けるかと思ったのですが、第1引数のパラメーターの互換性がないと言われてアウトでした
> (失敗した書き方)
> int input = 270;
> LPCWSTR strten;
> _swprintf(strten, L"%d", input);

LPCWSTR なんていう書き方を VC++2013 でも使っているんでしたか?
msdn の sprintf の解説にはそのような型は見当たりませんでした。
http://msdn.microsoft.com/ja-jp/library/ybk95axf.aspx

C, C++ の経験はどの位ありますか?
あなたの書き方ですと値(=番地)が未定義のポインターを使うことになっていることはお分かりですか?
余計なことでしょうが、sprintf, swprintf たちは型変換が目的の関数ではありません。
私は、書式指定して文字列を編集するための関数だと考えています。

int input 270;
int buf_length = 256;
wchar_t buf[256];
swprintf(buf, buf_length, L"%d", input);

はお気に召しますでしょうか?
引用返信 編集キー/
■72413 / inTopicNo.3)  Re[1]: intからLPCWSTRへの変換
□投稿者/ Azulean (317回)-(2014/06/08(Sun) 08:17:47)
No72409 (OROCHI さん) に返信
> 内部的にはLPCWSTRはwchar_t*と同義なので、_swprintfで以下のように書けるかと思ったのですが、第1引数のパラメーターの互換性がないと言われてアウトでした

違います。
どちらかといえば、const wchar_t* 相当と言えるでしょう。
http://msdn.microsoft.com/en-us/library/cc230352.aspx

実際、エラーメッセージに const がどうとか出ていませんか?

また、初期化されていないポインタを渡している点が気になることは私も同意見です。
引用返信 編集キー/
■72414 / inTopicNo.4)  Re[2]: intからLPCWSTRへの変換
□投稿者/ επιστημη (109回)-(2014/06/08(Sun) 09:49:11)
僕なら、単にint->WCHAR[]なら _itow で。

#include <windows.h>
#include <cstdlib>
#include <iostream>

using namespace std;

int main() {

  WCHAR result[128];
  int   input = 12345;
  _itow(input, result, 10);

  wcout.imbue(locale("japanese");
  wcout << result << endl;
}

引用返信 編集キー/
■72418 / inTopicNo.5)  Re[1]: intからLPCWSTRへの変換
□投稿者/ OROCHI (37回)-(2014/06/08(Sun) 21:21:13)
2014/06/08(Sun) 21:21:32 編集(投稿者)

>しまさん
>LPCWSTR なんていう書き方を VC++2013 でも使っているんでしたか?
WinAPIの文字列表示関数(TextOut)に用いるため、残念ながらこれ以外の型で使うことはできないという縛りがありました

>Azuleanさん
解説ありがとうございました。私の勘違いです

>επιστημη
回答ありがとうございました。ただ、前述したようにTextOutに使用するのが目的なので、単に変換するだけではまずかったりします

BOOL TextOut(
HDC hdc, // デバイスコンテキストのハンドル
int nXStart, // 開始位置(基準点)の x 座標
int nYStart, // 開始位置(基準点)の y 座標
LPCTSTR lpString, // 文字列
int cbString // 文字数
);

とりあえず以下の方法で出すことには成功しました、ご協力感謝します

int input_tenkey = 0;
int buf_length = 256;
wchar_t strlen[256];
swprintf(strlen, buf_length, L"%02d", input_tenkey);
TextOut(hdc, 0, 20, (LPCWSTR)strlen, wcslen((LPCWSTR)strlen));


一応当初の目的は達せられたので解決とします。ただ、TextOut以外に出す方法あったりするのでしょうか?
解決済み
引用返信 編集キー/
■72422 / inTopicNo.6)  Re[2]: intからLPCWSTRへの変換
□投稿者/ Jitta (149回)-(2014/06/09(Mon) 11:52:49)
Azuleanさん
おそらく、関数の第一引数に対するエラーなので、「wchar_t と const wchar_t に互換性がない」というメッセージです。

エピさん
閉じカッコ足りてないっす。


質問者さん
何のために出力しますか。デバッグ用なら、ファイルに出しましょう。きっと、本番にも必要になります。
解決済み
引用返信 編集キー/
■72437 / inTopicNo.7)  Re[2]: intからLPCWSTRへの変換
□投稿者/ 774RR (163回)-(2014/06/09(Mon) 17:40:44)
> int input_tenkey = 0;
> int buf_length = 256;
> wchar_t strlen[256];
> swprintf(strlen, buf_length, L"%02d", input_tenkey);
> TextOut(hdc, 0, 20, (LPCWSTR)strlen, wcslen((LPCWSTR)strlen));

俺ならこんなコードは絶対書かない。
俺の後輩君がこんなコードかいてたらコードレビューで全部ダメ出しするだろう。

strlen って変数名は標準関数とかぶっている。混乱の元だ。
buf_length は #define なり const なりを使うべきだ。
buf_length の型に int ってのはありえない。書くなら size_t
wchar_t を使うのなら TextOut でなくて TextOutW だろう。
TextOut を使うのなら wchar_t でなくて _TCHAR だ。
wchar_t なのか _TCHAR なのかはプロジェクト全体で統一すべき。
この例ではキャストは要らないはず。不要であるキャストを書くのは言語仕様への理解が足らない証拠
無造作にキャストを書く癖をつけると静的解析ツールが役立たずになる。厳に戒めるべき。
swprintf の返却値を使っていない理由は?無駄な wcslen を呼んでいる理由は?
バッファオーバーフロー脆弱性は無いか?(この例では無さそうだが)
そもそもバッファオーバーフロー脆弱性が存在し得ないようなコードに書き直すべきだ。

ということで蛇足ツッコミだ。書き直すことを強く推奨する。
解決済み
引用返信 編集キー/
■72450 / inTopicNo.8)  Re[3]: intからLPCWSTRへの変換
□投稿者/ OROCHI (38回)-(2014/06/09(Mon) 23:44:35)
> Jittaさん
> 何のために出力しますか。デバッグ用なら、ファイルに出しましょう。きっと、本番にも必要になります。
完全にデバッグ目的で出力してました。というのもこのプログラム、DirectInputを使ったゲームコントローラーのパッドの方向キーの入力が取れているかを確認するテストだったので(input_tenkeyは方向キーの角度が入ります。ニュートラルは-1を返します)、入力後即出力してくれる方がログをとるよりもデバッグの効率が良かったからです

>774RRさん
>wchar_t を使うのなら TextOut でなくて TextOutW だろう。
>TextOut を使うのなら wchar_t でなくて _TCHAR だ
チェック不足でした。そも、キャストも不要なのですね。情報提供感謝します。変数名が適当だったのは実験用だったからです
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -