★初心者にVisual C++を教えるスレ★ Part18
1 :
◆Manna2uCLg :
2005/04/15(金) 13:33:14
過去スレの書き込み時に 「httpが多すぎ」 と警告されちまったので、 h 削ってあります。
質問 class A : public CObject{ virtual void Serialize( CArchive& ar ) ; } class B : public CObject{ virtual void Serialize( CArchive& ar ) ; } template< typename DATA > class CM : public CObject { private: CMap< int, int ,DATA, DATA > m_map; public: virtual void Serialize( CArchive& ar ) ; } CM< A > CM_A; CM< B > CM_B; template < typename DATA > class CN : public CObject { private: CArray < DATA, DATA > m_array; public: virtual void Serialize( CArchive& ar ) ; } CN < CM_A > CN_A; CN < CM_B > CN_B;
このような構成でシリアル化を行いたいのですが うまくできません。 どのように行えばよいか教えてください。
うまくいかない、を説明するところから始めようか。
各クラスに DECLARE_SERIAL( A ) IMPLEMENT_SERIAL( A, CObject, 1 ) と記述すればよいと思っていたのですが DECLARE_SERIAL( CN ) IMPLEMENT_SERIAL( CN, CObject, 1 ) と記入してもコンパイルエラーとなりますよね? 「クラスのテンプレート名で仮引数リストの指定がありません。」といわれます。 どのように記述すればいいのかが分かりません。 初歩的ですみません。。。
全然初歩的じゃない。 これ実現しようとすると果てしなく面倒なことになりそう。 つか不可能かもしれん。
そうなんですか。。。 地道に複数作ったほうが楽かもしれないですね。。。 CMapのArrayをもったクラスをつくりたかったのですが 蚤の脳ではできません。。。
14 :
デフォルトの名無しさん :2005/04/15(金) 23:15:46
質問なんだけど、.NETにはClassWizardはないのかな?
前スレにぬるぽ貼ったの誰だ
struct A { void func(int) {} }; struct B : public A { B() { func(0); } // (a) void func() {} }; A a; a.func(0); // (b) (a)のところで「C2660: 'func' : 関数が不正な 1 個の実引数をともなって呼び出されました」となります。 引数からA::funcが呼ばれることはわかると思うのですが、A::func(0)としてやらなければなりませんでした。 ところが(b)の方はそのまま通ります。 どういう意図でこういうことになっているのでしょうか?
>>16 B::funcがA::funcを隠している。
Bの中にusing A::func;を書いてみろ
18 :
16 :2005/04/16(土) 11:51:00
>>17 using A::func;を書いたらB::func()の方がC2660で呼べなくなりました。
つかクラス内からはA::funcが隠蔽されて、外からは両方見えるというのはどうしてなのでしょうか?
19 :
16 :2005/04/16(土) 11:57:18
勘違いでした。 B b; と書いたつもりが A a; となってました。 BのインスタンスからはA::funcは隠蔽されてますね。 失礼しました。
ダイアログベースでランチャーを作っているのですが、どうにも分からないことがあります。 ドラッグされたファイルを受け取って、そのファイルのアイコンをボタンに描画したいと思っているのですが、 アイコンの取得の仕方、描画の仕方はどのようにすれば良いのでしょうか? HICON hIcon = ExtractIcon(AfxGetInstanceHandle(),path,0); // pathはファイルのフルパス tipsサイトをうろついていたらこれでアイコンの取得ができるという説明を見かけたのですが、 あっていますでしょうか? ボタンへの描画についてはオーナードローという方法でやればいいようなのですが、 どうにも要領がつかめませんorz こうすればいい、というやり方がありましたらよろしくお願いします。
21 :
デフォルトの名無しさん :2005/04/16(土) 14:11:24
すごく基本的な質問なのでしょうが VC++でも .NETであったりMFCであったり空のプロジェクト生成であったりする違いは ただ単にそれぞれがカバーしているライブラリの範囲の違いという認識であってますでしょうか。 具体的には、MFC使ったら、.NETに収録されてるクラス群は利用できない。 空のプロジェクトを生成した場合、MFC、.NETで使えるクラス群は利用できない。 こういう認識であってますか。 ここ勘違いしてるとかあったら指摘していただけるとうれしいです。
IDEの話でなら雛形ソースの作成の違いだよ。 空プロジェクト作成後にMFC用に自分で全部書いてもいいし
23 :
21 :2005/04/16(土) 14:22:52
>>22 アドバイスありがとうございます。
>IDEの話でなら
そうです。Visual C++ the Spoke 使ってます。
プロジェクトを生成したら作成されるソースの違いなだけというわけですね。
>空プロジェクト作成後にMFC用に自分で全部書いてもいいし
こうすれば、空プロジェクトを生成してもMFCの提供するクラス群を使うことができると。
24 :
デフォルトの名無しさん :2005/04/16(土) 17:34:50
リリースモードでコンパイルして実行すると(要はF5キーを押すと、ってことです)、 以下のようなメッセージが出てアプリが実行できません。 シンボル情報なし "hoge.exe"にはデバッグ情報が含まれていません(シンボルが読み込まれていません。) デバッグを実行するにはOKを押してください。 指示通りにOKを押しても、何も反応がなく、アプリも実行されません。 プロジェクトの設定のどこかが変わってしまったためだと思うのですが、これって どうやれば直るんでしょうか・・・
25 :
デフォルトの名無しさん :2005/04/16(土) 17:41:45
それはデバッグ実行してるから
26 :
デフォルトの名無しさん :2005/04/16(土) 20:28:12
統合開発環境で、.NETを選択してプロジェクトを生成したらフォームが作成されて フォームデザイナを使ってWindowsのインターフェース部分を作りながら、コード書いていく という便利な作り方ができますが MFCや、空でプロジェクトを生成した場合、基本的なコードだけが生成されてフォームは どこにも見当たりません。 フォームデザイナって.NETを選択して生成した場合にのみ使用できるものなのでしょうか。 それとも、MFCや空でもどこかいじればフォームデザイナ使えるのでしょうか。
はぁ?
ひぃ!
MFCで一度もFORM見たこと無い(´・ω・`)
30 :
26 :2005/04/16(土) 21:52:44
はぁ?とかひぃ!とか
>>29 とか言われるということはMFCについて根本的に何か勘違いしてるようですね。
.NETしかいじったことなかったのですが、一通り参考書やり終わったので自分でアイデアを出して
簡単なアプリを作ろうと思ったのよ。
で、そのアプリに、jpeg画像を表示する機能をつけようとしていたところ、CImageというクラスを発見。
ところがCImageは、MFCが提供するクラスらしい。
いつものように.NETを選択してプロジェクトを生成して作り始めたから
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxv_w32.h(18):
fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
こんなエラーが1つ表示されて先にすすめない。
「windows.hは、既にインクルードされてて、MFCアプリには必ずしもwindows.hは必要ない」
windows.h忘れてるよ。なら、つけたせばいいんだろうけど。
必要ないっていっても、ソースコードには#include "windows.h"なんて記述はどこにもないから
削りようもないし、しょうがないから、MFC選択してプロジェクト生成させて1から作り直したら
いいんじゃないかと考え付いたのよ。
ところがいざMFC選択して生成してみたところ、基本的なコードだけが生成されて、フォーム
らしきものは見当たらない。
なので、MFCはフォームデザイナ使えないのか。と思ったわけです。
MFC選択してプロジェクト生成させればCImageクラスがあっさり使えるんじゃないかと思ったのですが。
こういう場合、.NETで使える。別の画像表示クラスを探したほうが早いでしょうか。
CImageは使い方簡単そうだったから採用したんですが。
>>30 おまえが言うフォームに近いものは
ダイアログベースのアプリかもしれない
33 :
26 :2005/04/16(土) 22:13:25
CImageクラスは
#include "atlimage.h"
#include "afxwin.h"
をインクルードして
CImage img;
img.Load("sample.jpg");
CDC *pDC = CDC::FromHandle( img.GetDC() );
cdc.BitBlt( 0, 0, img.GetWidth(), img.GetHeight(), pDC, 0, 0, SRCCOPY );
img.ReleaseDC();
書いて、上のレスに記述したエラーが発生。
しょうがないから、他を探すということで
http://wisdom.sakura.ne.jp/system/msnet/msnet_win13.html を参考に
Graphics g = e.Graphics;
Image img = new Bitmap("sample.jpg");
g.DrawImage(img , 0 , 0);
に書き換えたけど、なんとこれも上のレスに記述した同じエラーが発生した。
public static void Main(string[] args) {
Application.Run(new WinMain());
この部分の記述がいるのか。
Graphics g = g.Graphics;の部分はFormメソッドの外に書かれてる。
メニューの開くを押したら表示されるようにしたいのに(T T)
クラス発見しても全然使いこなせない。基本的なことがどうも消化しきれてないっぽい。
悔しい。
というか中途半端に手を出さずに 基本から勉強した方がいいんじゃないだろうか
35 :
26 :2005/04/16(土) 22:33:20
皆さんどうもアドバイスありがとう。
>>32 他の件でググって読んだページにたまたまMFCに関する記述が書いてあることがあって
そういえばMFCの記述があるところにダイアログベースがどうのとか書いてあった記憶がある。
MFCでプロジェクト生成するとダイアログベースのアプリしか作れないということなのかな。
単に画像表示させるだけのアプリだから、ダイアログで十分だなとは思うけど。
もうわけがわからなくなってきた。
開発環境の操作方法を勉強しながらアプリも1本作るという内容の参考書を一通りやって
さあ、自分で作ってみるぞと思ったものの。
用意されてるクラスを使うだけでもこの有様だから。
C++は、.NETとかMFCとかややこしい。
ここらへんもっとつっこんで勉強したほうがいいかもと思った。
ググって見つけたサンプルコードそのままコピペしても必ずといっていいほどエラーがでる。
http://wisdom.sakura.ne.jp/system/msnet/index.html の解説も.NETだけど。よくみたらフォームとか部品を自分で記述してるし。
.NETって書いてるから、これ参考にしたら解決するだろうと思ったのに(T T)
フォームデザイナで部品を自分でフォームにドラッグしていってちょちょいと作ってって方法で
やったから。他の手法で作ったものを参考にしても自分のアプリに応用できない。
>>34 さんがいうように、自分で考えたアプリを作ってみるという段階じゃないのかも。
統合開発環境の操作覚えて、MSDNやgoogleで欲しい機能を実現できるクラスを探して、使い方見て
自分のアプリのコードに貼り付ければいけると思ったのに(T T)
まずは.NETとWin32との関係について勉強しよう
37 :
26 :2005/04/16(土) 23:27:33
>>36 どこらへんを勉強すればいいのか親切に教えてくれてありがとう。
実は、とはいってもどこらへんから優先的に学習すればいいの?という疑問がわいてたので
RADできるのは、リソースで管理できる範囲だけ。 したがって、ダイアログはドラッグアンドドロップで作れるが、 それ以外のwindowアプリケーションは、コード書くしかない。 そういう仕様。
26は、C# .NET のほうが向いている。絶対。
40 :
26 :2005/04/17(日) 00:11:49
皆さんどうもアドバイスありがとう。
>>38 MFCや空だと、どこ探してもフォームデザイナ使えないと思ったら仕様なんですね。
そもそも、GUI部品をゴリゴリコード書くのが面倒くさいから、統合開発環境買ったという
いきさつがあるので。どうしてもGUI部品を楽に作りたいと思ったら.NET使うしかないということか。
>>39 今回の件でC++って、.NET MFC とかいろいろあって覚えるまでがちょっと大変とわかった。
C#って.NETだから、一度どれかの参考書なりサイトでマスターしてしまえば
クラス調べるときに、C++のように、これはMFCの提供するクラスだから…、とか
これは空で作ったものっぽいから…。とかいちいち考える必要ないだろうなとは思う。
自分の考えたアプリが完成すればいいわけだから、完成は早いにこしたことはないし
作りやすいにこしたことないし、調べやすいにこしたことはないと思う。
C#がそれを満たしてくれる言語なのかは、やってみなければわからない部分はあると思うけど。
>>39 さんの。向いている。「絶対」と。指摘してくれてるわけだから
使用言語をC#に変えてみようかと思います。C#の方が作る過程もスマートなんじゃないかと
思えてきた。
>GUI部品をゴリゴリコード書くのが面倒くさい ならC#かVBがいいかと
42 :
26 :2005/04/17(日) 12:56:27
>>41 アドバイスありがとう。
VBも.NETになってからそこのところがどうなったかはわかりませんが
VBはかゆいところに手が届かなそうといったイメージがあるのでC#にします。
プログラム童貞ですが、まず何からしたらいいでしょうか?
あるメニューボタンを押したら、そのウィンドウを常に前面に 表示させるようにするプログラムを作りたいのですが、 どのように作ればよいのか、アドバイスお願いできませぬでしょうか・・・
対象のウィンドウにSetWindowPosでいけるんじゃないかい? MDIの場合はダメかもわからんです。
>>47 さんのお陰でいいサンプルも見つかりました。
ありがとうございました m(_ _)m
2色しか使っていないビットマップをインポートしても ビットマップは正しくインポートされましたが、ビットマップは256色以上含んでいるためビットマップエディタへ読み込めません と出るのですが、どういうことでしょうか?表示はできるみたいなんですが・・・ また、リソースビットマップの透過はどうやるのでしょうか?
DLLにある関数をしょっちゅう使いたい場合でも やっぱり使う直前に::LoadLibrary()して、使い終わったら即::FreeLibrary()しなきゃ なりませんか? 自前のアプリの初期化関数(OnInitDialog()とか)でLoadLibrary()してから メンバ変数に関数ポインタせっとしてメソッドで使いまくり、終了するときに OnDestroy()で解放できたらオーバーヘッド軽くなりそうな気がするんですが。
>>50 使う直前にLoadLibraryして、使い終わったら即FreeLibraryなんて、誰に教わったの?
プロセス内で最初に1回LoadLibraryしたら、それっきりでいい。
FreeLibraryはしなくてもいい。
それで問題があるようなら、そのDLLの作りのほうがマズイよ。
52 :
51 :2005/04/18(月) 08:24:40
というか、面倒くさいから、インポートライブラリ使えばいいと思う。
>>49 保存されてるパレットが256色以上になってるんじゃない?
そのビットマップのプロパティを見ると分かるんじゃなかったかな。
54 :
デフォルトの名無しさん :2005/04/18(月) 13:12:10
メニューアイテムのenable、disableを切り替えるにはどうすればいいですか?
VC++.NET使ってるんですが VC++6とまったくインターフェースに互換性がなくて困ってます(なんですかソルーションて) デフォルトのコンパイル/リンクオプションはどこで設定すればいいんでしょうか また、プロジェクト専用のオプションはどこで設定すればいいんでしょう 教えてください
もう一週間以上いじってます なんかIE触ってるみたいで気持ち悪いです… 汎用性ばかり重視して操作性を削るってなに考えてるんだMSは…
一週間もいじってて未だにリンクオプションすら 見っけられないってちょっとおかしいぞ。 ホントにVC++6使ってのか? 俺も最初は戸惑ったけど、すぐに分かったぞ。
慣れれば、.NETのほうが使いやすい
プロジェクトごとのオプションは見つけたんですけど チェックボックスとかじゃなくて手打ちなんですがそれで正解ですか プロジェクト作るたびにわざわざ/I とか /MTとか打ちたくないんです インクルードパスなんて決まってるしマルチスレッドアプリしか作らないし
本当にVC使っているのか甚だ疑問に思えてきた・・・
まじで!? 学校に入ってるやつですよ
64 :
デフォルトの名無しさん :2005/04/18(月) 19:00:30
促されるようにVC++.NETを導入したんですが、ちょっと教えてください。 Cの勉強で最初に作るようなごくごく簡単な(Hello,worldの表示)プログラムをCで組みたいのですが プログラムに間違いは無いにも拘らずエラーが出てビルドできません。 実行するビルド コマンド ラインがありません。 メイクファイル プロジェクト動作を実行しています。 [プロジェクト名] : error PRJ0003 : ' の起動中にエラーが発生しました。 実行するビルドコマンドラインがありません。 ↑ここが問題なのは分かっているのですが、どう対処して良いのか分かりません。 どなたか教えていただけないでしょうか。
ビルドコマンドラインを設定しろ
ボタンコントロールにドラッグアンドドロップしたいのですが、どうしたらいいか分からないです。 新規に『CButton』を継承したクラス『CMButton』を作成、そこにWM_DROPFILESをインプリメント(?)して、 ダイアログクラスにCMbutton型のオブジェクト『m_Button』を宣言。 そしてダイアログクラス内の『OnInitDialog()』で『m_Button.SubclassDlgItem(IDC_MBUTTON,this)』 を実行して、サブクラス化してみたのですが、 起動直後に『wincore.cpp』内の『ASSERT(FromHandlePermanent(hWndNew) == NULL);』の所でエラーが出ます。 なので『WindowProc』をオーバーライドして、『WM_CREATE』が送られたときにサブクラス化してみると、 エラーは出なくなったものの、ドラッグしても『CMButton』の『OnDropFiles』が機能しません。 お助けください…orz ●ヘッダファイル class CMButton :public CButton { public: CMButton(void); ~CMButton(void); protected: //{{AFX_MSG(CMButton) afx_msg void OnDropFiles(HDROP hDropInfo); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ●cppファイル BEGIN_MESSAGE_MAP(CMButton, CButton) //{{AFX_MSG_MAP(CMButton) ON_WM_DROPFILES() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CMButton::OnDropFiles(HDROP hDropInfo) { }
DragAcceptFiles
68 :
66 :2005/04/18(月) 21:11:35
>>67 レスありがとうございます。
書いていませんでしたが、 DragAcceptFiles() はダイアログクラス内の OnInitDialog() で宣言しています。
ボタンコントロールのプロパティの Accept Files も試してみましたが、どちらも機能しませんでした。
というかドラッグの受付自体は機能しているんですが、受け付けた後の
void CMButton::OnDropFiles(HDROP hDropInfo)
の処理が機能していないのです。
MessageBox()でメッセージを出したいのですが、 親クラスを指定しない場合はNullにするとあったので MessageBox(Null,"失敗しました","error",MB_ICONERROR | MB_OK); としたのですが、4つの引数を持つことはできませんと言われてコンパイルエラーとなります。 Nullは定義されていないのかと疑って MessageBox(,"失敗しました","error",MB_ICONERROR | MB_OK); MessageBox(\0,"失敗しました","error",MB_ICONERROR | MB_OK); MessageBox(0,"失敗しました","error",MB_ICONERROR | MB_OK); と試しましたがいずれもダメでした。 調べたところ引数は4つのハズなのですがどこがどう間違っているのでしょうか?
>>69 ::MessageBox(NULL, TEXT("失敗しました"), TEXT("error"), MB_ICONERROR | MB_OK);
>>69 MSDNライブラリでキーワード「MessageBox」を見れば、すぐわかるものを・・・。
> MessageBox(0,"失敗しました","error",MB_ICONERROR | MB_OK); これ通るだろ
>>72 CWnd::MessageBoxってオチだろ。
一応MSDNで調べてみて上記のような状態になってしまったので 質問させて頂きました。 MessageBox(0,"失敗しました","error",MB_ICONERROR | MB_OK); ではやはり引数が4つでエラーとなります 解決策としては第一引数を完全に省くことで何故かできました。 CWnd::MessageBox CWndに定義されているmessageBOxとそうでないものがあるようですね 調べてみます どうもです
Microsoft も紛らわしいモノを作ってくれたもんだ
>>74 なんでMSDNで調べたのにわからないの?
MessageBoxを見ようとすると、候補がずらずらと出てくるじゃないか。
Win32API、MFCのCWnd、MFCのCWindow、WFC、などなど。
自分が呼んでいるMessageBoxが、いったい何なのかくらい、把握しとけって。
つーか、C++わかってないだろ。VC++以前の問題だよ。
普通は、
>>70 さんの書き込みで理解できるぞ。
いや いいんです Win32API、MFCのCWnd、MFCのCWindow、WFC、などなど があることがわかっただけでも収穫でした Javaで簡単なiアプリを作ってただけだったのでcとwindowsAPIを 平行してやっているのですが、なかなか厳しいのが現状です
初心者にVisual C++を教えるのであって、C++を教えるのではない。
MFCがWin32APIと同じ名前のメソッドを持ってるのはVisual C++の話だろ。 とはいえ、::の意味を知らない質問者にも困るが・・・。
どうでもいいけど::←見えにくいな ::CreateWindow←だからって初心者スレらしく全角でもいいが コピペして動かないとか言われても困るか…
82 :
デフォルトの名無しさん :2005/04/19(火) 11:01:09
LoadLibraryしてGetProcAddressして得たC++関数を呼ぶ(実行する)には どうしたらいいですか? 例えば ?OpenSoftkeyPallete@@YAPAUHWND__@@PAU1@@Z の場合。
関数のアドレスが取得出来たって事は その関数の呼び出し方法に則って呼び出せば良いだけじゃない?
本来 return msg.wParam を返すとかなってますが、 エラーが起こったときは、return 1 じゃなくて、return 0 で良いのでしょうか?
86 :
デフォルトの名無しさん :2005/04/19(火) 21:06:27
VisualStudio.NETtheSpokePremiumを買って、初めてVisual C++.NETを使おう と思うのですが、何から始めていいのかわけがわかりません・・・ C++の入門書とVisualC++.NETの入門書一体どっちを買えばいいのですか?
NETの入門書でも買ってまずはHelloWorldから始めましょう。
88 :
デフォルトの名無しさん :2005/04/19(火) 21:28:08
>>87 でも、.NETの本ってC++がある程度わかった人向けのような気がする
のですが、気のせい?
そう思うなら実際本屋さんへ行って確かめてみた方がいいかも。
90 :
デフォルトの名無しさん :2005/04/19(火) 21:41:40
>>89 C++の本ではなく.NETの本じゃないとなにか困るんですか?
いやそういう意味じゃなく両方の本を比べてみたらって事。 NETの入門書の最初の方をみて書いてある内容自体何がなんだか サッパリならC++の入門書を買ったほうが良いだろうし。
.NET本のほうはIDEの使い方も一緒に載ってるんじゃない? 俺はvcvars32.batを利用してコマンドラインから使ってる。 ところで、どこかにVCのデバッガの解説サイトって無いですか?
93 :
デフォルトの名無しさん :2005/04/19(火) 21:59:46
94 :
デフォルトの名無しさん :2005/04/19(火) 23:03:46
ヘルプで十分という事じゃないかと
96 :
デフォルトの名無しさん :2005/04/19(火) 23:25:20
プログラムを覚えたいんですが、なにから始めたらいいでしょうか・・・
とりあえず、そんな質問をしないようになればいいと思う
>>86 C++の初心者ならC++の入門書
VC++.NETの初心者ならVC++.NETの入門書
どちらも初心者なら、両方の入門書をそれぞれ。
C++はプログラム言語
VC++.NETは処理系
この違いを区別せず、一度にやりましょう、という本もあるけどね。
100 :
デフォルトの名無しさん :2005/04/20(水) 16:02:23
質問です。環境は XP、VC++ 6.0 です。 MFC を使って組んでいます。 実行中に 「半角/全角」を押すと、辞書がONになり、 キーを押したときの処理を奪われてしまいます。 (生成したウィンドウの左上に打った文字が出てくる) これを回避するにはどうすればいいでしょうか。 「半角/全角」を押しても辞書がONにならないように……。 よろしくお願いします。
キーボードの設定を変える
>辞書がONになり ?辞書?
>>100 「プリプロセッサの定義」に「WINVER=0x040A」を追加
#include <imm.h>
#pragma comment(lib,"Imm32.lib")
ImmDisableIME(0);
>>101-103 IME をキーに調べればよかったんですね。
正常に動きました、ありがとうございました。
105 :
デフォルトの名無しさん :2005/04/20(水) 17:13:41
VC++.netでコンパイルする際にアセンブラコードを生成させたいのですが、どうやったらよいのか分かりません。 どなたか知ってる方居ましたら教えていただけないでしょうか。
>>105 プロジェクトのプロパティなどで、出力だかなんだかのタブにあるコンボボックスで
「アセンブラのみ」などを選択すればいい。
>>106 見つけることが出来ました。ありがとうございます。
追加なのですが、コマンドラインから実行する際にもオプションで出来るのでしょうか?
ついさっきインストールしたんだがソース窓に行がデフォルトで表示されて無いのな 小一時間探してるんだがみつからねorz たしけてorz
109 :
108 :2005/04/20(水) 17:42:45
書き忘れ .NETです
>>108 ツール->オプション->テキストエディタ
111 :
110 :2005/04/20(水) 17:47:57
->(Cなら)C/C++ ->全般
112 :
108 :2005/04/20(水) 17:49:42
即レスThx これがないとなんだか気持ち悪い…
うげ、あると気持ち悪いんだが。
もしかして、ROM-BASICでauto使う気分なんだろか。
>>107 設定画面をよく見よう。設定の脇に(/FA)とか書いてないか?
114 :
105 :2005/04/20(水) 19:35:23
>>113 /FAありました。とても助かりましたありがとうございました。
115 :
デフォルトの名無しさん :2005/04/20(水) 19:42:10
VC++.net 2003で使えるクラスで、DelphiのTBitmapのScanlineのように、 ビットマップダンプイメージをポインタでそのまま操作できる画像表示クラスはありますか?
Delphiスレで聞けば?
それはどうなんだろうか
>>115 無い。
DirectdrawのBltFastメソッド使え。
119 :
デフォルトの名無しさん :2005/04/21(木) 13:41:26
VC++.NET2003でビルドしたものをデバッグ実行したら、 >HEAP[○○.exe]: HEAP: Free Heap block 3e61d0 modified at 3e61f8 after it was freed このようなエラーが出ました。解放済みメモリにアクセスしたのが悪いのは わかりましたが、それがソースプログラムのどの部分が原因で起こっているのかを どうやって探せばいいのでしょうか? VS上の呼び出し履歴では ntdll.dll!7c989d18() のようなものばかり並んでいるので、 どのクラス・関数でこのエラーが起きたのかもわかりません。 ソースは300ファイルぐらいありますので、「怪しいところをよく眺めて見る」という 対処法ではとても苦しいです。 合理的な検出が出来るようなツールの使い方もしくは検出テクニックを 教えていただけたらありがたいです。 なお、STLport4.6.2,boost1.32を使用しています。
ここは「初心者に〜教えるスレ」ですよ
>>119 free()を検索して、引き数をその直後でNULLにしておく。
Ex.
free(foo);→free(foo);foo = NULL;
まともなエディタを使えば一気に全部置換できるからそんなに手間でもなかろう。
#VisualStudioしか使えない? がんばってね。
122 :
デフォルトの名無しさん :2005/04/21(木) 15:45:43
c++にもtryブロックがあると聞いたのですが。 tryが認識されません。 設定の例外処理もちゃんと有効にしているのですが。 もしかして、なにかincludeしないといけないのでしょうか? ちなみに私はVCコンソールアプリケーションでやっています。
>>122 >tryが認識されません。
具体的に。エラーメッセージが出たのならコピペ。
MSDN、C++入門書などを読んで、構文を先ず理解してください。 #ただ「tryが認識されません」と書かれても、あなたがどんなコードを書いたのか誰にもわかりませんから。
125 :
デフォルトの名無しさん :2005/04/21(木) 15:52:11
>>123 error C2065: 'try' : 定義されていない識別子です。
上記のエラーが出ました
127 :
デフォルトの名無しさん :2005/04/21(木) 16:05:03
>>126 コードがかなり長いので一部のみ
printf("\t文字を入力してください(zで終了):");
try{
gets(str12);/*値を取得してstr12に格納*/
}catch(...){
printf("エラー");
}
128 :
デフォルトの名無しさん :2005/04/21(木) 16:24:07
連レスすみません。 上記のコードでは一部過ぎてわからないと思うので全部の関数を丸ごと載せます。 長いので2回に分けて記述します void mo12(void){ char str12[5]={0};/*結果を入れてもらう変数*/ int strbl;/*strlenghtの結果を入れる為の変数*/ putchar('\n'); for(;1;){ printf("\t文字を入力してください(zで終了):"); try{ gets(str12);/*値を取得してstr12に格納*/ }catch(...){ printf("エラー"); break; }
129 :
デフォルトの名無しさん :2005/04/21(木) 16:25:13
連レスすみません。 上記のコードでは一部過ぎてわからないと思うので全部の関数を丸ごと載せます。 長いので2回に分けて記述します //str12[0]='z'; strbl=strlen(str12);//文字の最大数を測定 //元の値の表示 if(strbl>5){er=-3;error1(&er);break;} putchar('\t'); for(i=0;i<strbl;i++){printf("%X ",str12[i]);} printf("が入力されました\n\t"); for(count=0;count<strbl;count++){ er=mondai12(str12,count);/*文字をHEXコードに変換し、上位ビットと下位ビットを入れ替える関数*/ if(er<0){/*エラー処理*/error1(&er);}else{ //結果の表示 if(count==0){/*最初のみ表示*/printf("上位ビットと下位ビットを入れ替えると");} printf("%X ",er); } } printf("\n\n"); for(count=0;count<strbl;count++){/*大文字か小文字のzを検索該当する値があれば-5をerに代入*/ if(str12[count]==0x7a||str12[count]==0x5a){ er=-5;} } if(er==-5){break;} } }
Cとしてコンパイルしている悪寒。
131 :
デフォルトの名無しさん :2005/04/21(木) 16:28:28
ここC++のスレじゃないから C++の質問はC++のスレへどうぞ
132 :
デフォルトの名無しさん :2005/04/21(木) 16:31:22
>>131 このスレではないのなら別のスレで聞いてきます。
ありがとうございました
134 :
デフォルトの名無しさん :2005/04/21(木) 16:48:45
>>134 それじゃc++の機能が使える分けないじゃん。
*.cppに変えてもう一回試してみ。
136 :
デフォルトの名無しさん :2005/04/21(木) 16:55:55
>>135 .cppに変えたら機能しました。
教えていただきありがとうございました。
なんでこんな初心者が涌いてくるんだ?
初心者スレだった・・・
>>119 VC++に関係ない一般的なC言語での話は
>>121 さんがしてくれてるので、
私はVC++に特化した、より便利な方法を紹介します。
VC++にはデバッグ ヒープというものがあります。
そのようなエラーメッセージが出るのは、
問題を発見するためのデバッグ ヒープのメカニズムがうまく働いたからです。
まずは、MSDNライブラリで、
_CrtSetDbgFlag関数や、それに関連したところをあちこち読んでください。
具体的なやり方ですが・・・
そのエラーメッセージは、無効なヒープに書き込みの形跡があるかチェックした時に出ます。
チェックを行うのは、通常は、プログラムの終了時です。
(なので、その時のコールスタックを見ても、問題箇所はわかりません。)
そこで、
_CrtSetDbgFlag関数で_CRTDBG_CHECK_ALWAYS_DFを指定するか、
_CrtCheckMemoryをあちこちに挿入するなどして、
プログラム実行中に、ヒープのチェックをさせます。
そうすることで、どこまではチェックでエラーが出ず、
どこまで行くとチェックでエラーがでるかで、問題の範囲を絞りこむことができます。
便利のために、すべての関数の入り口と出口に、
FUNC_IN(funcname)、FUNC_OUT(retvalue)、といったマクロを仕込んでおくと、
いざという時に、チェックルーチン呼び出しを容易に仕掛けることができますよ。
ちなみに、毎回同じアドレスになるなら、デバッガでブレークポイントを張れば、
すぐに、そのアドレスに書き込んでいる箇所を発見できるかもしれません。
140 :
121 :2005/04/21(木) 18:47:43
141 :
139 :2005/04/21(木) 18:49:20
補足 VC++自体に、メモリリークやヒープエラーの検出機能があるわけだけど、 それを使うのが面倒ならば、 CompuwareのBoundsChecker のようなツールを使うと、ソースコードに手を入れずに、 同じような検出をしてくれます。 BoundsCheckerは単体売りもあるけど、他のツールとセットになったもののほうがお買い得。 無償バージョンアップの年間保守料金もあるけど、そんなにバージョンアップしないので、 毎回買うのと同じか、かえって高くつくので、予算計画が立てやすい以外にはメリットないかも。
142 :
139 :2005/04/21(木) 19:07:37
補足 もちろん、freeしたポインタをNULLにしておくのは、ぜひやるべきです。 さっくりNULLポインタ例外で問題箇所を発見できる可能性が高いですから。 問題は、ポインタをコピーして覚え続けている人がいる、ということです。 そういう場合に、デバッグ ヒープが必要になるんです。
ぬるぽおぉ
■━⊂( ・∀・) 彡 ガッ☆`Д´)ノ
#define free(p) (free(p), (p) = 0)
147 :
デフォルトの名無しさん :2005/04/22(金) 00:00:46
ifstreamのgetline()を使ってファイルを一行ずつ読み取りたいんですが、 一度に読み込むバッファ長を越えた行を読み込むと、eof()がきちんと認識されないみたいなんです。 例えば・・・ const int BUFLEN = 10; char buf[BUFLEN]; ifstream file("hoge.txt"); while ( file.eof() == false ) { file.getline(buf, BUFLEN); cout << buf << endl; } ↑では、10文字を越える文字数を読み込むと、その後は無限ループになってしまいます。 BUFLENを1000などの大きめの数字にしとけば問題ないですが・・・ これってgetline()の仕様なんでしょうか?
無料でダウンロードできるVisual C++ Toolkitと 市販のVisual C++はどう違うんでしょうか?
IDEが付くか付かないか
ATLとかMFCとかも
152 :
デフォルトの名無しさん :2005/04/22(金) 11:18:40
オーバーロードをしたいのですがうまくいきません、なぜでしょうか? エラーは、'func' : 2 のオーバーロードは 1 番目の引数を 'char' から要求の型に変換できません。(新しい機能 ; ヘルプを参照) と出ています コードが長い為一部省略します #include<stdio.h> #define RESULT_OK 0 int main(void){ char str3_1=61; char str3_2=62; func(str3_1,str3_2); } char func( char *buffp ){ char cnt=0; cnt++; return cnt; } char func( char *destp, char* srcp ){ char rtn = RESULT_OK; return rtn; }
>>152 うまくいってないのはオーバーロードじゃない。
char* 型の引数に char を指定して一体何をやりたいのかと。
154 :
デフォルトの名無しさん :2005/04/22(金) 11:38:58
>>153 すみません、一部訂正します。
func(str3_1,str3_2);
↓
func(&str3_1,&str3_2);
156 :
デフォルトの名無しさん :2005/04/22(金) 11:57:23
>>155 ここではだめですか?
ある意味初心者的な質問だと思うのですが。
>>156 ここでもいいけど、先ずはそのアホさ加減を何とかしてくれ。
>152のエラーメッセージでは、引き数がcharだと言っている。
実際コードもfunc(str3_1,...でcharを渡している。
ところが>154ではfunc(&str3_1,...だと言う。
それならば、>152のようなエラーメッセージになるはずがない。
159 :
デフォルトの名無しさん :2005/04/22(金) 12:24:11
>>158 すみません、実行してみたら、エラーが出なくなってました。
よく確認、しなくてすみませんでした。
お答えいただきありがとうございました。
スレ汚し! 二度と来るな!!
おいおい、>157には挨拶なしかい。 しかし、どうでもいいけど全貌を見たくなくなるような小汚いソースだな。
162 :
デフォルトの名無しさん :2005/04/22(金) 12:41:41
初心者って付けば、どんなスレでも構わない、なんて思わないでくれよ。 言語と標準ライブラリと処理系、この3つの区別くらいしてくれ。 というか、区別をしてない解説書を読むのはやめてくれ。
164 :
163 :2005/04/22(金) 19:09:30
もとい ×標準ライブラリ ○ライブラリ 標準ライブラリでも、サードパーティでもいいが、 このスレで扱うライブラリは、MFCやATLなど、Visual C++特有のものだろ。
そういう区別がつかない初心者を隔離する スレだとばかり思っていた2005春
166 :
デフォルトの名無しさん :2005/04/23(土) 08:40:29
昔プログラマをしていた者です。 ゲームが作りたくて、久しぶりにプログラムを組んだのですが、 いきなりLoadImage関数で詰まってしまっています。(SDKです) case WM_CREATE hbmp = (HBITMAP)LoadImage( hInstance, "gazou.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE ); // hInstanceはWinMainにて保存しています。NULLではありませんでした。 FormatMessageで調べると"パラメータが正しくありません"と返ってきてしまいます。 ヘルプを見てもどこが悪いか分かりません。 LoadImageのDesired引数等を変えたりして1、2時間この1行で悩んでいます。。 おまぬけな質問ですが、どなたか教えてくださいませ。
167 :
デフォルトの名無しさん :2005/04/23(土) 08:58:10
たった1、2時間か。もっと悩もうよ。
>>166 インスタンスハンドルはリソース用だからNULLでいいんじゃないか?
WM_CREATE内ではreinterpret_cast<CREATESTRUCT *>(lParam)->hInstanceで CreateWindowExを呼んだときに指定したインスタンスハンドルを入手できる。
LoadImageでファイルから画像を読み込む場合、HINSTANCEは「NULLでなければならない」
172 :
166 :2005/04/23(土) 10:58:31
>>167 昔散々やったことなので、時間が勿体無くて。。
他の人に聞くと一瞬で解決することが時々あるので質問させてもらいました。
>>168 リソースからロードする時はNULLで良い様な気がします。
>>169 WM_CREATEのlParamがCREATESTRUCT構造体へのポインタになってるんですね。
そういえばそんな記憶が。。
>>171 NULLでは駄目でした。
多くのレスありがとうございました。
もう少し悩んでみます。
P.S もしかして環境が悪いのでしょうか?
WindowsME&VC++6.0です。
173 :
デフォルトの名無しさん :2005/04/23(土) 11:00:42
>>170 詳しく
174 :
171 :2005/04/23(土) 12:07:04
>>172 ハァ?(゚д゚)
LR_LOADFROMFILE指定してんのに、何リソースからロードする時とかNULLではダメでしたとか言ってんの?(゚д゚)
MSDN見たりとか、GetLastError→FormatMessageしてエラー見たりとかしたのか?
時間が勿体無くてとか、他の人に聞くと一瞬で解決したとか
甘えすぎなんだよ
昔さんざんやったとか言う割にはお粗末だな
コボラーでな。
178 :
170 :2005/04/23(土) 12:23:34
VisualStudio以外のツールを求めてるなら完全なスレ違い。 よそへ行ってくれ
180 :
デフォルトの名無しさん :2005/04/23(土) 12:47:19
visual studio .net2003の質問はいいのかな。。 インテリセンスの事だけど。 CreateWindow( xxx, xxx...と書いている時にはパラメータヒントが出てるんだが 他の行等にフォーカスし、その後また続きを書き始めようとすると 最初の括弧を書かないと、今は表示されません。 これを引数の","(コンマ)を入力するとヒントが出てくるようにはなりませんかね? VBいぢっていた時は、これでヒントが出てきたので少し便利ですた。
>>181 そういやショートカットがあったな。。
さんくす。コンマじゃぁ無理っぽいけど、まぁ慣れるようにします。
184 :
デフォルトの名無しさん :2005/04/23(土) 17:00:17
1つのソリューションに複数のプロジェクトがある場合で、その中のプロジェクトのひとつを 別のソリューションに移動またはコピーしたいんですが、どうやればできますか?
>>184 コピー元ソリューションの対象プロジェクトファイル(*.vcproj)をコピー先ソリューションのディレクトリにコピー。
コピー先ソリューションで既存項目の追加で対象プロジェクト(勿論コピーしたもの)を追加。
#但し、プロジェクト内の各ファイルについては適宜コピーするかプロジェクトファイルをテキストエディタで編集して相対パスにする。
##プロジェクトファイルを直接複数のソリューションに追加するのはやめた方がいい(若しくはできない)が、ソースファイルは共有可能。
>>185 ありがとうございます。
IDE上からは出来ないんですね。
187 :
デフォルトの名無しさん :2005/04/23(土) 21:26:47
visual c++ 2003.net なんですが XPでプログラムを作ってw2000にファイルを 持って行きそこで実行するとエラーが出てしまいます。 「CLRエラー」ですとか「ほにゃららのハンドルされていない 例外が不明なモジュールです」などと表示されます。 原因はなんなのでしょうか?中学生ですけど教えてください。
猫でもわかる を参照にして、 LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: SetTimer(hWnd, ID_MYTIME, 1000, NULL); return TRUE;(略 のようなプログラムを作っていてたら、 ダイアログプロシージャの戻り値ってBOOLじゃなかったっけ? っていうような指摘を受けました。確かに戻り値は TRUE か FALSE ですけど、 どっちが正しいのですか?
コピペなり、入力支援で作ってください。 頭で覚えるとバグの元です。
>>187 Win2kに.Net Freamworkをインストールするか、あるいはVC側でマネージ拡張を使わないようにすればいいんじゃないのか?
>>188 ついでを言えば実際の値はBOOLでもLRESULTでも大差ない
BOOLはintのtypedefだしLRESULTはlongのtypedef
どちらも現時点で主流のWindowでは同じサイズ
>>191-192 WINDEF.h というのを見つけてんで、さっそく確認して見ますた。
そうだったんですね、BOOL っていうからてっきり1ビットかと思っていました。
大変勉強になりました。ありがとうございます。
>>193 そもそも1bitのデータ型なんか存在しないわけだが
>>194 bool bool bool bool bool bool bool
196 :
デフォルトの名無しさん :2005/04/24(日) 01:56:08
>>195 バーカ。
bool は Visual C++ 4.2 では 4 バイト、Visual C++ 5.0 以降では 1 バイト。
In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool
with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a
size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4,
while in Visual C++ 5.0 and later, the same call yields 1.
データ型とはちょっと違うが、ビットフィールド、ってのがあるよ。 で、多くのものが実際には32ビット幅なんだけど、 だからといって型を気にしなくていい、というわけじゃない。
198 :
デフォルトの名無しさん :2005/04/24(日) 05:15:12
結構検索してみたんだけど・・無かったので質問させて下さい vs.net2003でF1キーを押した時にヘルプが英語で表示されてしまいます。 日本語を優先的に表示させたいのですが、どこで設定すればいいのでしょうか・・? フィルタ・言語設定等を日本語に設定してみても、 F1キーでは英語ヘルプが表示されてしまいます。 検索すれば日本語ヘルプは出てくるんだけど・・はぁ。。
人に教えるレベルでもないのに 自惚れている馬鹿はどこにでもいる
おいおい、今更煽りかよ
202 :
デフォルトの名無しさん :2005/04/24(日) 11:57:04
187なのですが、同じXP上で動いていたプログラムが
今日になってエラーが出てしまうのは何が原因なのでしょうか?
w2kでも最初に実行した時はうまく動きましたが、
次からエラーになってしまいます。
>>190 さんのおっしゃる通り、このパソコンには
.net freamworkが入ってますし、マネージ拡張を「はい」
にしないとビルドの段階でエラーになってしまいます。
お小遣いを出して解説書を買ったのですがのってないみたいです。
>>196 実装は1バイトや4バイトでも
言語仕様としては1ビットなわけだが。
intが32ビットというのと同じくらい痛い発言。
お小遣いというのが何ともかわいらしい
だが大の大人のサラリーマンでもお小遣いな罠
>>198 .NET IDE の
オプション -> 環境 -> 国際対応
Document Explorer の
オプション -> 国際対応
207 :
デフォルトの名無しさん :2005/04/24(日) 16:07:52
結構調べてみたんですけど、よく分からなかったので教えてください。 visual studio.net使ってアプリケーション作れって課題出されたんです。 テンプレートでよく使われているのはMFCかwin32かのどちらかみたいなんですけど、 両者がどのように違うのかが良く分かりません。 出来れば、特徴とか記述方法の違いとか分かりやすく教えていただけると うれしいです。
多分、違い教えても君のレベルでは両方とも使えない
その高慢な回答は全く無意味かと
Win32=いわゆるWin32API。Windowsの機能に低レベルでアクセスできる。
MFC=クラスライブラリ。Windowsの機能にクラスを通じてアクセス可能
C++の知識が必要
でも
>>208
なんか簡単すぎる説明だな Win32 Win32APIやC/C++標準ライブラリなどを直接使ってWin32アプリを作る C/C++どちらでも作れる 作ったアプリはWindowsが入っていて、使用APIとOSバージョンが合致してれば使える MFC Win32APIやライブラリを分野ごとにクラスにまとめで使いやすくした(MS談) Microsoft Fundation Classというクラス群を使ってWin32アプリを作る クラスなので当然C++じゃないとダメ 作ったアプリはMFCのDLLをインストールしてあるPCでないと動かない Windowsインストールしただけじゃだめ
>>211 >なんか簡単すぎる説明だな
説明する方も良く分かってないみたいだからね
ヘタレな俺の経験からいわせてもらうといきなりMFCより Win32APIでシコシコ作った方が勉強になる
つうかWinインストールしてあればMFCxx.DLLってインストールされなかったっけ まぁバージョンの問題があるだろうけど
スタティックリンクしたらMFCのDLLは要らない。 作ったアプリはMFCのDLLをインストールしてあるPCでないと動かない Windowsインストールしただけじゃだめ
>>214 御意。
例えば、Win2K以前にはMFC7.1以降のDLLはない。
>>207 どんなアプリケーションを作りたいのかを示さないと、斯くの如く混乱を招く。
作る課題はどんなものなのかね。
漏れの持ってた98にはDLLそのものが無かったんだが
>>215 誰があんなでかいもんスタティックリンクすんだよw
219 :
198 :2005/04/24(日) 17:58:44
>>206 答えてくれてありがと。
だた・・まだ変更されないです。。
とりあえず、↓の目に付いた設定は日本語にしています。
ツール -> オプション -> 国際対応の設定 -> 言語 = 日本語
ツール -> オプション -> ヘルプ -> 言語の選択 = 日本語
Document Explorerの
オプション -> 国際対応の設定 -> 言語 = 日本語
"ShowWindow" 、"RegisterClassEx"など日本語訳があるのに
F1押してみると、何故か英語が表示されてしまうです・・
>>203 >言語仕様としては1ビットなわけだが。
言語仕様のどこに1ビットって書いてあるか教えてくれ。
バイト単位でデータを扱うものにビット仕様があるわけがない
222 :
デフォルトの名無しさん :2005/04/24(日) 19:27:01
>>207 マニュアル読め
じゃいかんのかね 最近は・・・
たいてい書いてあるんだがね
というかインターネッツでしらべれば一発なんだけど
224 :
207 :2005/04/24(日) 19:55:37
>>216 エクセルファイルを開かないでデータのみを読み込んで、設定を入力
すると、計算して値の内容が合ってるかチェックできるような
アプリケーションなんですけど・・。
>>222 マニュアルは手元に無いので(回してインストールしたので)、
参照したいんですが出来ないのです。
>>223 どこかおすすめのサイトってありませんか?
落としてきたんでしょw
226 :
デフォルトの名無しさん :2005/04/24(日) 20:51:19
> マニュアルは手元に無いので(回してインストールしたので)、 > 参照したいんですが出来ないのです。 著作権法違反発見!!!!!
アカデミックライセンスとかじゃないの?
(CDをドライブ内で)回してインストール
アカデミックライセンスでも回してインストールは駄目だろ。
スゲー誤魔化し方だなw
>>218 最近のPCはHDDの容量が多いので、スタティックリンクしたときの
メリットの方が多いですね。
どうせDLLヘル対策で実行ファイルと同じフォルダにDLL配置したりするから大差ないかも
スクール アグリーメントとかじゃねぇの?
そっちもさることながら、 「エクセルファイルを開かないでデータのみを読み込んで」の部分を誰か解説してくれ。
俺のESPによると 「エクセルファイルを開く」とはxlsファイルをダブルクリックする事だと推測 つまりプログラムから読み込むのは「エクセルファイルを開く」にあたらない
>>233 じゃ、なんでダイナミックリンクするの?
猫のソケットプログラミングの saddr.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list); の一文の右の式の意味ってどういうこと? lpHostこうぞうたいのh_addr_listの値をロングポインタ型のINADDRにキャストした やつのポインタの中身を左辺に代入するってこと? そもそもwsprintfのwとかLPIN_ADDRのLPとかなんのことなんでしょうか?
w : winapi l : long p : pointer
wの説明はネタだと信じたい
w : wide -> wideってなんですか?(以下略
ということは、lphostのh_Addr_listの中身をロング型のポインタに変換 したやつの中身(つまりアドレス?)がはいるということでしょうか。
ていうか239でだいたい合ってると思うがどうか。 HOSTENT構造体のポインタlpHostのメンバのh_addr_listをLPIN_ADDRにキャストして参照してる。 h_addr_list自体はポインタのポインタ。要はネットワークアドレスの配列。 LPは普通のポインタだと思っとけばいいと思う。
saddr.sin_addr = *((IN_ADDR*)*lpHost->h_addr_list);
なんとなくですがだいたいわかりました ありがd
CreateThreadでスレッドを作るだけで、複数のcpuを持つコンピュータで 実行させた場合それだけで複数のcpuに処理を分散させることになるのですか?
250 :
デフォルトの名無しさん :2005/04/25(月) 11:02:47
>>248 むしろスレッドをどのcpuで実行させるかは指定できない。
OSが管理するので。
楕円の画像処理をする場合、 1画素1画素処理していく以外に何か方法とかありますか?
252 :
デフォルトの名無しさん :2005/04/25(月) 14:18:25
>>249 自分がわからんからって人のせいにするなよ
254 :
デフォルトの名無しさん :2005/04/25(月) 17:04:37
質問です。 pgm形式の画像ファイルを読み込むので、一番簡単な方法ってなんでしょうか?
pgm形式って何?
256 :
デフォルトの名無しさん :2005/04/25(月) 17:15:41
スレッドについて質問があります。 マニュアル等では、各スレッドの処理がタイムスライスに従って 移行しているようですが、一時的にプリエンプションを禁止して、 その後解除するような事はできるのでしょうか?
あんまりマイナーな話題は、他の初心者の役に立つと思えないな。
>>254 Unix系のライブラリを使うのがいちばん簡単。
まぁ、自分で書いても大したことないけどね。
詳しくはVCスレではないC/C++初心者スレか画像スレにでも。
>>255 鸚鵡返しに質問しないで少しは自分で調べたら?
>>254 pgmだけ読み込むなら自前で処理したほうがいいね。
ライブラリを使うという手もあるけど、
ライブラリの使い方を調べてる時間があったら充分自分で実装できる。
もし使うならSusie Plug-inあたりがお勧めだね。
単純な形式だから、UNIX系のライブラリがお勧めできないのはわかるよね?
>>255 はるか昔の画像形式。
おじさんが若い頃はpgm使ってたんだよ。
リソースの代わりにソースに画像を埋め込んだりするときに使える。
その代わりものすごく効率悪い。
今ネイティブ形式として使ってたら池沼だね。
260 :
デフォルトの名無しさん :2005/04/25(月) 18:08:46
マルチメディアタイマーと普通のタイマーの違いは何ですか?
普通のタイマーの誤差はおよそ0.06秒(厳密にはOSに依存)
>>259 もしや、xpmと勘違いしていませんか?
つーか、pgmをソースに埋め込んだら只の阿呆ですな。
今でも2次元のべたデータにpgmのヘッダだけ付け足してxvで表示するエンジニアは目の前にごろごろしているんだけど、
unixも使えないロートルには荷が重い話かな?
スレ違い
265 :
デフォルトの名無しさん :2005/04/25(月) 18:55:22
>250 つSetThreadAffinityMask >256 スレッドのプライオリティを最大まで上げれば、他に対抗するスレッドが 現れない限り、似たような効果は得られるとおもう。CPUが複数あるなら 意味なしだけど。
267 :
198 :2005/04/25(月) 20:47:43
>>267 再インストール
ここってパソコン初心者板だっけ?
>>253 ここは初心者スレだぞ。
勿体ぶらずに説明しろよ。
270 :
デフォルトの名無しさん :2005/04/26(火) 02:04:14
C++の基礎を勉強してからウィンドウズプログラミングをやろうと思っているのですが、 いきなりMFCから入っても大丈夫でしょうか? MFCの方がWin32 APIだけよりも本格的っぽいので、いきなりこちらからやろうと思っているのです。
とりあえずやってみろよ。
SDKで++のライブラリを使いたいのですが(CFontなど) インクルードファイルやリンクライブラリは何を指定すればいいのでしょうか? その他注意点があったら教えて草代。
MSDNのCFont見れば書いてあるんだがよ・・・
基本クラスから継承してるから それだけあってもダメかもしれんな
MFC自体の初期化も必要かもしれんな。
VS2003でクラスライブラリを作成して、「hello」というプロジェクトを作りました。 hello.cppのソースに #include <ATLComTime.h> を書き加えるとリンクエラーになるのですがどうしたらいいですか? heloo.cppのソースは // これは メイン DLL ファイルです。 #include "stdafx.h" #include "hello.h" #include <ATLComTime.h> だけです。 初心者ですいませんがどなたか教えていただけないでしょうか?
ATL使うならライブラリがいるんじゃないか? ATLは初心者向けじゃないと思うから それ以上はコメントしません。
そうなんですか・・・。 サンプルソースがWindowアプリだったので内部処理の部分をDLL化してみたかったんです。 どうもありがとうございます。
>>270 僕も君と同じような道を歩んだよ。C++を勉強して、MFCに入っていった。
Windowsプログラミングを習得するための入り口としては適してるかもしれない。
(というよりこれぐらいしかない?ATLはさすがに初心者は難しいだろうし)
ただ、int main(){}で始まるプログラミングしか知らない人は戸惑うと思う。
なんせ根幹となるループ構造が隠蔽されてるからね。フレームワークという概念を習得しよう。
MFCをある程度理解しWindowsMESSAGEとかも理解できてきたら、WIndowsがどのように成り立っているかが
ほんのすこし垣間見えるかも。
最終的には、MFCのダメさ加減を認識し始めたら一人前だ。
>>218 static linkの場合は必要なものだけ選別してリンクするから
あの馬鹿でかいDLLの容量だけ増えるわけじゃないよ。
とはいえ、MFCはどういうわけかちょこっとstatic linkするだけでも、意外に容量的コストが
発生するという話だ。
281 :
デフォルトの名無しさん :2005/04/26(火) 17:09:42
VC.NETで完全自作のエディタを作ろうと思ってます。 そこで、文字の色や文字数やデータ構造などを自由に決めるために、 CEditViewを使わずCViewで作ろうと思ってるのですが、 CViewにて日本語入力を受け付ける方法がわかりません。 今ひとつメッセージに関してわかっていない自分ですが、 どのように入力を受け付ければいいのか、 どなたか教えていただけませんでしょうか。 よろしくお願いいたします。
> CViewで作ろうと思ってるのですが 完全自作じゃないじゃん
284 :
281 :2005/04/26(火) 17:53:18
>282 ありがとうございます。 ただ、早速試してみたのですが、どうもうまく行きません。 自分がメッセージ処理に疎いからだと思うのですが…。 -- CMyView.hの中身の一部 -- class CMyView : public CWnd { protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() public: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); /* (イ)ここに何を書けばいいのか */ } (続く)
285 :
続き :2005/04/26(火) 17:53:43
-- CMyView.cppの中身の一部 -- BEGIN_MESSAGE_MAP(CSuperLView, CWnd) ON_WM_PAINT() ON_WM_CREATE() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_KEYDOWN() /* (ロ)ここに何を書けばいいのか */ END_MESSAGE_MAP() 以上、(イ)と(ロ)の位置に何を書けばいいのかわかりません。それぞれに (イ)afx_msg LRESULT OnIMEStartComposition(WPARAM wParam, LPARAM lParam); (ロ)ON_WM_IME_STARTCOMPOSITION を書いても「ON_WM_IME_STARTCOMPOSITIONが定義されてない」みたいな エラーが出てきます。他に何をすればいいのでしょうか? よろしくお願いします。
286 :
281 :2005/04/26(火) 17:56:20
>283 そうですね。すいません。 自分が使いやすいエディタを作りたいだけです^^
287 :
281 :2005/04/26(火) 18:00:37
>上×2 2行目、CSuperLViewではなくCMyViewです。すいません。 実際はCSuperLViewという名前にしてるだけです。
なんつーか、免許取っていきなりレースに出るようなもんだな。
// inside the class declaration afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); BEGIN_MESSAGE_MAP(CMyWnd, CMyParentWndClass) ON_MESSAGE(WM_MYMESSAGE, OnMyMessage) END_MESSAGE_MAP() これを真似すればできる
290 :
281 :2005/04/26(火) 21:44:35
>289 できました! 感激です! どうもありがとうございました! 頑張って免許取りたてでレース出てみます!
>>232 メモリが無駄になる。
DLLが同じアドレスにロードされれば、同じ物理メモリを共有するが、
スタティックリンクしてしまうと、そういうことができない。
>>248 スレッドにうまく処理を分けるのはプログラマの仕事。
どのスレッドをどのCPUでいつ走らせるかはOSの仕事。
>>250 嘘いうなよ。
Win32 APIのSetThreadAffinityMaskで指定できる。
>>256 普通のユーザモードで走るプロセスは、
プリエンプションを禁止して走ることはできない。
いついかなるタイミングでプリエンプションが発生しても良いようにコーディングしてね。
>>291 最近のPCはメモリの容量が多いので、スタティックリンクしたときの
メリットの方が多いですね。
いやメリットは特にないだろ
ロード時間の短縮と言ってみるテスト
DLL hellを避けられるのは大きなメリット
・自作DLLのほとんどがPreferredBASE=1000:0000で 配布されて居る件について。 ・MicrosoftはSxsを推奨している件について。
>普通のユーザモードで走るプロセスは、 >プリエンプションを禁止して走ることはできない。 >いついかなるタイミングでプリエンプションが発生しても良いようにコーディングしてね。 これってasmで割り込み禁止にしても?
普通、ユーザープログラムが割り込みフラグ操作したら例外起きるよ(´・ω・`)
DOS時代のまま時間が止まっているプログラマは、
ちょっとはマルチタスクOSについて勉強してよ。
そういうプログラマが書いたプログラムって悲惨なんだよね。
空ループして何かを待ったりして、メッセージポンプ止めてるのに、
イベント来ないとか文句言ったりさ。
>>296 MFCのDLLの話とは関係ないじゃん。
自作DLLをたくさんのプロセスで共有することってあるかな。
MSVCRTとかMFCとかならともかくさ。
するとしても、そいつらはみな同じ0x10000000にロードされるだろうから、共有できるでしょ。
もちろん、DLLのロードアドレスがバッティングしたら、そりゃズレるけど、 そういう自作DLLを多数使うアプリってあるのかな。 もしDLLとEXEを同じところで作っていれば、 デバッグ時にVC++が、 バッティングしたからズラしたぞゴルァ って言ってくるから、気がつくでしょ。
ヲタ話は他所でやってくれよ
302 :
デフォルトの名無しさん :2005/04/27(水) 08:50:59
#if !defined(___XXXXX) #define ___XXXXX #endif の代わりに #if _MSC_VER > 1000 #pragma once #endif を使う利点、欠点を教えてください
それは初心者にとって非常に重要な問題なんだろうか? 普通の人にとってはどうでもいい問題にしか思えんな
>>302 既出。
・利点
ソースを全部評価しないで済む。
・欠点
(当然だが)他のコンパイラでは使えない。
>(当然だが)他のコンパイラでは使えない。 主要なコンパイラはサポートしてるらしいよ。
>>305 主要なコンパイラでは_MSC_VERが定義されているの?
それは不便だ……
307 :
デフォルトの名無しさん :2005/04/27(水) 14:52:42
Xp+VC7.1(.NET2003)です。 XP風のビジュアルスタイルにしたくて調べているのですが 「ButtonコントロールのFlatStyleプロパティをSystemに設定して・・・」 とあります。 ところが、プロパティ設定の画面には"Flat"はあるのですが"FlasStyle"はありません。 何か根本的に間違っているのでしょうか? よろしくお願いします。
XPスタイルにしたいなら民主党のマニュフェストを参考にしろ
XP風のビジュアルスタイルにしたいんだろうか? ボタンをフラットにしたいんだろうか? たまたま見つけたサイトに書いてあることが真実か知りたいんだろうか? まずそこをはっきりしろ
311 :
デフォルトの名無しさん :2005/04/27(水) 16:14:25
質問です。環境は XP、VC++ 6.0 です。 MFC で作ったアプリで、アイコンの設定で躓いています。 サイズ 32×32、24 bit の bmp の拡張子を ico に変えたものを用意し、 リソース IDB_ICON32 として取り込みました。 C○○App クラスの InitInstance において、 HICON icon = LoadIcon( IDB_ICON32 ); // A m_pMainWnd->SetIcon(icon, true); // B として実行すると、起動中に B の行でアプリが強制終了されました。 24bit の bmp をリソースとして取り込むことはできないのでしょうか? またその場合、リソースではなく外部からアイコンを取り込むにはどうすればいいのでしょうか? よろしくお願いします。
312 :
307 :2005/04/27(水) 16:21:58
現在、フラットな画面をXP風のビジュアルスタイルにしたいんです。 プロジェクトはダイアログベースで作成しています。
おま、そりゃアイコンじゃなくてビットマップだろうが ビットマップをLoadIconしてどうすんだよ・・・ そのビットマップデータをペイントか他の適当なペイントツールで開いて全体をCtrl+Cでコピーして、 VCの新規リソースでICON作ってそこにペーストしる
314 :
デフォルトの名無しさん :2005/04/27(水) 17:33:25
うーん…… 8bit のビットマップをペイントで開いてコピー、 リソース作ってペーストして ico ファイルを作ったのですが、 どうしても再度読み込むと、パレット情報がばらばらになってしまいます。 (色がめちゃくちゃになる) 24->8 bit への減色は、ペイントで行なっています。 原因の見当がつきません。よろしくお願いします。
315 :
311=314 :2005/04/27(水) 17:33:59
名前を入れ忘れました、申し訳ないです。
・普通、IDB_はビットマップに付ける名前。アイコンならIDI_。 ・ペイントの原色の性能はまったくのポンコツ。 JPEGとかをGIFで保存してみたら一目瞭然。
317 :
311=314 :2005/04/27(水) 18:04:36
>>316 Photoshop で減色する際、使用中の入りを全て割り当てる、
Windows(システム)などが色々な種類がありますので、
アイコンなどに使われるパレットはもしかして固定なのかと思い、
もしそうなら Windows 付属のペイントならシステムにあった減色を
してくれるのでは?と思い、あえてこの方法をとりました。
間違った判断だったようですが……。
>>313 でお教えいただいた方法で IDI_*** として取り込むことはできました。
ところが、生成された ico ファイルは、パレットがむちゃくちゃでした。
むむー
>>317 元々8bitで書いてないうえに、ペイントで原色してるんじゃそれはしょうがない
もっとちゃんとしたエディター使うべき
319 :
311=314 :2005/04/27(水) 18:09:10
>>318 なるほど、アイコン作成用のフリーソフトを探してみます。
ありがとうございました。
あぁ、字が違う 原色→減色
指定したフォルダの中に入っているファイル・フォルダの情報(ファイル名やサイズなど)を全て取得するにはどうすればよいのでしょうか?
>>301 けっこう大切な話なんだけどな。
初心者にありがちなのが、
肝心なことをスルーしてしまうこと。
トレースに何か出ていても無視したりするんだよね。
FindFirstFile FindNextFile FindClose
Winコンソールで int main(int argc,char** argv)の引数を入力して デバッグはどうやってやるんですか
gdb hoge a1 a2 a3