1 名前:デフォルトの名無しさん mailto:sage [2014/10/13(月) 15:13:20.18 ID:yFRqmPNp.net] ■公式 ttp://www.microsoft.com/japan/msdn/vstudio/default.aspx ■前スレ Visual Studio 2008 Part 21 peace.2ch.net/test/read.cgi/tech/1290969016/ ■リンク Visual Studio 2008に搭載された17の新機能 ttp://www.atmarkit.co.jp/fdotnet/special/visualstudio2008_01/visualstudio2008_01_01.html 5000個のバグと戦った、MSが「Visual Studio 2008」RTM出荷 ttp://www.atmarkit.co.jp/news/200711/20/vs.html ■関連 Visual Studio 2013 part4 peace.2ch.net/test/read.cgi/tech/1404333757/ Visual Studio 2012 Part8 peace.2ch.net/test/read.cgi/tech/1392639689/ Visual Studio 2010 Part21 peace.2ch.net/test/read.cgi/tech/1412136476/ Visual Studio 2005 Part 27 peace.2ch.net/test/read.cgi/tech/1291513609/ その他テンプレ>>2-5
289 名前:デフォルトの名無しさん [2018/09/17(月) 02:52:10.55 ID:dj7qSZnZ.net] C-2 デフォルト設定(Release) 【コード】(その2) int _tmain(int argc, _TCHAR* argv[]) { int count = 16; __int64 inputs_hex[16] = { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1fedb1530240aa54, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1ff0af0d95025bc3, 0x1fc9353df6af376b, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; double* inputs = (double*)inputs_hex; double norm = calc_norm_and_regulate(count, inputs, false); fprintf(stdout, "[2]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); return 0; }
290 名前:デフォルトの名無しさん [2018/09/17(月) 02:52:25.20 ID:dj7qSZnZ.net] C-2 デフォルト設定(Release) 【実行結果】 ↓このコードの逆アセンブルコード https://ideone.com/5OaUe6 ↓実行結果を書き込めないからこっちに書き込んどいた https://ideone.com/FFW0P0 [1]0x0007F2C44DFFF8F1:1.1053482540585101e-308 [2]0x1FF68DDFB62221DD:1.0513554365953078e-154
291 名前:デフォルトの名無しさん [2018/09/17(月) 02:53:45.62 ID:dj7qSZnZ.net] C-2 デフォルト設定(Release) 【コード】(その1) #include "stdafx.h" #include <stdio.h> #include <stdint.h> #include <math.h> template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug. double norm = 0; for (int i = 0; i < num; i++) { norm += (double)r[i] * (double)r[i]; fprintf(stdout, "[0]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); } fprintf(stdout, "[1]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); norm = sqrt(norm); if (regulate) for (int i=0;i<num;i++) r[i] = (T)(r[i]/norm); return norm; }
292 名前:デフォルトの名無しさん [2018/09/17(月) 02:54:34.82 ID:dj7qSZnZ.net] (正)>>283 (誤)>>280
293 名前:デフォルトの名無しさん [2018/09/17(月) 02:57:46.48 ID:dj7qSZnZ.net] >>277-278 のコードも>>283 ,281のコードも も同じ条件でデフォルトでコンパイルしてる 一行コメントはずしてコンパイルしなおすだけだからな で、>>279 、>>282 みたいな結果になる >>282 の実行結果はDebugビルドとまったく同じになる そのまんま CLRのとき(>>274 )の動作とまったく同じ キミラはずーっとなにやってるわけ?
294 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 09:44:34.76 ID:yu1Dprt2.net] >>285 同一のreleaseをコンソールで実行するかデバッガで実行するかで結果が異なるのはなぜだろう。 という話をしていたのであって、 debug/releaseで別の結果になることを問題にしているのではないです。
295 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 10:25:22.39 ID:+dwRu2dr.net] >>192 がコンソール起動とIDE起動で挙動が異なる理由は分かりました。 ありがとう。 結論はつまり以下だ。 > JIT の最適化とデバッグ(抜粋) > マネージ アプリケーションをデバッグするとき、Visual Studio では、既定で、 > ジャスト イン タイム (JIT: Just-In-Time) コードの最適化が省略されています。 > 最適化されたコードをデバッグするのは困難であるため、 > 最適化されたコードで発生するバグが、非最適化バージョンでは再現しないときにのみお勧めします。 > JIT 最適化は、Visual Studio の [モジュールの読み込み中に JIT 最適化を抑制する] オプションで制御されます。 > 実行中のプロセスにアタッチする場合、既に読み込まれ、JIT でコンパイルされ、 > 最適化されているコードが含まれることがあります。 > このようなコードの場合、[モジュールの読み込み中に JIT 最適化を抑制する] オプションの影響はありません。 > https://msdn.microsoft.com/ja-jp/library/ms241594.aspx 確かにこのオプションで直った。
296 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 10:25:48.51 ID:+dwRu2dr.net] その他諸々、話を整理すると、以下となる。(ソースは>>192 参照) 1. managedコードではMSILが出力され、x86コードは含まれていない。 2. 起動時、MSILはJITされ、x86コードに落とされる。 3. このため、mainの1行目でブレークポイントで止め、calc_norm_and_regulateの逆アセンブルを見ようとしても、 IDE上で「逆アセンブルを表示できません。式がまだネイティブ マシン コードに翻訳されていません。」と出る。 これはmainの1行目に System::Diagnostics::Debugger::Launch(); を入れたときも同様。 4. そしてこのJITに関して、上記IDE中の 『[モジュールの読み込み中に JIT 最適化を抑制する] オプション』 が効いてくる。 規定ではオフ、つまり、ReleaseビルドでもIDE起動ならJIT最適化は抑制される。 これがfld/fmul/fadd/fstpのループコードになる理由。 これをオンにすれば、確かにReleaseビルドIDE起動でも、 fld/fmul/faddのループコードとなり、コマンドプロンプト起動と同じ結果になることは確認した。 5. 上記では表現が微妙だが、JIT最適化をするかどうかは読み込まれるときに決まるらしい。 したがって、Releaseビルドを起動後にアタッチした場合は通常通り最適化され、 IDEからReleaseビルドを起動した場合は『既定では』最適化が抑制されてしまう。 これがIDE起動とコマンドプロンプト起動で挙動が異なった原因。 上記、『[モジュールの読み込み中に JIT 最適化を抑制する]』のチェックを外せば、直った。 6. おそらくこのオプションはソリューション毎ではなく、IDEのインストール毎なんだと思う。 (ソリューション毎のオプションはプロジェクトのプロパティにあり、場所が違う) だからその人の環境によっては最初からオフにしている人がいたかも? これが再現実験をしてくれた人たちと微妙に結果が異なったりした原因か? これで>>192 についての疑問は解消した。(はず) 俺の本番コードについては再度確認し、また報告する。
297 名前:デフォルトの名無しさん [2018/09/17(月) 10:28:21.54 ID:dj7qSZnZ.net] 同じリリースビルドで 結果がかわってんのになにいってんの? fprintf入れるだけで リリースビルドで結果が変わる
298 名前:デフォルトの名無しさん [2018/09/17(月) 10:31:16.66 ID:dj7qSZnZ.net] やはり低学歴知恵遅れは 結果が意味するところが分かってないわ。。。
299 名前:デフォルトの名無しさん [2018/09/17(月) 10:32:49.39 ID:dj7qSZnZ.net] ちなみにオレがあげた結果は すべてリリースビルドの結果だからな デバッグビルドの結果なんかあげても 意味ないからな
300 名前:デフォルトの名無しさん [2018/09/17(月) 10:38:00.02 ID:dj7qSZnZ.net] CLRのケースもCLRでない普通のexeのケースでも 結果はまったく同じだからな しかもすべてリリースビルドで おきてる誤差までぴったり一致してる
301 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 10:52:24.35 ID:+dwRu2dr.net] >>289 お前は相変わらず理解してないな。 80bit(拡張倍精度)と64bit(倍精度)の演算で桁落ちが異なり、結果が異なるのは当然なんだよ。 問題は同じバイナリの癖に何故起動方法によって異なるのか?だったんだ。 理由はMSILだからだ。 MSILはCLR上でJITされ、x86コードに落とされる。 このときにJIT最適化がかかれば、拡張倍精度(を保ったまま)のコードになるし、 最適化がかからず毎回メモリに書き戻していれば、倍精度のコードになる。 .NETにおける同一バイナリってのは、
302 名前:同一MSILという意味であって、同一x86機械語という意味ではない。 だから、確かに同一バイナリを掴んでいたが、起動方法によって結果が異なっていたんだよ。 (VSがデバッグ用に意図的にそういう仕様にしていただけ。俺はそれを知らなかった) 君のコードについては、 いちいちfprintする場合はdouble(倍精度)が毎回必要になるから、 コンパイラはその部分での拡張倍精度でのループを断念し、 結果的にそのループが倍精度で回っているだけのこと。 もし仮にCが拡張倍精度型 ExDouble を持っていたとして、printfもそれに対応していれば、 もしかするとその毎回printfするコードでも拡張倍精度で回っていたかもしれん。 勿論手動でそういうコードのすることも可能だ。 そこはコンパイラがどう判断したのかでしかなく、あまり詰めても意味がない。 [] [ここ壊れてます]
303 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 10:54:19.52 ID:+dwRu2dr.net] × fprint ○ printf まあ、分かると思いますが
304 名前:デフォルトの名無しさん [2018/09/17(月) 10:57:31.99 ID:dj7qSZnZ.net] で、最適化されてるかされてないかすら いまのいままで気付くことすらできない そして気付く方法すらわからなかったわけか うあわ 頭わるう。。。 キミ、プログラムくむの向いてないわ
305 名前:デフォルトの名無しさん [2018/09/17(月) 10:58:47.63 ID:dj7qSZnZ.net] 問題の切り分けができない人は プログラムはくめない コレは定説だからな
306 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 11:09:05.96 ID:ivGPGa/P.net] >>287 なるほど面白いね。 レスが膨大過ぎて最初の方しか読んでなかったけど、ネイティブコードの話と思い込んでたら .NETの話だったのかw
307 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 12:34:14.16 ID:yaPtorLJ.net] 個人的には、C++やx87 FPUは割と知識があったけど、.NET関連は余り追いかけてなかったので、気づくのが遅れた。 managedコード、unmanagedコードについて、今回初めて調べてみたくらいだし。
308 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 12:53:34.77 ID:yaPtorLJ.net] >>293 「ID:dj7qSZnZ」の人は理解していないね。 彼は人の事馬鹿にしてるけど・・・。
309 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 13:39:23.91 ID:F2vzl5VC.net] 最初に指摘されたことだろうに。 アセンブラレベルで精度や効率に介入したきゃ.netなんて使うな、なんて分かりきったこと。
310 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 14:58:46.52 ID:zCVYDMXL.net] エディタ使ってるとたまに Intellisense機能が効かないときがあるんだが あれなんなの? 中間ファイルとか消せば直るの?
311 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 17:03:46.83 ID:+dwRu2dr.net] >>301 はい。よく壊れます。 > [C++] There is an issue with the .ncb file > Close the solution. > Delete the . ncb file. > Reopen the solution. > Reopening the solution creates a new . ncb file. > https://msdn.microsoft.com/ja-jp/library/ks1ka3t6(v=vs.110)
312 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 17:17:56.66 ID:zCVYDMXL.net] >>302 なるほど .ncbファイルね 今度消してやってみるわ
313 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 18:30:58.83 ID:+dwRu2dr.net] さて俺の本番コード、以下のようだ。 疑問は解消した。協力してくれた皆様ありがとう。 ◎:拡張倍精度、○:倍精度、として、(ソースは>>192 参照) ・Releaseビルドをコマンドプロンプトから起動→◎積和、◎平方根 ・Debugビルドをコマンドプロンプトから起動→◎積和、○平方根 ・IDEから起動→○積和、○平方根 これで3種類出来上がってた。 (なお、>>167 内バイナリをアタッチした際の「AまたはC」は、「AまたはB」の間違い) そしてIDE上で『[モジュールの読み込み中に JIT 最適化を抑制する]』を変更すると、 確かにRelease/Debugの2種類に絞れる。 Debugだからといって、全く最適化がかからないわけでもないようだ。 (1行内なら最適化がかかる?) 参考に、Releaseビルドの該当部分の逆アセンブルは以下。 積和が拡張倍精度で行われ、そのまま fsqrt で平方根が取られる。 (関数ごとインライン化されているのでアドレスが中途半端だが) double retval = calc_norm_and_regulate(count, vec, false); 0000003e fldz 00000040 xor edx,edx 00000042 test esi,esi 00000044 jle 00000056 00000046 lea eax,[esp+28h] 0000004a fld qword ptr [eax+edx*8] 0000004d fmul st(0),st 0000004f faddp st(1),st 00000051 inc edx 00000052 cmp edx,esi 00000054 jl 00000046 00000056 fsqrt 00000058 fstp qword ptr [esp+10h]
314 名前:デフォルトの名無しさん [2018/09/19(水) 17:24:44.24 ID:GzaYiinu.net] VC++2008だけど、突然一部のファイルだけブレークポイントが入らなくなった・・・ .ncb消したり、そのプロジェクトだけリビルドしたけど直らない 全リビルドすればおk?
315 名前:デフォルトの名無しさん mailto:sage [2018/09/19(水) 18:59:08.26 ID:KTUM/Tgt.net] >>305 根本的な解決策とは違うが 「ブレークポイントは現在の設定ではヒットしません。ソースコードが元のバージョンと異なります。」 なら [オプション] の[デバッグ]から[元のバージョンと完全に一致するソース ファイルを必要とする] をオフで
316 名前:デフォルトの名無しさん mailto:sage [2018/09/20(木) 12:44:39.12 ID:rLmEYUhk.net] >>306 ありがとうございます。 結局、全リビルドでも直らなかったので、.sln と .vcproj 以外全部消して Windowsも再起動して完全にまっさらな状態にして全ビルドしたら直りましたが、 そのうちまたブレークポイントが入らなくなったので、>>306 の方法で 回避しました。
317 名前:デフォルトの名無しさん [2019/06/19(水) 14:12:16.93 ID:Yoy0IPRe.net] お、おう
318 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 14:14:25.88 ID:gozwERy2.net] C++ CLRのWindowsフォームアプリ作ってると、 イベントとか記入するときインデントがおかしい(スペースが1つ付く)んですが、 これを直す方法ってありますか?
319 名前:デフォルトの名無しさん mailto:sage [2019/10/06(日) 21:09:30.88 ID:xhkeezXX.net] テンプレート特殊化ってVisualC++2008 SP1 ではできないですか?
320 名前:デフォルトの名無しさん mailto:sage [2019/10/06(日) 21:48:55.66 ID:xhkeezXX.net] >310 https://programming-place.net/ppp/contents/cpp/language/023.html こちらでできました、スレ汚しすみません
321 名前:デフォルトの名無しさん [2021/04/20(火) 20:00:45.05 ID:rVJPu0WM.net] わからないので教えてください。 シリアル通信をするプログラムを作りたく、 VS2008にて、「SerialPort」を使え、というのが サイトにあったのですが、 ツールボックスにSerialPortがありません。 追加する方法を教えてください。 使用環境:VS2008 C++ MFCアプリケーション
322 名前:デフォルトの名無しさん mailto:sage [2021/04/20(火) 20:36:15.98 ID:mPkgRyxP.net] ねぇねぇ今日は何処まで逝こうかな〜 COMはネイティブなのかね
323 名前:デフォルトの名無しさん mailto:sage [2021/04/23(金) 21:39:54.21 ID:OsunfFOw.net] >>312 SerialPortは使ったこと無いから知らんが、 その程度のことを自力で解決出来ない奴が今更VS2008でしかもMFCとか無理だ。 サイトを参考にするのもいいが、日付は必ず見るようにしろ。 .NET serial port で検索すると以下が当たるし、今なら普通にこれだと思うが。 https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport?view=dotnet-plat-ext-5.0 どうせ見えた展開だし、面倒だから先に言っておくが、 お前のやってることは初心者のあるある ・そもそもやり方を間違っているのに、それ以外の解決方法を認めない ・正しいやり方を教えても、それは聞いてないとして受け付けない だ。だからどうせこれから文句も言うのだろうが、重ねて言うが、 今更その環境(VS2008+MFC)はあり得ないくらいの異常さだ。 お前が初心者で何も知らないだけなら、常に最新の環境を使うように心がけろ。それだけで無駄なことに嵌りにくくなる。 その環境に拘る何らかの理由があり、それを強いてきた上司等が居るのなら、まずそいつに聞け。 聞く人が居ないのなら、今のお前にその環境でやりきる能力はないから諦めろ。
324 名前:デフォルトの名無しさん mailto:sage [2022/02/16(水) 02:27:10.00 ID:ky7QDxn6.net] 記念カキコ
325 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています