1 名前:デフォルトの名無しさん [2007/09/10(月) 12:20:27 ] 1 : ◆Manna2uCLg :2005/04/15(金) 13:33:14 Visual C++入門者・初心者からの質問を、 お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。 ■質問するにあたって ・エラーや警告のときはエラーメッセージを書きましょう。 ・開発環境も書きましょう。 ・できるだけ具体的に。 質問の仕方については次のページが大変参考になります。 www.hyuki.com/writing/techask.html myu.daa.jp/osiete/ ■回答するにあたって ・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。 (MSDNのどの項目だとか、何のキーワードでGoogleするとか) ・ネタや煽りは軽く流しましょう。 過去スレ、関連スレなどは>>2-5 。
83 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 01:40:54 ] >>82 死ね
84 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 14:50:37 ] そんなvectorの使い方はじめて見た。というか意味不明。
85 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 14:55:45 ] >>84 二次元データを扱うために、vector<vector<float> >なんて使い方するのは常套手段だが。 >80の使い方なら確かに気色悪いと思う。
86 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 16:44:18 ] >>85 いや、当然>80の話よ。vectorの意味を理解してない気がするので。
87 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 18:54:25 ] vector<char> vec(size); こうしたいだけだよな>>80 は
88 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:30:46 ] C++の話はどうでもいい
89 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:53:53 ] list<vector<char>> vector<list<vector>::iterator> でいいじゃん
90 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 01:29:23 ] vector<char>使うならstd::stringを使いたい気分
91 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 01:39:46 ] boost::ptr_vector<std::string> str_vec(size);
92 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 02:02:10 ] >>83 死ね って言ってる理由が分からないんだが。 vector<vector<char> > は何か問題あるの?
93 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 02:26:14 ] >>92 スルー推奨
94 名前:デフォルトの名無しさん [2007/09/21(金) 22:15:06 ] リソースエディタ経由ではなく直接リソースIDを確保したいときどうしたらいいですか? Resource.hにじかに編集?
95 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:38:38 ] C++でBot作れますか?
96 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:51:02 ] 作れない方がおかしい
97 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:10:50 ] >>94 resource.h を直接編集してますね 個人的に気をつけてるのは、プロジェクトを閉じてから編集を開始するのと 編集後.apsファイルは削除しておくことくらい
98 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:57:57 ] VC++6で、キー入力を捕まえたいんですが、 設置してあるボタンを押したあとだとキー入力を受け付けてくれません。 原因は何でしょうか?
99 名前:デフォルトの名無しさん [2007/09/22(土) 00:03:53 ] Win32API で CreateWindowW( とすると引数の情報が出てくるんですけど CreateWindow( では情報がでてきません。 これが普通なんでしょうか? それとも何かファイルが壊れててでなかったりしてるんでしょうか?
100 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:04:59 ] >>98 もっともっともっともっともっともっともっともっともっともっともっともっともっともっともっと詳しく。
101 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:11:45 ] >>99 お前バカじゃねぇの 環境書けよ どうせ2005だろ?仕様だよ
102 名前:デフォルトの名無しさん [2007/09/22(土) 00:19:11 ] >>100 すみません。 ボタンを押した後、フォーカスがそこにあっていて キー入力を認識しないみたいなんです。 ボタンが押されたときは case WM_COMMAND: switch(LOWORD(wp)) { ・ ・ ・ case ID_CF: if(field_flag==FIELD1) field_flag=FIELD2; else field_flag=FIELD1; InvalidateRect(hWnd, NULL, TRUE); break; } のようなかんじで、 キー入力の受け付けは case WM_KEYDOWN: GetKeyboardState(state); if(state[VK_UP] & 0x80){ if(mode_flag==HAITI){ ・ ・ ・ } でやっています。
103 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:24:07 ] わろた
104 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 00:33:34 ] インラインアセンブラが使え無い言語は 基本的に劣っていると考えたい・・・
105 名前:デフォルトの名無しさん [2007/09/22(土) 00:34:16 ] すみません、超初心者なんで・・・どうしたらよいのでしょうか?
106 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 00:38:05 ] ワロタら良い
107 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:39:10 ] 原因がわかりました。 どう調べたらいいのか分からなかったので・・・ ありがとうございました。
108 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:49:50 ] ソーセージ買いに行ったら自己解決しとった
109 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:57:06 ] 今からオナルんか? まんこ臭くなるから気を付けろよ
110 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 01:10:27 ] エラー デバッグ ブラウザ ツール www.mozilla-japan.org/ シンプル プログミング ツール proforceone.web.fc2.com/ 素因数分解サンプルプログラム Calculation processing にコピーして[RUN] A=2*3*5*11*13*17*19; x=A;br();write(" "+x+" ⇒"); for(i=2;x>=i;i++){if(0==x%i){k=0; for(j=2;(i>=j)&&(1>=k);j++){ if(0==i%j){k++;} } if(1==k){write(" "+i);} }}
111 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 01:51:49 ] インラインアセンブラじゃなくてインラインフォートランにすればいいのに
112 名前:デフォルトの名無しさん [2007/09/22(土) 03:22:01 ] strtokがエラー出るんだけどなんで? strtokのソースの中で検索ヒットした文字に\0で置き換えするところでアクセス違反起きてる ちゃんと文字列の中アクセスしてるはずなのになんで?どうして?
113 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 03:23:17 ] お前がバカだから
114 名前:デフォルトの名無しさん [2007/09/22(土) 03:32:47 ] マジで?
115 名前:デフォルトの名無しさん [2007/09/22(土) 03:35:13 ] くまった
116 名前:デフォルトの名無しさん [2007/09/22(土) 06:13:46 ] ローカルの変数にコピったら動いた!!!!1 頭いいかもしんない。ここのみんなじゃ無理だったかも・・・
117 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 06:15:15 ] お前の事だからそんなこったろうと思ったよ 頭わるすぎw全米がわろた
118 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:26:33 ] >>116 無理だったね。 112に書いてあることだけで答えを導き出すには、 おそらく一級のエスパーが必要だったろうから。
119 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:34:37 ] >>116 正解だったね。 113に書いてあるとおりで答えを導き出せないのは、 おまえが超級のパーである証明だったろうから。
120 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:38:46 ] VC++5.0(mfc42のヤツ)のインストールについて教えてください。 WindowsXPが出始めた頃にVC++5.0をインストールして普通に使えていたのですが、 XPのSP2を入れたらInfoViewerが表示できなくなってしまいました。 (HTTP 404 - ファイル未検出)とか言うエラーが表示されます ググッったら、以下のような情報を見つけました。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DISABLE_MK_PROTOCOL に新規キーで「MSDEV.EXE=dword:00000000」を作成 が、そのときにはVC++5アンインストールと再インストールをしてしまっていました。 (上の情報を早くみつけていれば、レジストリの修正だけですんだのに。。) インストールしなおしたVC++5.0では、上記のレジストリキーを設定しても やはりinfoViewの内容を表示させるとエラーになります。 なにか解決方法をご存知の方がいらっしゃったらだったらご教授ください。 よろしくお願いします。
121 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:40:18 ] 新しいのにする
122 名前:デフォルトの名無しさん [2007/09/22(土) 11:11:35 ] CDC *pdc = GetDC(); pdc->Ellipse(x1, y1, x2, y2); とかのEllipseの引数を自分で作ったクラス(myclass)にしたい場合 CDCクラスにEllipse(&myclass)みたいなのを作る myclassにEllipse(&CDC)みたいなのを作る CDCクラスとmyclassを継承したクラス(myCDC)にEllipse()を作る(1行目もmyCDC *pdc = GetDC();) どれが普通なんでしょう
123 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:33:27 ] >>97 サンキュー やっぱそんなかんじか。マイクロソフトはホントダメだな。
124 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:40:55 ] マイクロソフトがダメなんじゃなくてお前がダメw
125 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 12:11:02 ] JavaScriptに近いC++ありませんか?
126 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:16:04 ] C++0x
127 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:35:50 ] >>122 フレームワークの中身を書き換えるなんて原則もってのほか。だから1はない。 3番目の案は悪くないが、GetDCがCDCへのポインタ返すのに myCDCへのポインタとして扱うことは、 (これくらい動くだろうが)規格上、未定義なので気持ち悪い。 仮にGetDCがmyCDCへのポインタを返すように書き換えるとしても それは1と同じ理由で却下。 残るのは2番。
128 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:37:46 ] 人はそれをヘルパ関数と呼
129 名前:デフォルトの名無しさん [2007/09/22(土) 16:42:49 ] CButtonとかはリソースエディタで追加するとそのまま使えるのに 手で追加するとなぜCreateを呼ばないといけないの? リソースとして追加した場合なんでCButtonのインスタンスが無いの?
130 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:52:16 ] ボタンはコントロール C++のクラスではない CButtonはそれをMFCで扱うためのクラス
131 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:56:43 ] ダイアログ上のコントロールは、 ダイアログ作成時にWindowsが作る(そのためのダイアログだ)。 あとは、作成されたコントロールとソース上のCButtonとを 関連付けるだけなので、Createする必要がない。
132 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:13:43 ] >>130-131 なるほど。。つまり以下の様に理解したけどOKですか? (1)リソースとしてボタンを追加した場合、MFCのダイアログクラスが初期化のときに自分でそのボタンをCreateしている。 (しかもダイアログクラスはボタンが必要だという情報をリソースファイルから得ている?(だってソース上は見当たらないからなぁ。)) (2)リソースとして追加したうえ、変数を割り当てるとそのCButtonクラスと、内部で生成したボタンコントロールのウインドハンドルをどこかで関連付けている。 (3)リソースエディタを使用しない場合、ダイアログはそのコントロールを作成しない。だから自分でCreateを呼ぶ必要がある。
133 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:20:07 ] >>132 >(2) つ[OnInitDialog()]
134 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:27:32 ] >>133 ありがとうございます。ステップ実行してOnInitDialogでなんかごにょごにょして、その過程でCButtonのメンバが有効な値をもつようになったの確認できました
135 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:40:37 ] 教えるだけ無駄なようだね
136 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:59:37 ] 本当は教える知識がないんでしょ?w
137 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:01:01 ] えぇーどんだけーってレベルでしょ
138 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:16:31 ] いかほどぉ〜
139 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:40:58 ] >>132 (1)、「MFCのダイアログクラス」ではなく、「Windows」。
140 名前:デフォルトの名無しさん [2007/09/23(日) 00:15:44 ] まず何から勉強すればいいですかね?
141 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 03:31:07 ] >>140 C→C++→Cでwin32apiをかじる→MFCでわけわかんなくなる。 →それでもがんばる→疲れる→Cが恋しくなる→でもC++でがんがる →どうでもよくなる。
142 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 07:37:51 ] Cを少しかじる→C++でわけわかんなくなる→MFCをかじる→感動する→C++も分かった気になる →win32apiも分かった気になる→Cが恋しくなる→久しぶりにCに戻ってみる→ MFCが恋しくなる→でもがんばる→むかついてどうでもよくなる。
143 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 09:02:44 ] Cを少しかじる→むかついてどうでもよくなる。
144 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 09:13:07 ] visual C++ からg++なんかの外部のコンパイラを使うにはどうすればいいの?
145 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 09:42:04 ] cl.exeを置きかえる
146 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 10:36:42 ] カスタムビルドステップ
147 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 11:59:54 ] むりむりかたつむり!
148 名前:デフォルトの名無しさん [2007/09/23(日) 16:42:12 ] WM_KeydownのところでOnKeyDownを追加したんですが、 キーボードから何を押してもそこへ飛んでくれないんですが これって何か初期設定みたいなのが必要なんでしょうか?
149 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 17:07:53 ] WM_KEYDOWN を受け取ろうとしているウィンドウにフォーカスが当たってないんじゃない? たとえば、ダイアログ上のエディットボックスでキーを押した場合、 WM_KEYDOWN が飛んでくるのはダイアログじゃなくてエディットボックス
150 名前:デフォルトの名無しさん [2007/09/23(日) 17:19:31 ] >>149 ダイアログをクリックしてから押してるんだけどうんともすんとも ちなみにダイアログだけのプログラムでダイアログにはボタンが6個あるだけです
151 名前:デフォルトの名無しさん [2007/09/23(日) 18:28:26 ] Visual Studio2005使って、Windoxsフォームアプリケーションやってるけど リソースの使い方がわからない…
152 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 18:31:20 ] がんばれ
153 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 18:35:06 ] Windoxs
154 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 18:53:38 ] >>151 すっげーなお前 Visual Studio2005使って、Windoxsフォームアプリケーションなんかやってるんだ
155 名前:デフォルトの名無しさん [2007/09/23(日) 18:54:42 ] >>154 普通は何やるんですか?
156 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 19:24:53 ] >>155 次期SPや修正パッチなどの出荷用テスト
157 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 19:41:56 ] 私、昨日買ったばっかなんですが、勉強したくて
158 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 19:47:07 ] 初心者向けの製品は別にあるよ
159 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 20:12:47 ] 本か何か買ったの? それ見てやればいいんじゃね?
160 名前:デフォルトの名無しさん [2007/09/23(日) 21:31:01 ] 最近のWindowsアプリケーションはいったいどんな種類があるの? 自分はダイアログベースアプリが80% 10%はDLLやStaticLib 時々SDIアプリ たまーにActiveX GUI系で最近の流行ってなんですか?
161 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 07:02:02 ] スリープ(モニタ電源OFF)から復帰すると動作がおかしくなってるのですが なにか特別な処理をする必要があるのですか?ソフトはアナログ時計です。 なおPC不調でサスペンドから復帰できなくなってるのでサスペンドの場合はどうなるのか 不明です。
162 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 07:12:33 ] サスペンドの場合はPCの電源が即座に切れ二度と起動しなくなります。
163 名前:デフォルトの名無しさん [2007/09/25(火) 22:01:23 ] Visual C++と、標準C++って何が違うんですか?
164 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:19:24 ] Visual C++は商品名で標準C++は言語名
165 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:31:11 ] Visual C++で、入門者がMFCを最初にやるのは馬鹿ですかね?
166 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:51:53 ] C++ をよく理解してるんならいいんじゃないのかな。 でも Windows プログラムの動く仕組み理解しておいた方がいいんじゃないかな
167 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 00:09:05 ] VisualC++で、キーボードからの入力をテキストファイルに保存したいんですけど、どうしたら出来ますかね?
168 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 00:39:39 ] 1)キーボードから入力を受け取って 2)ファイルに書き込む といいよ
169 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 00:55:04 ] >>167 キーロガー作ってパス盗む気か
170 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 01:11:12 ] ついでに特定のサイトを見ているときだけ保存したいんですけど、どうしたらできますかね?
171 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 02:41:42 ] >>170 釣りは死んでください。
172 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 02:45:01 ] はい
173 名前:デフォルトの名無しさん [2007/09/26(水) 07:28:10 ] vs2005ですが、デバッグの際、 stlのvectorとかでエラーが出たときに なんかウィンドウが出るだけでデバッガの方に出力されないので どこでエラーが出てるのか分かりにくいです。 どうにか場所を特定する方法ってありますか?
174 名前:デフォルトの名無しさん [2007/09/26(水) 08:12:35 ] キーボードからの入力を受け取りたいんですけど、やっぱりAPIとかの知識がないとだめなんですかね?
175 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 08:18:52 ] キーボードからの入力以前に、やっぱりAPIとかの知識がないとだめ人間です。
176 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 08:25:37 ] >>173 つブレークポイント まず適当にブレークポイントを設定して自分のコードのどの場所でエラーが出るか特定する 次にその部分で使ってる関数の各ステップにブレークポイントを設定してどの場所でエラーが出るか特定する それを再帰的に繰り返していくとランタイムアサートのマクロ構文に辿り着く筈
177 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 08:39:44 ] >>175 学習してきます。
178 名前:デフォルトの名無しさん [2007/09/26(水) 20:53:45 ] 質問です。 struct Base { void *p; virtual ~Base(){} }; struct Hoge : public Base { Hoge(){p = new HogeData;} }; と、このように IData *pを派生先で共有したいと思っています。 派生先ごとにpに何を生成するかは決まっており、 Hoge なら new HogeData Main なら new MainData John なら new JohnData といった具合です。(xxxData たちは全て、IDataを継承しています) この状態で Hoge *pHoge = new Hoge; と、VisualSturio6.0のデバッガ「変数ウインドウ」で見た場合、pはあくまでvoid*型なのでそれ以上データを見ることはできません。 しかし、プログラマである私が決めたルールとして Hogeの時のpは*HogeDataとして扱うというルールがあります。 これをデバッガに認識させる方法はありませんでしょうか? ・Base *pHoge = new Hoge; とした場合、pHoge->pをHogeDataだと認識する必要は無い(高望みすぎるので) ・void *p; のかわりに IData *p; にしてみたが、IDataとしてしか認識してくれなかった(HogeDataの持つ変数は見られなかった) ・デバッガに認識させるために、何か特別な記述を加える労力は惜しまない ・クイックウォッチを使ってきちんと手動で型認識させてやれば見られたが、毎回手動はきつい(自動にできる方法があるならそれでもいいかも) よろしくお願いします。
179 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 20:55:30 ] 1行間違いです >と、このように IData *pを派生先で共有したいと思っています。 ↓ と、このように void *pを派生先で共有したいと思っています。 曖昧な表現でした >pはあくまでvoid*型なのでそれ以上データを見ることはできません。 ↓ つまり、変数ウインドウ上のpの頭のところに[+]記号が出てこないということです
180 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 21:08:24 ] >>178 仮にBaseはpを持っている必要がないとすれば、 BaseにIData* GetData() = 0;のようなメンバ関数を用意して、 個々の派生クラスで、メンバ変数pとpを返すGetDataを定義するという方法が思い付く。 派生クラス毎にpを持てば、HogeDataなど特化した型にできるだろう。
181 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 21:17:04 ] void pointer…(ゴクリ
182 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 21:22:40 ] >>180 お返事ありがとうございます。 派生クラス毎に持つという案は確かに考えたのですが、 Base <- Hoge <- HogeEx とやったときに複数ポインタが存在することになってしまいます。 (Baseには無しとしても、Hoge分とHogeEx分) IData* GetData() =0; の手法ですが、そのGetDataを呼び出す記述がソースに無い限り いきなりブレイクして変数ウインドウを見ても表示されないのではないでしょうか。 一応今も非virtual なGetDataをそれぞれ持つようにさせ、クイックウォッチの時の記述が統一的になるようにはしています。 (ただ、それでもクイックウォッチ呼び出すのかなり面倒なのですよね…)
183 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 21:46:50 ] template <typename T> struct Holder : public IHolder { Holder() : p(new T) { IHolder::p = p; } T* p; }; を作って typedef Holder<HogeData> Hoge; typedef Holder<MainData> Main; みたいに使えばどうか? 見るだけならrelease時はT* p を持たないバージョン作っといてそれを使うようにすればいいし