トップページ⇒tech
1001コメント306KB

VisualC++相談室 【7】

■ このスレッドは過去ログ倉庫に格納されています
0001いさましいチビの女の子NGNG
VisualC++関連の話題を扱うスレッドです。

前スレッド
http://pc.2ch.net/test/read.cgi/tech/1011615035/l50
0153デフォルトの名無しさんNGNG
char* と同じです。
0154デフォルトの名無しさんNGNG
>>152
typedef char CHAR;
typedef CHAR *LPSTR, *PSTR;
0155デフォルトの名無しさんNGNG
char 文字列知らない人・・・?時代は変わったのか・・・。

>文字列への 32 ビット ポインタ
0156デフォルトの名無しさんNGNG
charへのFARポインタだろ
全くもう..
0157デフォルトの名無しさんNGNG
FARって何?
0158デフォルトの名無しさんNGNG
>>157
セグメントをまたいでのメモリアクセスが可能なポインタ。
0159デフォルトの名無しさんNGNG
FAR…過去の遺物では?
0160デフォルトの名無しさんNGNG
64kb境界を越えられるポインタだろ
全くもう..
0161デフォルトの名無しさんNGNG
セグメントって何?
超えられない?

わけわからーん。
0162デフォルトの名無しさんNGNG
>>160
それが1セグメントっす。
0163デフォルトの名無しさんNGNG
>>159
ナニ、過去の遺物だって? 寝ぼけたこといってるなぁ。
VC がどんなコードを吐いてるか、考えたことないのか?

「FAR ポインタなんて過去の遺物」なんて言ってるヤツは、
今後一切、例外処理を使うなよ。
例外処理をしている DLL を呼び出すこともまかりならん。
0164デフォルトの名無しさんNGNG
>>163
FAR自体を知らなくても例外処理できるから遺物なんでつよ(´Д⊂
0165デフォルトの名無しさんNGNG
128bitコンパイラとかでてきたらFAR/NEARの復権もあり得るかモナ。
0166163NGNG
>>164
あのね、「遺物」というのは、もう誰も使ってないから「遺物」なんだよ。

たとえ知らなくても、現役で使われていたらそれは「遺物」とは言わんと思うが。
0167159NGNG
>166
んと,VC++のインクルードファイル見たんですよ。すると,

#define far
#define FAR far

ってなってたので。

32bit以前のコード移植の為にあるだけだと思ってたんですが。
0168デフォルトの名無しさんNGNG
>>167
将来のコンパイラとのソース互換確保のためじゃないの?
0169デフォルトの名無しさんNGNG
>>156-160
お前ら本当に大丈夫か ? まさか、Near ポインタがいまだに 16bit とかいって
んじぁねーのか。
0170デフォルトの名無しさんNGNG
Nearポインタって何〜?
0171デフォルトの名無しさんNGNG
きょうびセグメントつったら、最大4Gで、16bitのセレクタで指定しるアレだろ…
0172デフォルトの名無しさんNGNG
NT(win32)じゃnearもfarもねーぞ!!。フラットだ!!。
「64k」って...いつの時代の話してるんだゴラァ!
0173デフォルトの名無しさんNGNG
そろそろ64bitの時代が来ますがお前らどうですか?
VS.NETからPlatformSDKも最新版(64bit対応)になってそのままだと
通らないソースとか出てきてショボーンだったりしませんか?
0174デフォルトの名無しさんNGNG
IntPtrとかなー、ちょっと直感的でないtypedefだとおもいません?
0175デフォルトの名無しさんNGNG
>>173
一部のAPIは64bitへの移植に備えてるみたいだが、まだ中途半端で困る。
0176デフォルトの名無しさんNGNG
つーか、64bitOS上で64bitコード書くつもりかおまえら何様だ(藁
0177デフォルトの名無しさんNGNG
現在新visualc++6.0入門ビギナー編(林晴比古)で勉強中です。
何かアドバイスをください。
0178デフォルトの名無しさんNGNG
その本を投げ捨てましょう。
0179デフォルトの名無しさんNGNG
まずその本を捨てろ。
0180デフォルトの名無しさんNGNG
VC++ (SDK)でRealPlayer用のファイルを再生する場合、どのようにすればいいのでしょうか?
RealSDKをDLしてみたんですが、MFCでコンソールアプリ用だったし。
rmoc3260.dllを#importしてCoCreateInstanceでスマートポインタを取得するところまではできたのですが、
「再生ウィンドウを表示して、自作ウィンドウに埋め込む」というのが出来ません。
VBとDelphiなら簡単にできましたが、ActiveXを使うにはVCは向いてないのでしょうか?
どなたか知恵を貸してください。
0181デフォルトの名無しさんNGNG
VBはともかく、Delphiがやっていることと同じ事をやればOK。
もちろん、VC標準にはない機能は自分で実装すること
0182180NGNG
>>181
!?
DelphiもVBと同じ方法ですよ?
フォームにActivexコントロールをペタッと貼り付けて…
0183デフォルトの名無しさんNGNG
>>182
ハァ?
おまえがDelphiでやった事じゃなくて、
Delphiが内部でやっていることだっつーの。
VCLのソースだって付いてきてるんだろ
0184180NGNG
>>183
実はDelphi全くの初心者で…
フォームに貼り付けて実行して表示された段階でできた!って思っただけなので。
(VCではダイアログに貼り付けても表示すらされない)
ちょっとDelphi勉強してきます。
0185チビNGNG
あげ
0186デフォルトの名無しさんNGNG
ATLあるいはMFC使うのが通例。手でActiveXコントロールコンテナ書くのは無謀。
0187学徒NGNG
プログラムで0.1を百万回たさせても十万という値が出ずに中途半端な値
(確か十万よりちょっと大きかったです)が出るわけですがこの理由は何なのでしょうか?不思議でしょうがないです
int i=0;
float a=0;
while(i<1000000){
i++;
a=a+0.1;
}
誰か御教えください、おねがいしますm(_ _)m
またこのことについて載っているサイト等ありましたら御教えくださいませ
0188デフォルトの名無しさんNGNG
>187
0.1というか浮動小数点数が2進数でどう表されてるかを
勉強すると良いかと。
0189デフォルトの名無しさんNGNG
>187
10進数の 0.1 は、2進数では割りきれない値だから、その誤差が出る。
ループで加算のかわりに、乗算でも結果は同じだと思うな。
float a = 0.1;
printf("%f\n", a*1000000 - 100000);
0190デフォルトの名無しさんNGNG
>>187
10/3 = 0.3333333を3回足しても10という値が出ずに中途半端な値
(確か10よりちょっと小さかったです)が出るわけですがこの理由は何なのでしょうか?不思議でしょうがないです。
0191もうだめぽ・・・NGNG
×10/3 = 0.3333333
○10/3 = 3.3333333
0192デフォルトの名無しさんNGNG
http://www.google.com/search?hl=ja&q=%95%82%93%AE%8F%AC%90%94+%8C%EB%8D%B7&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0193デフォルトの名無しさんNGNG
>>190
情報処理技術者試験でも受けてみなはれ。
0194180NGNG
>>186
MFC嫌いなんだよな〜
MFC使うならVBで書いたって同じだし…
でもユーザが
「VC++ SDKで。
プレゼンテーションを表示したいから、フォームでRealPlayerを実行したい」
ってなわがまま言うもんだから…
しっかし、COM難しすぎ!!
0195デフォルトの名無しさんNGNG
>MFC嫌いなんだよな〜
なら、ATL/WTLですね :-)
0196デフォルトの名無しさんNGNG
Win2000sp2で、PlatformSDK 2001/oct のセットアップがどうしても
失敗するんですが、原因わかる方、いる?

Errors occurred during installation.
1601: A Windows installer error has occurred.
512: Installation failed with one or more errors.
Plaese correct the errors and/or try again.
0197学徒NGNG
>>188-192
皆様ありがとうございます
0.1は2進数で割り切れない数だからだったんですね
ということはfloatでなくてdoubleにでもすれば少しはましになるということですね
完全に解決する方法はないのでしょうか?

>>189
>printf("%f\n", a*1000000 - 100000);
これはなぜ -100000引いてるんですか?
0198デフォルトの名無しさんNGNG
>197
文字列で数値表現すれば一応解決w
0199デフォルトの名無しさんNGNG
あの、質問いいでしょうか?

mciSendStringやsndPlaySoundなどで音を鳴らすときに
2つ以上の音を同時に鳴らすことはできないといわれました。
DIRECTSOUNDを使えばできるといわれたんですが
これは本当なのでしょうか?

また、もし本当なら、DSOUNDを使う以外にどのような手段があるでしょうか?
0200デフォルトの名無しさんNGNG
自前ミキサを使ってwaveOut〜
0201デフォルトの名無しさんNGNG
あらかじめ、2つの音がミックスされたwavを用意しておく。
0202デフォルトの名無しさんNGNG
>>200
自前ミキサとは何でしょう?
検索エンジンにもひっかからないところを見るとプログラム用語ではないのでしょうか?

>>201
BGMと効果音なので、そういう手段はとれないんですよ。
0203デフォルトの名無しさんNGNG
>>202
ぉぃぉぃ
まぁ、名前を聞いて理解できないようじゃおまえにゃ実現できない方法だから安心しろ。

BGMとSEなら、midi/waveで普通に並列で慣らせるだろ。
BGMをwaveで鳴らすような馬鹿なことはするな
0204デフォルトの名無しさんNGNG
蛇足だが、自前ミキサとは自分の力で複数の音をリアルタイムに合成して
1つのwave outから沢山の音を出す事。素人にはおすすめ以前に、出来ない。
何にせよ、199君はDirectSoundを学ぶ事を勧めるよ。
0205デフォルトの名無しさんNGNG
いや、ミキシング自体はものすごく簡単なんだが。
0206デフォルトの名無しさんNGNG
むう、そんなに難しいものでしたか……
DIRECTSOUNDではできるんですが、
ちょっとした事情によりDSOUNDを使ってはいけないんですよ。

検索すればソースとかが出てきてもよさげなので、
それを改造してミキサを実装することにします。

すばやい回答ありがとうございました。
0207デフォルトの名無しさんNGNG
>>205
ミキシングは簡単だが、sndPlaySoundしか知らない奴にダブルバッファリング
でリアルタイム合成出力なぞ出来る訳がなかろう。
0208デフォルトの名無しさんNGNG
あれ、でも今試しに2回sndPlaySoundをやったら
同時に音がなったんですが、これはサウンドボードによるものなのでしょうか?
そんなに良いサウンドボードは使ってないんですが……
0209デフォルトの名無しさんNGNG
最近のサウンドカードは2〜4chの出力を持っていて、
その数までなら普通に同時に鳴らせられる。
それから、Win2k(XPはしらん)ならOSがミキシングしてくれるから、
自前で書かなくても問題はない。
0210デフォルトの名無しさんNGNG
なんとなくわかってきました。
WAVEファイルを読んでメモリにおいておき、
それを自分でWAVEOUTで出力するんですね。

実際に音の合成をするにはどのような演算をすればいいんでしょう?
それが検索でなかなか見つからなくて……
0211デフォルトの名無しさんNGNG
>>209
ありがとうございます。
最近のマシンのみを対象にする場合はそれでもOKということですね。
0212デフォルトの名無しさんNGNG
>>210
足し算です。但しオーバーしないように、あらかじめ元のwaveを縮小しておくべし。
0213デフォルトの名無しさんNGNG
>>212
ありがとうございます、検索で見ながらさっそくやってみます。
0214デフォルトの名無しさんNGNG
最近CPUをCeleron1.1GHzに替えたんですが、そしたらデバッガ上で実行する時
SSE命令の所を通るとIllegalInsatruction例外が発生するようになってしまいました。
SSEは自分で書いた物じゃなくてDirectXの中なんですが。
デバッガ上でなくシェル上でなら普通に動作します。
VC++6.0使ってるんですが、そういや最新のSP当てて無かったなぁ、とSP5
を当てて見たものの解決せず。
どうやったらこれ解決できるんでしょう?

検索して見たらこのスレの過去ログがヒットした物の、HTML化されて
無くて閲覧できづ。
キシュツだったらスマンですが、誰か何か知って居たら教えて下さい‥‥
0215デフォルトの名無しさんNGNG
DirectX内で__tryで囲ってあるから大丈夫、という話だったきがする。
IllegalInstructionを「ハンドルされてなければ停止」にすればいいとか。
0216デフォルトの名無しさんNGNG
がいしゅつだったらごめんなさい。
xxx.libxxxという名前のフォルダの下にライブラリファイルを置いたら、
リンクできないんですがなぜですか?
使用しているコンパイラはVC++6.0です。
0217216NGNG
age忘れ
0218デフォルトの名無しさんNGNG
>216
MSDNで「リンカ入力ファイル」で検索すると
 .libxxxなんて入力ファイル形式が無いが。
0219216NGNG
>>218
ファイルじゃなくてフォルダの名前が"xxx.libxxx"なんです。
具体的にいうと
C:\Documents and Settings\username.LIBxxx\My Ducuments\project\hoge\lib
に置いてあるライブラリがリンクできないんです。LIBxxxはドメイン名です。
0220216NGNG
ためしに
C:\work\xxx.libxxx\
というフォルダを作ってそこに置いてみてもだめでした。
0221デフォルトの名無しさんNGNG
DLLからDLLを呼ぶことってできます?
できるなら注意点を教えて欲しいです。
0222デフォルトの名無しさんNGNG
>220
c:\Docu...\username.LIBxxx\...\hoge\lib\にライブラリファイル全部移しても
全然問題ないのだが。
ライブラリファイルのディレクトリがちゃんと通ってないのでは?
かオブジェクト/ラブラリモジュールの中に*.libの綴りが間違ってるとか?
0223デフォルトの名無しさんNGNG
>>197 あらかじめ10倍にしておけ そして出力する時に少数点を付けろ
0224216NGNG
>>222
「ファイルをプロジェクトに追加」でそのライブラリファイルを指定して追加しても、
リンク時にそのライブラリに入っているはずの関数が未解決になるんです。
ほかのフォルダに移してリンクすればちゃんとできます。
>219の\projectのフォルダを丸ごとC:\workとかに移動すれば、
そのままでリンクが通るのに、
パスの途中に*.lib*という名前のフォルダがあるとだめなんです。
いい忘れてましたがOSはWindows2000です。
0225デフォルトの名無しさんNGNG
S-JIS環境でUnicodeの文字(ハートマークとか)をTextOutで出力するにはどうすればよいのですか?
CharSetでSHIFTJIS_CHARSETはあるのですが、Unicodeにあたるものが見つかりません。
よろしくお願いします。
0226SevenTH@SUNDAYNGNG
>>225
UnicodeのAPIを呼び出す。
0227デフォルトの名無しさんNGNG
>226
なるほど、
TextOutW( dc, 0, 0, L"\x2665", 1 );
これで出来ました。
ありがとうございました。
0228デフォルトの名無しさんNGNG
あの、ずっと今までフルスクリーンばかりで
今回はじめてウィンドウモードでプログラム組んでみたんですが
640*480にしても、タイトルバーなどを含めて640*480に
なってしまいます。描画可能領域を640*480にするには
どうしたらいいんでしょうか?
0229デフォルトの名無しさんNGNG
>>221
双方の DLL でリンクするランタイムライブラリの種類に注意すべし。

シングルスレッド/マルチスレッド、スタティックリンク/ダイナミックリンク、…。
0230デフォルトの名無しさんNGNG
>228
AdjustWindowRect
0231デフォルトの名無しさんNGNG
>>230
そのAPIを検索したらわかりました。
ありがとうございます^^
0232デフォルトの名無しさんNGNG
スロットゲームを作りたいのですがスロットが回転する部分の
実装方法がわかりません。どなたか教えていただけませんか?
0233デフォルトの名無しさんNGNG
回転する部分の何がわからないんだよ
ドラムのデータの持ち方か?
アニメーションの方法か?
0234デフォルトの名無しさんNGNG
>>233
アニメーション方法です。
0235216NGNG
>>215
むーん。
SSEをサポートしているCPUなんで、IllegalInstructionが送出されること自体が
おかしいような‥‥
「ハンドルされて無ければ停止」を試してみたいですが、手元に環境が無くて。
明日試して見マス。
0236デフォルトの名無しさんNGNG
Windowsプログラマのみなさん
辛く無いですか?
0237チビNGNG
age
0238デフォルトの名無しさんNGNG
>>236 そうですね 舐めてみたら確かにカライです
0239デフォルトの名無しさんNGNG
VC6-SP5を使用しています。
コンパイルオプションに -MT (マルチスレッド対応)をつけた途端に
作成中のプログラムの挙動がおかしくなりました。

コンストラクタの初期化リストで NULL に設定したメンバの値が
勝手に何か別の値に書き換えられてしまうのです。

コンストラクタ内で MessageBox で確認すると NULL になっていますが、
メンバ関数を呼び出した時、書き換えていないはずの値にゴミが入っています。

関係する全てのファイルをマルチスレッド対応ライブラリにリンクするように
変更しましたし、まだライブラリを変更しただけで、コード内で
別スレッドを作成したりはしていませんので、別スレッドが書き換えているという可能性も低いです。

どうしてこうなってしまうのでしょうか?ご存知の方いらっしゃいましたらお願いいたします。
0240デフォルトの名無しさんNGNG
>>239
どうしてって、潜在的なバグが表面化しただけだろ
Bounds CheckerとかPurifyで確認しろ
0241デフォルトの名無しさんNGNG
【質問】
VC++でゲーム作ろうとおもってるのですが、
簡単なサイコロ目当てゲームをとりあえずやってみようとおもってるんだけど、
とりあえず、普通のウィンドウズようアプリ(アイコンクリックしたら起動、DOS窓じゃない)
って状態にもっていきたい。

とりあえず空っぽのなんの機能もないウィンドウは作った。
そこにC++のメインのゲーム処理ソースは一体どこに書いたらいいの?
クラスとかたくさんありすぎてわけワカメです。
0242デフォルトの名無しさんNGNG
>>241
タイマーイベントでいいんじゃないか?
0243デフォルトの名無しさんNGNG
>>242
ななにそれ!?
0244デフォルトの名無しさんNGNG
>>243
検索すれよ。
0245デフォルトの名無しさんNGNG
>>244
あったけど、意味がわらん。
0246デフォルトの名無しさんNGNG
>>245
全部説明させる気かよ。
なんか本でも買って読めよ。
0247デフォルトの名無しさんNGNG
タイマーイベントなんて本にのってないかったよ。
0248デフォルトの名無しさんNGNG
pCmdUI->SetText("hoge");
で字に下線つけるのはどうすればいいですか?
普通にVC上でメニュー作る時に
キャプションに 開く(&O)
ってやるかんじでできる下線です。
0249デフォルトの名無しさんNGNG
pCmdUI->SetText("&hoge");
0250デフォルトの名無しさんNGNG
pCmdUI->SetText("&hoge");
だとできました。

ただpCmdUI->SetText("hage\t&hoge");
とするとだめでした。
こういうもんですか?
0251デフォルトの名無しさんNGNG
VBプログラマのためのVC++って本読んでVBで使えるATL COMをC++で作ってみました。
VBで走らせてみると、”ActiveXはオブジェクトが作れません”とかなんとかいわれる。
仕方ないから本のサンプルコードコピって試しても同じだった。

状況;
本の環境:NT,
自分環境:98
レジストリ登録は行われてる。
VBのオブジェクトブラウザでも見れる。
VB上でのオブジェクトの宣言は問題ない。
メソッドやプロパティにアクセスすると上記のエラーが出る。

って感じなんです。散々調べたんですがもうギブです。
誰か原因&解決法教えて下さい。
0252デフォルトの名無しさんNGNG
誰か助けて下さい。
関数から抜ける時に _BLOCK_TYPE_IS_VALID っていうアサートが出ます。
ランタイムの delete 演算子が多重 delete 等の時に発している警告のようなのですが、
何故でるのかがわからないのです。
「関数から抜ける時」に発生するので、auto 変数だと思うのですが(ちなみに auto_ptr などは一切使っていません。)

これはどういう状況の時発生するのでしょうか?
指針のような物でもよいのでアドバイスを頂けないでしょうか?
よろしくお願いいたします。

■ このスレッドは過去ログ倉庫に格納されています