cpp

VisualStudio 2015のC++プロジェクトで*.pdb/*.iobj/*.ipdbを生成させない場合のメモ

Mohmongar
VisualStudio 2015のC++プロジェクトで*.pdb/*.iobj/*.ipdbを生成させない場合のメモ。なおpdbファイルとはデバッガ情報のファイルで詳しくはこちらを参照ください。*.iobj/*.ipdbはリンク時の高速化にかかわるファイルで実行時には使わないみたい。 *.pdbを生成させない プロジェクトのプロパティ→[構成プロパティ]→[リンカー]→[デバッグ]の[デバッグ情報の生成]を「いいえ」にする。 *.iobj/*.ipdbを生成させない プロジェクトのプロパティ→[構成プロパティ]→[リンカー]→[最適化]の[リンク時のコード生成]を「既定」にする 参考はこのVisual C++ のWin32プロジェクトで iobj, ipdb ファイルを生成しないようにする | たにたにっきです。陳謝。

Windows10でIPolicyConfigのGUIDの変更(2)

Mohmongar
気が付くとIPolicyConfigのGUIDがまた変更になったようで、自作のDefaultデバイス変更プログラムでエラー。前回と違いCoCreateInstanceでエラーではなく、SetDefaultEndPointでエラーとなる。動くGUIDは、”f8679f50-850a-41cf-9c72-430f290290c8”とWindows7の時と同じIDに戻ったようだ。前回の時のエラーは1501に変わった直後くらいなので、1607で戻ったのかな?

Windows10でIPolicyConfigのGUIDの変更

Mohmongar
IPolicyConfigのGUIDがWindows 10 で変更になったため、SetDefaultEndPointでエラーになる(正確にはCoCreateInstanceでエラーになる)。とりあえずGUIDをIUnknownのGUID "00000000-0000-0000-C000-000000000046"にすれば動く。ルートIDなので当たり前・・(Windows 7の時は"f8679f50-850a-41cf-9c72-430f290290c8")。参考は[Windows 10 - IPolicyConfig GUID change. · Issue #13 · xenolightning/AudioSwitcher · GitHub:]です。

c++のeofは事後確認

Mohmongar
C++でfstreamを使ってファイルアクセスをしたとき、eofの動きがCのFileライブラリとかの動きと違うことに気がついた。Cの場合は「読む前にもうデータがないことがわかる」が、C++のstreamの場合は「読んでみて初めてデータがないことがわかる」である。 #include <iostream> #include <string> #include <fstream> using namespace std; int main(void) { ifstream ifs("test.txt"); char c; while (!ifs.eof()) { c = ifs.get(); cout << hex << (int)c << endl; } return 0; } を動かすと、 $ cat test.txt abc $ ./test 61 62 63 a ffffffff $ とよけいなfffffff(元はcharの0xff)がつく。最後の改行(LF=0x0a)を読んだあとeof()はtrueにならないのである。データがない状態でgetやreadをして、ないことがわかるとやっとeof()がtrueになるのである。さきほどのプログラムを期待通りに動かすには、読む前にeofチェックではなく、読んだ後にチェックすべきである。 #include <iostream> #include <string> #include <fstream> using namespace std; int main(void) { ifstream ifs("test.txt"); char c; for(;;) { c = ifs.get(); if (ifs.

QucsのVHDLシミュレーションの不調

Mohmongar
ちょっとQucsを使う機会があり、Windows版をダウンロードして、VHDLのサンプルを作ってはいろいろいじっていたがどうもたまにシミュレーションがうまく動かない。VHDLをいじって新しく追加した入出力端子がグラフの選択肢に現れない。いろいろ調べてみると、どうも.qucsフォルダ以下にできるdigi.ccが更新されていない。これはVHDLファイルからC++ファイルに変換した時にできるC++のソースだ。どうもVHDLがCC変換できずにエラーが出てるのに、そのまま前のビルド?を使ってシミュレーションまでしてしまっているようだ。事前の策として、QUCSDIGI.BATに以下のエラーチェックを入れて、エラーだとシミュレーションまで進めないことで解決。Windows環境のみの問題か?ちなみにうちのfreehdl-v2cc.exeはコマンドラインで実行時に構文エラーで停止すると、「途中で動作を停止しました」とダイアログがでる。動作環境はWin8.1 64bit。 echo running C++ conversion... freehdl-v2cc -m %NAME%._main_.cc -L"%FREEHDL%/share/freehdl/lib" -Lvhdl -o %NAME%.cc %NAME%.vhdl REM ここから追加 if NOT "%ERRORLEVEL%"=="0" GOTO :vhdlerr REM ここまで追加 : REM ここから追加 :vhdlerr echo VHDL convert error exit /b 1 goto end REM ここまで追加

宙ぶらりんelse問題(dangling else problem)

Mohmongar
宙ぶらりんelse問題(dangling else problem)[wikipedia]。 if文でthen節にifが重なる場合、続くelse節が前者のifのものか、 後者のifものか決定できる要素がない。調べもの中に見つけたのでメモ. if (a) if (b) c; else d; つまり上の文(C言語例)だと if (a) { if (b) c; else d; } と if (a) { if (b) c; } else d; どちらかわからない。 通常、then節のブロックを明示してどちらか決定する。

Windows 7でCプログラム上から、ある再生デバイスを「既存の再生デバイス」として設定する

Mohmongar
Windows 7でプログラム上から、ある再生デバイスを「既存の再生デバイス」として設定するには、IPolicyConfigオブジェクトからSetDefaultEndPointメソッドを使う。Microsoftのundocument apiなのでいつか使えなくなるかも。 参考にしたのはイム日記とZorn Softwareとそのsvnにあるサンプルソースです。特ににヘッダはここ。Thanks! HRESULT hr = CoCreateInstance(__uuidof(CPolicyConfigClient), NULL, CLSCTX_ALL, __uuidof(IPolicyConfig), (LPVOID *)&pPolicyConfig ); hr = pPolicyConfig->SetDefaultEndpoint(defaultTag, eConsole);