昨日届いたんですよ。
何か色々なところで紹介されているDirectX9 シェーダプログラミングという本が・・・。
しかし、やはり古い…
要はVS2010だとサンプルプログラムのコンパイルが全く通らん(笑)
DirectXのバージョンが新しすぎるのか!とか思ってCDについてるDirectX9をわざわざ入れたのにやはりコンパイルエラー。
そもそもVS2010だとコンパイル時の警告そのものがウザったい。
出力の表示からエラー探すのも大変だよorz
リンカーの入力ライブラリに廃止となったライブラリが入っているだけが問題じゃぁないらしい。
どうやら問題は
「c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(290): error C2146: 構文エラー : ';' が、識別子 'PVOID64' の前に必要です。」
こいつと
「case 式は、整数型定数でなければなりません。」
こいつだ。
・・・チェックしてみてびっくり。
「ちゃんとC言語の文法に沿って書けよマイクロソフト!!」
前者はtypedef void * POINTER_64 PVOID64;
この書き方が問題で、後者はcaseの中に
case HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ):
こんなんが書いてあった…。(これも昔あったが今は廃止されてる)DirectXのアプリケーションウィザードで吐き出されたものらしい。
…時間を返してくれ。そしてお願いだからDirectXはちゃんと下位互換を持って作ってください…
コンパイル通すだけで1時間とか無駄すぎる(怒)
コンパイルが通らん(怒)
Re: コンパイルが通らん(怒)
Visual C# 2008 Express Editionには警告を非表示にする機能がついているので、そもそもVS2010だとコンパイル時の警告そのものがウザったい。
出力の表示からエラー探すのも大変だよorz
もしかしたら同じ機能があったりしませんか?
Re: コンパイルが通らん(怒)
>>みけCATさん
まああるにはあるんですけどね。
ただ警告も無視ばっかりしてもしょうがないので、一応つけてる次第です^^;
まああるにはあるんですけどね。
ただ警告も無視ばっかりしてもしょうがないので、一応つけてる次第です^^;
Re: コンパイルが通らん(怒)
マクロ定義を見ると文法はあっていると思いますけど。
サンプルプログラムのほうで古いWindowsSDKのヘッダファイルをコピーして使っているとか同じ名前のマクロを定義して使っているとか。
エラー内容だけ見るとサンプルプログラム側で独自に64ビット対応しようとしてハマっているような気がします。
winnt.hはDirectXSDKでなくてWindowsSDKなので。
サンプルプログラムのほうで古いWindowsSDKのヘッダファイルをコピーして使っているとか同じ名前のマクロを定義して使っているとか。
エラー内容だけ見るとサンプルプログラム側で独自に64ビット対応しようとしてハマっているような気がします。
winnt.hはDirectXSDKでなくてWindowsSDKなので。
Re: コンパイルが通らん(怒)
前者は文法ミスというよりは多重定義ですね。BaseTsd.hというヘッダーがDirectXにもPlatformSDKにもあるようで。
決して64ビット対応しようとしてるわけではありません。
後者については自分の環境でHRESULT_FROM_WIN32が
FORCEINLINE HRESULT HRESULT HRESULT_FROM_WIN32(unsigned long x) { return (HRESULT)(x) <= 0 ? (HRESULT)(x) : (HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000);}
とインライン関数として定義されていることが問題でした。
どうやらマクロを使うには
__HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND )
このように書きなおす必要があったみたいです。
こっちは完全に自分のミスではないですね^^;
決して64ビット対応しようとしてるわけではありません。
後者については自分の環境でHRESULT_FROM_WIN32が
FORCEINLINE HRESULT HRESULT HRESULT_FROM_WIN32(unsigned long x) { return (HRESULT)(x) <= 0 ? (HRESULT)(x) : (HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000);}
とインライン関数として定義されていることが問題でした。
どうやらマクロを使うには
__HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND )
このように書きなおす必要があったみたいです。
こっちは完全に自分のミスではないですね^^;
Re: コンパイルが通らん(怒)
DirectXSDKのJune2010だと無いですね。GRAM さんが書きました:BaseTsd.hというヘッダーがDirectXにもPlatformSDKにもあるようで。
決して64ビット対応しようとしてるわけではありません。
いつから無くなったんでしょうかね。
POINTER_64マクロは32ビットターゲット時には空になるはずなので64ビット対応するつもりがないのに誤って64ビット対応のコードに置き換えられているのが問題ですね。
検索してみたらVC++のインクルードディレクトリ設定に複数のバージョンのWindowsSDKやDirectXSDKが並んでいると発生するという情報がありましたけど。
ウチではいつもSDKは入れ替えてしまうので不思議とその手の不具合に遭遇することがないのですよね。
DirectXSDKのリリースノートにも、古いバージョンのSDKと混ぜると危険なので古いSDKはアンインストールを推奨、と書かれてますし。
最後に編集したユーザー ISLe on 2010年12月16日(木) 18:21 [ 編集 4 回目 ]
理由: POINTER_64マクロについて追記
理由: POINTER_64マクロについて追記
Re: コンパイルが通らん(怒)
わざわざ調べていただきありがとうございます。ISLe さんが書きました:複数のバージョンのWindowsSDKやDirectXSDKが並んでいると発生するという情報がありましたけど。
どうやらおっしゃるとおりのようですね。
しかし実はID3DXEffect::Passが廃止されたことでサンプルプログラムのHLSLを使ったかなりの部分を書き直さないとDirectXの新しいバージョンでコンパイルできないことが発覚し、めんどくさくなって付属の古いDirectXを使っていました。
結果的にパスの順番を入れ替えたら普通にビルドできたので、現状はそれで満足してしまっています^^;