2013年3月24日日曜日

Visual Studio 2012でXP用のプログラム

デフォルトだと、VS2012で作成した実行ファイルはXPで動かないのかよ…
こんなことに1時間もハマッてしまった…

ここに詳しくかいてあった。
http://blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx

しかもサポートされたのはSP1からかよ…

 まあ、これで一安心と思ったが、ここでもう一ハマリしてしまった。
「プロジェクトのプロパティ」でビルドツール を"v110_xp"にして作成しても、XPで起動すると未だに「有効なWin32アプリケーションではありません」と出てしまう。

上のリンクのコメント欄での議論を読むとわかるのだが
原因は、プロジェクトのプロパティ- リンカー - システム - サブシステムの項目が空欄になっていたことだった。

新規プロジェクトを作成するとき私は「空のコンソール」を選ぶのだが、これだとサブシステムの項が空欄になる。
7ではこのままでも動くのだが、XPではしっかり指定しないとダメなようだ。


もうハマり疲れた

2013年3月18日月曜日

Fossil SCM

個人的なプロジェクトではソース管理ソフトにFossilを使っている。

使用感はこちらの方のブログ Scenery and Fish - fossil-scm によくまとめられていて、自分も同意見。

自分の環境だとWindowsのコマンドプロンプトからコミットメッセージを日本語で入力しても、文字化けせずに上手くいっているみたいだ。
ただやはり不安なので、エディタでUTF-8nで入れている。

しかし、UTF-8nで入れても、コマンドプロンプトでログを表示させると、文字が、ひらがな漢字にかかわらず、"・"になってしまったりすることがある。
ブラウザから見ればちゃんと表示されるので気にはしていないが。

そのせいか、GitにエクスポートするときにWindowsだと上手くいかなかった。
Linuxに移してからエクスポートしてみたら上手くいった。
コピペするだけで簡単にリポジトリをコピーできる仕組みで良かった。


ソースコードの文字コードは…
  • Shift-JISだと、日本語のコメントが文字化けする。
  • UTF-16(UCS-2 LE)だと、バイナリとして扱われてしまい、Fossilからソースが見えない。他のリビジョンとの差分が表示されない。
  • UTF-8nなら大丈夫。





追記:

Fossil1.25だとUTF-8nでコミットメッセージを入力すると、文字化けするようだ。
Fossil1.25のChange logを見てみると以下の文を見つけた。
Correctly deal with BOMs in check-in comments.
チェックインコメントでBOMを正しく扱えるようになった、ということだが、これのせいでBOM無しUTF-8がおかしくなったのだろうか…

ソースの文字コードは今まで通りで大丈夫なようなので、そのうち修正されることを願って、今はコミットコメントはBOM有りUTF-8で書こう





 さらに追記:

VC++はソースコードの文字コードとしてBOM無しのUTF-8nには対応していない。(http://msdn.microsoft.com/ja-jp/library/xwy0e8f2.aspx
なので、VC++使いはFossilでたまにBOMがゴミとして表示されるのは我慢してBOM有りUTF-8で保存するべし。

2013年3月15日金曜日

GLSLでreturnすると極端に遅くなる

GLSLのフラグメントシェーダで(バーテックスシェーダは試してない)main関数の途中でreturn文を入れると、極端に遅くなる。
200fpsだったのが100fpsくらいまで落ちる。
if文で分岐して、実際にその文が実行されなくても遅い。

なぜだ
キャッシュミスが起きてるのかな

2013年3月9日土曜日

Visual Studio 2012 C/C++のインテリセンスがハングアップする原因と回避方法

以下のようなコードを書いているときに、それは起こった
コード::
私は個人プロジェクトではヘッダに関数・クラス定義を書いてしまうのだが、既にいくつかメンバ関数を定義してあるクラスに、新たにメンバ変数を追加しようとしたらインテリセンスが止まってしまった (myvarのところにセミコロンが無いのは書いている途中だったから。myfuncの中身が空なのは後で定義しようと思っていたから)

VSのステータスバーに「ソリューションのファイルを解析しています…」と表示され、インテリセンスの実体であるvcpkgsrv.exeが凄い勢いでメモリを食い始め、システムがスラッシング状態になってしまいVSをシャットダウンすることすらできなくなってしまった。

その後なんとか復旧し、色々試してみると、上のコードのような状況つまり、中身がセミコロンだけの関数のすぐ上(手前)に、セミコロンを付けずに変数を宣言しようとするとインテリセンスがおかしくなることがわかった。
これの回避方法は
  • 関数定義の後にセミコロンを付けるようにする
  • IDEオプションのインテリセンス自動更新の無効化をTrueにする
  • そもそも中身がセミコロンだけの関数を定義しない
の3つあった。

一番良いのは関数の中身をセミコロンだけにしないことだ。
関数定義の後にセミコロンを付けるのも悪くない。
2つめの自動更新の無効化は、明示的に呼び出さないと(デフォルトだとCtrl + Space)インテリセンスが働かなくなるので、呼び出す前に"int myvar;"と最後のセミコロンまでしっかり書き終えてしまえば良い。


追記
上記の状況以外でもハングアップしました。もう原因がよくわかりません。取り敢えず、ヘッダオンリをやめて、しばらく使ってみます。