★初心者にVisual C++を教えるスレ★ Part34
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/06/19(金) 12:39:29お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。
■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう、特にWindowsForm、MFC、Win32アプリケーションの区別。
・できるだけ具体的に。
質問の仕方については次のページが大変参考になります。
http://www.hyuki.com/writing/techask.html
■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
(MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。
過去スレ、関連スレなどは>>2-4辺り。
【過去スレ】
Part33 ttp://pc12.2ch.net/test/read.cgi/tech/1235292263/
Part32 ttp://pc11.2ch.net/test/read.cgi/tech/1225422971/
Part31 ttp://pc11.2ch.net/test/read.cgi/tech/1217494948/
0153デフォルトの名無しさん
2009/07/12(日) 12:55:01そういう質問ばかり増えるとおれらが困るので調べ方を教えておく
MSDNで目的の関数(ここではLoadImage関数)の解説を出す
http://msdn.microsoft.com/ja-jp/library/cc364835.aspx
最後のほうに
ヘッダーファイル xxxx.h をインクルード
ライブラリ xxxx.lib を使用
とか書いてある。それでもだめなら聞きに来なされれ
0154デフォルトの名無しさん
2009/07/12(日) 12:56:440155デフォルトの名無しさん
2009/07/12(日) 13:02:59APIを使う場合は必要なLibをいちいち全部自前でリンクしなきゃならないのかい?
0156デフォルトの名無しさん
2009/07/12(日) 13:13:52C言語系では必要なLIBは自分で指定すんのが基本だからな
宿題スレなんか見てると、よく数学ライブラリをリンクしないで
コンパイル通りませーんって泣いてる初心者がいるよなw
0157デフォルトの名無しさん
2009/07/12(日) 13:14:490158142
2009/07/12(日) 13:56:11教えてくださったページで、無事コンパイルが通りました。
ありがとうございます。
0159デフォルトの名無しさん
2009/07/12(日) 14:30:21C#はC++とは全く別の言語だぞ。名前がよく似ているだけで。
0160デフォルトの名無しさん
2009/07/12(日) 15:03:06C#はクソ言語
・・・とまでは言わないけど、
Javaと同じでC++より楽に習得できる。
C++はバカには使えないほど高度(変態)な言語だが
使いこなせるヤツはもう本当にすごい。
ちなみに俺はまだまだまだまだ使いこなせてません。
0161デフォルトの名無しさん
2009/07/12(日) 15:27:240162デフォルトの名無しさん
2009/07/12(日) 16:01:46API 始めたばっかだけど
0163デフォルトの名無しさん
2009/07/12(日) 18:08:11改善方法を教えてください。DirectX SDK November2007が入ってます。OSはXPSP3です。
0164デフォルトの名無しさん
2009/07/12(日) 18:29:28cppはテキストファィルだが、どこからどうやって開こうとしてる?
たとえばエクスプローラーからcppファイルをダブルクリック、とか
IDEからcppを右クリックしてコードを表示、とか。
0165デフォルトの名無しさん
2009/07/12(日) 23:21:49レス遅れましてすいません。
ソリューション開いてソースフォルダにあるcppファイルをダブルクリックで開こうとしてます。
0166デフォルトの名無しさん
2009/07/13(月) 00:20:02うまくいったら規定値に設定で
0167デフォルトの名無しさん
2009/07/13(月) 00:55:16うまくいかないです・・・。VC上で開くことは出来たのですが文字化けしててダメでした。
VC入れなおしても直らないし、ウイルスに感染してるので設定がめちゃくちゃになったのかもしれません。
なのでOS入れなおすことにしました。お騒がせしてすいません。レスありがとうございました。
0168デフォルトの名無しさん
2009/07/13(月) 11:55:250169デフォルトの名無しさん
2009/07/13(月) 21:05:410170デフォルトの名無しさん
2009/07/13(月) 21:18:16C#でclass C {static void Main() {}}のような何もしないプログラムを書いても
.NET Frameworkが実行に必要なのと同じようなことと言えばいいかな。
そうではなくて、ネイティブコードを混ぜたいという意味なら、
#pragma unmanagedなどで切り替えできる。
0171デフォルトの名無しさん
2009/07/13(月) 21:21:49よくわかりました
ありがとうございます
0172デフォルトの名無しさん
2009/07/14(火) 17:38:13スタックが少なくなったらエラー処理がしたいので、お願いします。
0173デフォルトの名無しさん
2009/07/14(火) 17:41:25スタックオーバーフローを回避したいならヒープ領域を使えば?
0174デフォルトの名無しさん
2009/07/14(火) 17:46:43現在は異常終了してしまうし。固定値で検査は出来るけど、
固定値は入れたくないし。
0175デフォルトの名無しさん
2009/07/14(火) 17:55:170176デフォルトの名無しさん
2009/07/14(火) 17:57:13スタックオーバフローチェックのコンパイラオプションではダメなの?
0177デフォルトの名無しさん
2009/07/14(火) 18:01:460178デフォルトの名無しさん
2009/07/14(火) 18:07:27その辺はプログラムを作るときに工夫するよう、自分で考えたほうがいい。
あれは簡単には解けない、ってことを確認するのも勉強のうちだから。
学生じゃなかったら的外れな回答でごめん。
0179デフォルトの名無しさん
2009/07/14(火) 18:17:52と言うのは正しい。しかしまあ、出来るならば再帰の中で検査をしたいと
思っています。今現在は#define STACKSIZE 1000000 で固定値で
検査をしているのですが、コンパイルオプション変えるたびにプログラム
修正もいやだなーと。しかし、調べた限り簡単では出そうに無いですね。
あきらめて固定値で行こうと思います。
0180デフォルトの名無しさん
2009/07/14(火) 18:37:58ttp://www.nminoru.jp/~nminoru/programming/stackoverflow_handling.html
0181デフォルトの名無しさん
2009/07/14(火) 19:29:38コンパイルスタック指定 1000000で下記のような出力に。
[00130000 00126000]
p=0012FF60
dat p=001177DB
dat p=000FF047
dat p=000E68B3
dat p=000CE11F
dat p=000B598B
dat p=0009D1F7
dat p=00084A63
dat p=0006C2CF
dat p=00053B3B
dat p=0003B3A7 <−ここの次でスタックオーバーフロー
プログラムは、下記ですが、出力が納得できない…
NT_TIB* getTIB(void) {
NT_TIB* pTib;
__asm {
mov eax, dword ptr FS:[18H];
mov pTib, eax;
}
return pTib;
}
void testp() {
char buf[100000]; char dat;
printf("dat p=%p\n",&dat); testp();
}
int _tmain(int argc, _TCHAR* argv[]) {
NT_TIB* pTIB = getTIB();
printf("[%08x %08x]\n", pTIB->StackBase, pTIB->StackLimit);
printf("p=%p\n",&pTIB); testp(); return 0;
}
0182デフォルトの名無しさん
2009/07/14(火) 19:31:58[00130000 00126000]
のStackBase,とStackLimitの範囲が1000000も無い、
スタックオーバフローは約1000000でオーバーしているので正しい
なぜなんだろう?
0183デフォルトの名無しさん
2009/07/14(火) 19:32:48VisualStudioでC++のプロジェクトを作ると、以下のようなグローバル変数が自動的に宣言されますが、
TCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト
ここにTCHAR型のローカル変数と同じ方法で文字列を代入しようとすると
コンパイルエラーになってしまいます。
TCHAR test[MAX_LOADSTRING] = _T("これは大丈夫");
szTitle = _T("エラーになる");
同じ型の変数を宣言しているつもりですが、結果が違ってしまうのはどうしてでしょう?
0184デフォルトの名無しさん
2009/07/14(火) 19:34:34C言語の入門書本屋で買ってこい
0185181
2009/07/14(火) 19:36:01あったが、それしかないのか? ちょっとやってみる。
0186デフォルトの名無しさん
2009/07/14(火) 19:37:56だからぁ、>176じゃダメなの?
0187デフォルトの名無しさん
2009/07/14(火) 19:40:47/RTC、/GSの事なら全くの別物
0188デフォルトの名無しさん
2009/07/14(火) 19:47:21コミット済みのサイズだからじゃね
0189181
2009/07/14(火) 20:07:36コミットのサイズ変えても、出力は変わらず。
う〜〜ん、例外検出がなかなかうまくいかず。
それにわざとエラー出して、サイズ検出もなんとなく納得できないし、
結局、固定で持ったほうが早そうな気がしてきました。
どうせコンパイルするんだし…
皆さんありがとうございました。
0190181
2009/07/14(火) 20:18:00やはりコミットで増えるようですね。最大値は相変わらず不明ですが。
[00130000 00126000]
p=0012FF50
[00130000 00117000]
dat p=001177B7
[00130000 000fe000]
dat p=000FF003
[00130000 000e6000]
dat p=000E684F
[00130000 000cd000]
dat p=000CE09B
[00130000 000b5000]
dat p=000B58E7
[00130000 0009c000]
dat p=0009D133
[00130000 00084000]
dat p=0008497F
[00130000 0006b000]
dat p=0006C1CB
[00130000 00053000]
dat p=00053A17
[00130000 0003b000]
dat p=0003B263
この後オーバーフロー
0191デフォルトの名無しさん
2009/07/15(水) 09:39:53馬鹿だから答えられないのですね。
書き込むな!クズ!
0192デフォルトの名無しさん
2009/07/15(水) 09:55:29その一言でキミの相手するやつは激減したよ。
いつもそんな調子だから人に相手されなくなるんだよ。
0193デフォルトの名無しさん
2009/07/15(水) 09:59:10文字列もどきの処理は、型によってケースバイケースでわかりにくいからねえ。
もうちょっとマクロとか関数が整理されてたらよかったんだけど。
そういうのの一覧が載った本を見たほうが早いと俺も思うよ。
さもなくば、文字列がもうちょっと簡単に使えるC#あたりに乗り換えるか。
その場合は
_tcscpy_s(szTitle, _T("てすと"));
ただしコピー先のサイズは固定で自動的に拡張してくれないから
文字列の長さがコピー先の容量を超えてると代入に失敗する。
コンパイル時か実行時か、どちらか容量オーバーが発見されたタイミングでエラーが出る。
0194デフォルトの名無しさん
2009/07/15(水) 10:13:06馬鹿がうつった?
0195デフォルトの名無しさん
2009/07/15(水) 10:49:59やらないのはできないのと一緒だって
早くハロワ行けよ
0196デフォルトの名無しさん
2009/07/15(水) 23:35:30デバッグ用に使ってるのを見かけたんですがやり方が書いてありませんでした
0197デフォルトの名無しさん
2009/07/16(木) 00:15:46OutputDebugString
0198デフォルトの名無しさん
2009/07/16(木) 00:23:190199デフォルトの名無しさん
2009/07/16(木) 00:33:230200デフォルトの名無しさん
2009/07/17(金) 15:35:370201デフォルトの名無しさん
2009/07/17(金) 15:53:470202デフォルトの名無しさん
2009/07/17(金) 17:24:34標準でSuppressUnmanagedCodeSecurityAttributeが付くので、
ネイティブコードの呼出はC++が速いらしい。
(もちろん、C#やVB.NETでもSuppressUnmanagedCodeSecurityAttributeを使えばその点は同じになる)
0203デフォルトの名無しさん
2009/07/18(土) 00:14:35レスありがとう
0204デフォルトの名無しさん
2009/07/18(土) 00:15:22詳しくありがとうございます
0205デフォルトの名無しさん
2009/07/19(日) 04:41:53Visual Studio 2008 Express を使ってみたんだ
インテリセンスがすごくよくって
関数を使おうと書き始めると候補が出てきて途中でエンター押すと
全部書いてくれてすごく良いんだ
この機能って2008になってから出来たの?
0206デフォルトの名無しさん
2009/07/19(日) 08:11:470207デフォルトの名無しさん
2009/07/19(日) 10:23:250208デフォルトの名無しさん
2009/07/19(日) 13:40:50キーボード5つぐらいしか押してないのに50文字ぐらいの長い命令文がいつのまにか入力できてる。
プロパティとメソッドの区別も一発でわかるようにアイコンが付いてるし、自分で作ったクラスまで
自動的に登録されてるし。
0209デフォルトの名無しさん
2009/07/19(日) 13:43:51たまに触ると本当に羨ましく感じる。
0210デフォルトの名無しさん
2009/07/19(日) 13:44:520211デフォルトの名無しさん
2009/07/19(日) 13:47:33webは作れないんだよね
0212デフォルトの名無しさん
2009/07/19(日) 14:04:43クラスビューでプロパティを選択して、
イベント、オーバーライド、メッセージを選択しても
全く表示されなくなりました。
どうしてなんでしょうか?
新規作成時、直後は問題ないのですが、開発途中で、
表示が消えるので、新たに関数などの追加ができなくなって困っています。
直し方はあるのでしょうか?
0213デフォルトの名無しさん
2009/07/19(日) 14:05:27CGIは?
0214デフォルトの名無しさん
2009/07/19(日) 15:27:05うっかりプロジェクトファイルとか消してない?
鯖に共有フォルダ作って共同開発とかしてると、たまに誰かか勝手にファイルを移動しちゃうことがあって困る。
0215デフォルトの名無しさん
2009/07/19(日) 19:02:40EEじゃなけりゃAnkhSVNも
0216デフォルトの名無しさん
2009/07/19(日) 20:01:26自己解決?しました。
正しい、やりかたではないと思いますが、
ソリューションファイル等があるフォルダにある
VC++ Intellisense Database
のファイルを削除して、もう一度、VS2008を起動させて、
ソリューションファイルを開くと、自動的にもう一度、
VC++ Intellisense Databaseファイルが作られるので、
それで、直りました。
正しいか不明だけどね。
お騒がせしました。
0217デフォルトの名無しさん
2009/07/19(日) 20:02:560218デフォルトの名無しさん
2009/07/19(日) 20:44:020219デフォルトの名無しさん
2009/07/19(日) 21:06:580220デフォルトの名無しさん
2009/07/19(日) 21:46:12などと打ったときに最後の::の後を自動補完する候補が出るときと出ないときがあるんですが
これを毎回出すようにするにはどうすればいいんでしょうか?
0221デフォルトの名無しさん
2009/07/19(日) 22:29:18一応CTRL+SPACEを押せば強制的に候補一覧(候補がひとつしかないときは一気に確定)できるけど
必ずしも成功するとは限らないところがVC++のいいところ。
これがVBやVC#、今はなきVJ++ではほぼ100%確実に候補が出る。
で、開発者いわく、インテリセンスは結局のところ「コンパイラそのもの」なんだそうで、
リアルタイムコンパイルしながら候補を絞り込んでるわけだけど、
C++は言語が複雑すぎてちゃんとできねーんだとさ。
0222デフォルトの名無しさん
2009/07/19(日) 22:49:340223デフォルトの名無しさん
2009/07/22(水) 15:46:08環境は「VC2008ExpEdition + .net」です
Bitmap^ abcimg=gcnew Bitmap(300, 400);
Graphics^ abcgraf=Graphics::FromImage(abcimg);
abcgraf->FillRectangle(Brushes::Black, 0, 0, abcimg->Width, abcimg->Height);
pictureBox1->Image= abcimg;
で作られた画像の真ん中にナスのような形のグラフが書き込まれます。
そのグラフを白で塗りつぶして面積を求めたいのですが、塗りつぶしがうまくいきません
別のやり方があれば教えてください
Color abcclr;
for(j=0;j<400;j++){
for(i=0;i<300;i++){
abcclr=abcimg->GetPixel(i,j);
Byte r=abcclr.R;Byte g=abcclr.G;Byte b=abcclr.B;
if(r>1){
if(mode==0){//最初の境界を発見した!
bforx=i;bfory=j;mode=1;//フラグを立てて管理
//↓は最初境界の終わりを探す
while(r==0){abcclr=abcimg->GetPixel(i+1,j);r=abcclr.R;g=abcclr.G;b=abcclr.B;i++;}
}else{//フラグ立ってるので現在値まで塗りつぶしのために白い線を引いてフラグを消す
abcgraf->DrawLine(Pens::White,bforx,bfory,i,j);mode=0;}
}// (R>1)節の終わり
abcclr=Color::FromArgb(r,g,b);
abcimg->SetPixel(i,j,abcclr);
}//iのforループの終わり
mode=0;
}//jのforループ終わり
0224デフォルトの名無しさん
2009/07/22(水) 16:39:580225デフォルトの名無しさん
2009/07/22(水) 17:04:05途中まではうまくいくが、グラデーションのように黒い線(塗りつぶしの失敗)が入ります
######
######
########
# #
# #
##########
のような感じに。下手な説明&AAですみません。
0226デフォルトの名無しさん
2009/07/22(水) 17:24:26画面キャプチャしてUPするなり、他人に伝える工夫と努力が必要。
0227デフォルトの名無しさん
2009/07/22(水) 21:59:48それ仮に動いたとして使いものになるのか?
0228デフォルトの名無しさん
2009/07/22(水) 23:02:030229デフォルトの名無しさん
2009/07/22(水) 23:09:230230デフォルトの名無しさん
2009/07/22(水) 23:26:41そうじゃなくてC/C++から勉強したいならVCというよりC/C++の入門書だし
C/C++スレで質問した方がいい。
0231デフォルトの名無しさん
2009/07/22(水) 23:35:31まあ
>>230
の言う通り過ぎて付け加えることがない。
0232デフォルトの名無しさん
2009/07/22(水) 23:47:17IDEの基本から上手な使い方みたいなことが書いてある本ってないよね
プロパティとかどう弄ったらよくなるのかとかいまいちわからない
0233デフォルトの名無しさん
2009/07/23(木) 01:49:59なるほどVC++の初心者に使いかたを教えるスレだったんですね気づきませんでした
C/C++の知識が無いプログラミング初心者なんです
それでVC++インスコしてネットや本屋で教本の類を幾つか読んでみたんですけどVC++を使って教えてるのが見つからなかったんですよ
全くの初心者なので用語の意味とか全然分からないし本で言っている事がVC++の機能のどれを指してるのか、どこにあるのか分からなかったりと
なかなか先に進まないのでVC++2008を使った解説本が無いかと思ったんですがお勧めの物ありませんかね?
それともやっぱりC/C++スレで聞いたほうが良いですかね?
0234デフォルトの名無しさん
2009/07/23(木) 02:04:00Cを理解する頃には意味不明なところがしっかりわかるようになるはず
0235デフォルトの名無しさん
2009/07/23(木) 02:20:19そういう意味でのVCではなくて、プロジェクトの作ってビルド・実行するとかデバッガの使い方について知りたいんだと思う。
0236デフォルトの名無しさん
2009/07/23(木) 02:27:47ただし、C/C++の用語がわからんと理解できんだろーから、必要なのはC/C++の入門書ということになる。
したがってスレ違い。
0237223
2009/07/23(木) 10:35:21http://upload.jpn.ph/ にUPしました
u44616.jpg というファイル名です
左が線だけの状況。実は点なんですが、DrawLineで繋げてます。
閉鎖空間であることは確認済みです
右が223のプログラムで塗りつぶそうとした結果です
どうみても失敗してます。原因がわからなくて悩んでました
0238デフォルトの名無しさん
2009/07/23(木) 11:31:24画像のアドレスはこういうふうに書けば回答者がすぐに確認できる
ttp://upload.jpn.ph/upload/img/u44616.jpg
それからソースが汚すぎる。
ちゃんと式の終わりごとに改行して演算子の前後にスペースを入れて
インデントをつければ「forの終わり」とかコメントをいちいち
書く必要がなくなる。たとえばこんなふう
int i, j, k;
for (i = 0; i < 10; i++)
{
for (i = 0; i < 10; i++)
{
k = i + j;
printf("%d ", k);
}
}
ちゃんと調べたわけじゃないけど、whileの中で変数 i をいじってるのが
原因じゃないかって希ガス
0239デフォルトの名無しさん
2009/07/23(木) 11:56:14追加したのは、変数宣言と、DrawLineでテスト用の画像をてきとーに作る部分だけ
int i, j, mode;
int bforx, bfory;
個人的には、いちいちRGBに分解した意味がわかんなかったけどもな
0240デフォルトの名無しさん
2009/07/23(木) 12:14:24白いピクセルが続いた時におかしくなる
白いピクセルの連続が偶数個だと、そのラインは塗られないから
黒く残ってシマシマになる
0241デフォルトの名無しさん
2009/07/23(木) 12:16:380242デフォルトの名無しさん
2009/07/23(木) 12:36:160243223
2009/07/23(木) 13:08:23一応、白が続いた時用にwhileで境界線である白の終わりを判断して飛ばしてます。
while(r==0){abcclr=abcimg->GetPixel(i+1,j);r=abcclr.R;i++;}
>240 さんの言うところが調子悪かったのですね。いじってみます。
RGBに分けたのは、今後の発展を考えてでありまだ何も実装してません。
0244デフォルトの名無しさん
2009/07/23(木) 13:30:05何が原因のものなのでしょうか
0245デフォルトの名無しさん
2009/07/23(木) 13:40:38ヘッダのインクルード忘れ。
ライブラリのリンク忘れ。
0246デフォルトの名無しさん
2009/07/23(木) 14:00:33だから、改行とインデントはちゃんと入れろと言ってるのに
while (r == 0)
{
abcclr = abcimg->GetPixel(i + 1, j);
r = abcclr.R;
i++;
}
0247デフォルトの名無しさん
2009/07/23(木) 14:30:08void CTest::OnButton1()
{処理}
void CTest::OnButton2()
{処理}
上のようなプログラムはクラスウィザードで出来ますが
void CTest::OnButton1()
{関数();}
void CTest::OnButton2()
{関数();}
void 関数()
{
処理
}
処理にUpdateData()などCDiaLogクラスの関数(メンバ)を使ってるから
エラーになります。ボタンを押す、などのイベントがあるなら関数を
作れますが、CTestにアクセスできる空の関数を作るにはどうしたら
良いですか?
0248デフォルトの名無しさん
2009/07/23(木) 14:55:05クラスウィザードで作れるでよ
0249デフォルトの名無しさん
2009/07/23(木) 14:55:23void CTest::関数() // CTest のメンバ関数にすれば、処理にUpdateData() してもアクセス違反にならない。
{
処理
}
0250デフォルトの名無しさん
2009/07/23(木) 15:27:47クラスウィザードでのやり方がわからないので最初に249の方法
試したら出来ました。サンクス。
0251デフォルトの名無しさん
2009/07/23(木) 21:43:05「1>cl : コマンド ライン error D8016 : コマンド ライン オプション '/MTd' と '/clr' は同時に指定できません」
と出てコンパイルエラーが出ます。この二つは併用できないと思っていいんでしょうか??
0252デフォルトの名無しさん
2009/07/23(木) 21:54:08はい。DLL版CRT使いましょう。
■ このスレッドは過去ログ倉庫に格納されています