• ベストアンサー

* の役割について

windows プログラミングをVC 2003 で始めたばかりの初心者です。参考書を元にウィンドウプロシージャに変数を書いているときに、 char *szStr = "Windows program"; という文があったのですが、このszStrの前の * はいったいどうゆう役割をはたしているのでしょうか? それに影響されてかTextOut関数を使うときも TextOut{hdc, 10, 10, (LPCTSTR)szStr, (int)sizeof(szStr)}; となってszStr の前に(LPCTSTR)がついています。この(LPCTSTR)がついていない例文もあるのですが どうゆうときに必要でまたどうゆうときに不必要なのでしょうか? 説明に足りないところがあればまた足しますのでよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

>どうゆうときに必要でまたどうゆうときに不必要なのでしょうか? これに答えて無かったですね 関数で定義された引数の型と実際に渡す引数の型が違うときに必要で型が同じときには不必要です。 型を変えることをキャストといいます。 (LPCTSTR)szStr はchar*型をLPCTSTR型にキャストしていることになります。 const char *szStr = "Windows program"; か LPCTSTR szStr = "Windows program"; としていればキャストは不要になります。 キャストしなくても警告がでるだけでエラーにならないことが多いですが。

ganfuji142
質問者

お礼

なるほどそういうことだったのですね。 LPCTSTR szStr = "Windows program"; と書いて LPCTSTRを省いてデバグしたらたしかに普通にでいきました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

> char *szStr = "Windows program"; という文があったのですが、 > このszStrの前の * はいったいどうゆう役割をはたしているのか これは語述される変数がポインタであることを宣言します。 よって、この宣言によって静的な領域に確保される"Windows program" という文字列のポインタを格納する領域szStrが確保され上記の文字列 が格納された領域へのポインタが代入されます。 >この(LPCTSTR)がついていない例文もあるのですが  >どうゆうときに必要でまたどうゆうときに不必要なのでしょうか? 本来は不要で行うべきではありません。 しかしC言語上では「メモリの動的確保」など どうしても必要な場合があり本来はこの為の機能です。 C言語上では「キャスト」と呼ばれコンパイラを「騙す」為の 一種のおまじないなので極力使用しないで書くことが望ましいです。 今回であれば、ほかの方も書かれているとおり、szStrを LPCTSTR型で定義すれば、こういったキャストは不要になります。

ganfuji142
質問者

お礼

ありがとうございました。 たしかに言われるとおり szStr をLPCTSTR で定義したら キャストなしでもできました。 ほんとうにありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

こんにちわ。 cのポインタって取っつき辛いモノですよね。 参考書の後の方に載ってませんか? あるいは http://www.sgnet.co.jp/c/6-1.htm こんなサイトから勉強してみるとか。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

*はポインタですね UNICODEでなければ TCHAR = char LPCTSTR = const char* LPTSTR = char* と同じになります

全文を見る
すると、全ての回答が全文表示されます。
  • gonbee774
  • ベストアンサー率38% (198/511)
回答No.1

szStrが(charへの)ポインタであることを示しています。 (LPCTSTR)については、キャストする必要があるか否か(もともとLPCTSTRで宣言されているか)だと思いますが…

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • BeginPaintの使い方

    現在windowsプログラミングを勉強しています。 まだまだはじめたばかりでwindowsプログラミングの把握できていない部分が多々あるので、何か使い方が根本的に間違えているところがあるかもしれませんが、ご容赦ください。 case WM_PAINT: hdc=BeginPaint(hdc,&ps);/*rc,hdc等は宣言済み*/ TextOut(hdc,0,0,szStr,(int)strlen(szStr));/*szStr="文字列"代入済み*/ EndPaint(hWnd,&ps);/*hWnd等は宣言済み*/ break; において、 1.ダブルクリックしたら表示させよう!と思いまして、 WM_PAINT→WM_RBUTTONDBLCLKSと変更したところ表示されなくなりました。 しかし、hdc取得をGetDCで行うとうまくいきました。この違いがよくわかりません。 2.次はダブルクリックすると文字を右に動かそう!と思いまして、 TextOut(hdc,i,0,・・・・)などといたしましてiを増やしたところ更新前の画像が残りました。そこでInvalidateRectによって背景消去しようとおもいまして、TextOutの前に挿入しましたがこれによっても初めから、クリック後も何も表示されなくなりました。 1と2の2点に関して、どなたかご教授いただけないでしょうか。よろしくお願いします。

  • フォントの指定 猫でもわかるwindowsプログラミングより

    猫でもわかるwindowsプログラミングの本で勉強している学生なんですが、第2章の2.4フォントの指定のところでプログラムを打ち込んでコンパイルしたのですがなぜか識別子が見つかりませんというエラーがでてコンパイルできません。どなたかわかる方お願いします。 一応プログラム(CALLBACK関数と論理フォント作成の関数のみ)↓ //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static HFONT hFont1, hFont2, hFont3; PAINTSTRUCT ps; HDC hdc; char *szName1 = "○○"; char *szName2 = "▲▲"; switch (msg) { case WM_CREATE: hFont1 = MyCreateFont(40, SHIFTJIS_CHARSET, "HG行書体"); hFont2 = MyCreateFont(40, ANSI_CHARSET, "Fraktur JS"); hFont3 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS 明朝"); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, hFont1); TextOut(hdc, 0, 0, (LPCTSTR)szName1, (int)strlen(szName1)); SelectObject(hdc, hFont2); TextOut(hdc, 0, 60, (LPCTSTR)szName2, (int)strlen(szName2)); SelectObject(hdc, hFont3); TextOut(hdc, 0, 120, (LPCTSTR)szName1, (int)strlen(szName1)); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hFont1); DeleteObject(hFont2); DeleteObject(hFont3); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //論理フォントの作成 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName){ return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE. FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); } エラー内容↓ MyCreateFontの識別子が見つかりません。 論理フォントの関数のFALSEの値が構文エラーで参照できない。

  • WinAPIでRECT構造体の宣言について

    PAINTSTRUCT ps; HDC hdc; RECT rct={200,200,200,200}; char *szStr = "あけまして\n\tおめでとう"; switch (msg) { case WM_PAINT: GetClientRect(hWnd, &rct); hdc = BeginPaint(hWnd, &ps); DrawText(hdc, (LPCTSTR)szStr, -1, &rct, DT_CENTER | DT_WORDBREAK); EndPaint(hWnd, &ps); break; のようにしているのですが文字列が表示される場所が中央上部です。 何故なのでしょう? 自分としてはど真ん中辺りから表示されるようにしているつもりなのですが

  • TextOutについて

    ウィンドウの雛形に、 case WM_PAINT:{ static int t; PAINTSTRUCT ps; char cbuf[100]; HDC hdc = BeginPaint( hWnd, &ps ); wsprintf( cbuf, _T("on WM_PAINT%d"),t); TextOut(hdc,0,100,cbuf,sizeof(cbuf)); SetWindowText( hWnd, cbuf ); t++; EndPaint( hWnd, &ps ); break; } として実行したところ、ウィンドウを任意のところに重ねて、移動すると、SetWindowはタイトルバーにちゃんとの値が表示されるのですが、TextOutのtは再描画されないのですが、通っているのに描画されないのはなぜでしょうか?

  • * の役割について2

    windows プログラミングを始めたばかりの初心者です。 今日参考書を元に ソースを書いていたら スレッド関数の 変数宣言のところでMYDATA *lpmydata; という文があったのですがこの場合の * は一体どうゆう役割をはたしているのでしょうか? MYDATAは自作構造体で中身はこうなっています。 typedef_struct_tagMYDATA{ HWND hWnd; HDC hdc_mem; BOOL bEnd; }MYDATA; 説明に不足があればまた足しますのでよろしくお願いします。

  • Windows APIでおかしな事になる。

    Windows APIでプログラミングをしています。 Windows APIでプログラミングをしています。 char*型の文字列を表示させようと、このように記述しました。 const char * y; y=f(); SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); wsprintf( str, "名前は、%s", y ); TextOut(hdc , 300, 20, str, lstrlen(str)); すると、表示できたのはいいのですが、 タイトルバーをクリックしてウィンドウを広げたり、別のウィンドウを一番前に持ってきて、 その後、そのウィンドウを出したりすると、エラーが出て、強制終了になってしまします。 何か問題はありますか? ちなみに、strの宣言はこのようになっております。 static TCHAR str[64]; あとですが、 wsprintf( str, "名前は、%s", y ); この部分のyを&yに変えると、エラーは起こりませんが、 変な文字が表示されてしまいます。 ウィンドウを少し操作すると、その文字がまた変な文字に変わります。 何が原因でしょうか。

  • 初歩的なんですが…

    自分の母語はJavaなのですが、先日C++を始めました。 やっぱり似ているのでスイスイいけてはいたのですが 初歩的な所でつっかかりました… 自分でも調べたのですが、できないのかを調べるのことは難しくて… よかったら教えてください。。 Javaでは、例えば、 Method(String str, int num) で定義されたメソッドを呼ぶとき( aはint型の変数として適当な値が入っているとして) Method("文字" + a, 99); という感じで呼べます。≪"文字" + a≫が文字列として扱われるからなのですが、、 C++はこうゆうことができないのでしょうか? やりたいことを具体的に書きますと、 BOOL TextOut( HDC hdc, // デバイスコンテキストのハンドル int nXStart, // 開始位置(基準点)の x 座標 int nYStart, // 開始位置(基準点)の y 座標 LPCTSTR lpString, // 文字列 int cbString // 文字数 ); を呼ぶときに、 TextOut(hdc, 0, 0, a + "回", 3); という感じで呼びたいのですがもちろんダメです。 調べたところ、 wsprintf()を使って一旦別の変数に入れるという段階的な方法が見つかりました。でもこれだとなんかスマートな感じがしなくて、変数も消費してしまいますし… ダイレクトでJavaのようにすることはできないのでしょうか? 何かこういった場合に使える演算子などありませんでしょうか?

  • (SHORT)

    ウインドウプロシージャ内ですが、(SHORT)は何のためについているんでしょうか?(どんな効果がありますか) 教えてください。 case WM_MOUSEWHEEL :     wsprintf(str,TEXT("WHEEL %s"),        ((SHORT)HIWORD(wparam))>0 ? TEXT("↑"):TEXT("↓"));     hdc=GetDC(hwnd);     TextOut(hdc,0,0,str,lstrlen(str));

  • wParam

    wParamは、unsigned int型で、仮想キーコードを、格納してますよね。 wsprintf()内で(TCHAR)キャストしてますが、 これは、変数strの型がTCHAR型なので(wParamは、unsigned intなので型をあわせるために)やっているんですか? (TCHAR)キャストしないとエラーになりますか?教えてください。 HDC hdc; TCHAR str[255]; swich(umsg){   case WM_CHAR:     wsprintf( str, TEXT("%c"), (TCHAR)wPara );     hdc = GetDC(hwnd);     TextOut(hdc, 0, 0, str, lstrlen(str));     return0 }

  • C++のwindowsアプリケーションについて

    windowsアプリケーションで 数字を表示させたいのですができません。 文字列に置き換えないといけないみたいなのですが。なかなかうまくいきませんでした。 :上省略: case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 描画コードをここに追加してください... int a; a=10; char buf[10]; sprintf(buf,"%d",a); TextOut(hdc,100,20,L"Hello Window!",13); TextOut(hdc,100,50,L"buf",10); としたのですが Hello Window!は表示されるのですが  そのしたに10と表示させるにはどうしたらよいでしょうか?? #include <stdio.h>は上に書いてあります。 詳しい解説よろしくお願いします。

EP833AW CDが入っていかない
このQ&Aのポイント
  • EP833AWでCDが入らない問題が発生しています。どうすればCDを正しく挿入できるようになるでしょうか。
  • EP833AWのCD挿入に問題があります。CDを挿入するときに困難を感じる場合、解決策を教えてください。
  • EP833AWのCDがうまく挿入できません。正しい方法を知りたいです。
回答を見る