「C++」に関する日記

プログラミングとドラゴンクエスト10

プログラミング

予告通り、更新しました。
やっぱり選択ソートじゃねえか!

ドラゴンクエスト10(全員)

銃士ナスビス

  • クエスト「まもの博士の研究レポート」をクリアした!

時機を逃して同盟を組めずずっとできてなかったのですが、この度全員クリアしました。

毎月10日はDQ10で遊ぼう! ~もうすぐ協力チャレンジバトル開催! 仲間モンスター大特訓!!~ (2024/9/3)|目覚めし冒険者の広場
このイベントですな。
ァォィョッュはソロ派なので、極力同盟組まずに頑張りたかったのですが、やっぱり無理だったのでここは妥協して同盟組んでクリアしました。

他の写真は以下から。
写真置き場「2024/09/10」

C++

Contractという概念を知った。
契約プログラミング自体は聞いたことがあったが、将来のバージョンで言語機能として追加されるらしい。
関数の引数や戻り値の条件を明示し、自動的にチェックされるというもの。
C#にも欲しい。PHPにはもっと欲しい。

Boost--

NeoMuplの読み込みのほうの高速化もできたのでアップしました。
これで大分完成に近付きました。
OGGの演奏についてはNeoMupl側では何も対策はしないつもりです。
OggVorbisはそもそもあまり聞きませんし、それにDirectShowへの追加機能としてユーザーが任意につけられる機能なのです。
曲名自動取得とファイルからループ位置を取得についてはできそうなら挑戦してみる、といった程度ですね。

どうもBoostはVC++6ではRegexとかSpiritとか、Boostの最大の魅力にあたる部分が使えないことが多いようです。
VC++.NET2003なら全部対応らしいですが。
VC++2005EEはもってるけど正直あまり使おうという気になりません…。

ハ、ハラが痛いので今日はこの辺で…。

ブースト

マザー3クリアしました。
ん~…しかしねぇ。
「さあ泣け」と言わんばかりのラスト付近の演出には正直興ざめでした。
今更出てこられても困るキャラに、忘れてたのであわてて加えましたといった感じの1・2との繋がりに、そしてラスボスが○○××(自主規制)
正直ネンドじんの健気さに一番泣けました。
あとプログラム的に問題のある部分も多かったように感じました。
フィールド上の移動が快適じゃないんですよね。
特に人が多い狭い道を散々走り回らされた最終章はかなり苦痛でした。
しかも人が増えたんで何言ってるのかと思えばスタッフが投げやりになったとしか思えない聞いててうんざりするような無意味な単語しか喋らない人間ばかり。
あいつら全員ブタマスクにしてブヒーとか言わせておいたほうがよっぽどよかったのに。
浜辺で出会ったあの無自覚なカップルのようないいキャラもいっぱいいたんですけどね。
それにしても納得いかないのは最後の耳にたこができるほどの感謝の嵐。
正直豚どもの手の内で踊らされていただけという印象しかなかったためありがとうと言われても違和感しか湧いてきませんでした。
それはそれはおいといて…

今日Boostをインストールしました。
C++の強力なライブラリ群です。
実はずっと前に一度インストールに失敗していたのですが、今回Boostの本を見つけたので改めて挑戦することにしたのです。
ところがやはり今回もエラーが連発。
前回はここで失敗したと思って諦めたのですが、今回少しエラーメッセージの流れを止めて全体を見てみると、どうやらエラーが出ているのは一部だけのようで、大部分はうまくいっているようだったので、そのまま我慢して続けていたらなんとかインストールが終了しました。
しかしやはり一部には使えないものもあるようです。
確認した中では、shared_ptr、shared_array、weak_ptr、scoped_ptr、scoped_array、tokenizer、format、が使えて、intrusive_ptr、lexical_cast、regex、が使えなかったようです。
intrusive_ptrはともかく、lexical_cast、regex、はすごく使えそうだったので残念です。

VC++2005EEでWindowsプログラム

VC++.NETでVC6のインクルードファイルとライブラリを使ってWindowsアプリケーションを作るのに成功しました。
しかしやはりVC6とかなり勝手が違い、標準関数と自作関数以外はオートコレクトもないし、よく見たらVC6でも一応設定はできないけど最適化は自動でやってるみたいだし、やはりC++に関してはまだまだVC6メインでいったほうがよさそうです。

今日はMIFUMIDIAの次の更新のためいきなりアプレットの仕様が変更になっても対応できるようにCGIを手直ししていました。
どうにも今の仕様じゃ続きから作る機能が実装しにくいんですよ。

青と白

ブルーリゾートとホワイトアイス完成です。
今度はブラックシティ…アルタイルタワーはでかいから大変そうですが…。

そうそう、DirectX10SDKをダウンロードしました。
VC++6では引き続きDX8ですが.NETには.NET用のSDKがあるようなので。
そうそう、VC++6と.NETといえば、前の更新のときにわかったのですがVS2005EEって、最適化ができるんですね。
VC++2005EEは最適化ができるけどWindowsネイティブプログラムは作りにくい。
VC++6.0SSはWindowsネイティブプログラム作り放題だけど最適化ができない。
そしてVC++2005EEではスタティックリンクライブラリが作れます。
となれば、VC++2005EEでスタティックリンクライブラリを、目いっぱい速度優先にして作り、VC++6.0SSでそれを利用してソフトを作るのはどうかと思ったわけです。
プラットフォームSDKを使わなくて済んで、効率のよさが求められるアルゴリズムではVC++2005EEでライブラリを作って、メインのVC++6.0SSに組み込むんです。
次の更新は、VC++6.0SSで、直接コードを書いて最適化なしで実行するのと、最適化されたライブラリを呼び出して実行する場合の実行時間を比較する、ってのがいいかな。
で、早速ライブラリ一つ作ってみたんですが、もうびっくりするほど簡単でした。
ソースのCPPファイルを追加して一個関数書いてコンパイルしたらそれだけで一個の関数があるライブラリの完成。
難しそうだったら効率は度外視しようかと考えていたのですが、これはさすがに度外視するにできませんね。

C#

しかしVC++.NETを触ってみた感想、.NETにあわせてC++が結構拡張されてるみたいです。
^って何よ。
下手したらMFC以上にタチ悪いかも??
^というのはどうにもオブジェクトのハンドルらしいです。
gcnewで生成したオブジェクトを代入しているあたり、どうもガーベジコレクタが働いて、使われなくなったら自動的に解放されるらしいです。
しかし、後付けの機能が増えるに従い際限なく複雑化するC++がいい加減嫌になってきたので.NETはC#にすることにしました。
VC++2005はWindowsネイティブもできるから選んだというのに色々面倒なステップが必要な上にRADツールもつかずSDKは英語ということで、とても実用に堪えるものではなく、騙された気分でした(VC6があるので)。
というわけでVC#を導入。
なんかこれはこれでライセンス登録が必要らしいです。
でも少なくとも.NETに無理矢理C++を当てはめたVC++.NETよりは見通しがよさそうな気はします。

ドットネット

ドラクエ8のもう一つのエンディングを見てしまいました。
本当はただラスボスのマダンテが見たかっただけだったんですが、たいした技を使うひまもなくあっさりお亡くなりになられたのでそのままエンディングに入ったのですが、そこでアルゴンリングをもっていることに気づき、ククールにも指摘されたのでちょっと王様に見せてみたらなんか駆け落ちするはずだったところが堂々と結婚できることになり、チャゴスが前にも増して気の毒なことになってしまいました。

今日はMFCの練習もかねてキャラボックスのC++バージョンを作ろうとしたのですが、MFCをどう使っていいのか、画像形式は何が使えてどこまで表示できるのか、などがわからず断念し、.NETならどうかなと思ってVC++2005Expressをインストールしてみました。
ただ、インストールに時間がかかってしまったので本格的に使い始めるのはまだ先になりそうです。

constの位置関係

慣れないことをしたため早速失敗しました。
爆ボンマップ作成プログラム、マップチップの演算子をオーバーロードしてsetに入れたときうまく動作するようにする手はずだったんですけど、オーバーロードのやり方を間違えていたためオーバーロードではなく無関係な演算子を定義したということにされ、定義したはずの演算子が定義されていないことにされてしまっていました。
どうも、比較演算子の使用中に比較すべきデータそのものが変更されてしまってはまずい(例えば、a<bという比較をしただけでaやbの値が変更されてしまっては比較の意味がなくなる)ため、データに勝手な変更ができないようconstを付けて作らねばならなかったようです。
しかしそこがそれ、constを書き込み禁止程度にしか理解していない私のこと、constをつける位置を間違えてしまいまして。
bool operator<(const CMapData& rhs) const { return m_Depth<rhs.m_Depth; }
とすべきところをあろうことか
const bool operator<(const CMapData& rhs) { return m_Depth<rhs.m_Depth; }
としてしまっていたのです。
前者は{ return m_Depth<rhs.m_Depth; }を書き込み禁止に、後者はbool型の比較結果を書き込み禁止にしているのですが、boolは値を返した後即座にコピーが作られ、そのコピーのほうが使われるため、constはあってもなくても関係ないんですよね。
でまあ、そこんとこはうまくいったので、今度はエディットに必要不可欠なカーソル位置と選択中のチップデータと範囲選択の範囲を用意。
そしてカーソル表示用のレイヤも作り始めています。

ふにゃさん、ふにゃ第一作のステージを引き継いだり配布用のステージを用意したり、そういうことを手軽に行えるように、と思い、方法を考えてみました。
まず、配布用のステージは現在では編集用のステージを作成した後に「圧縮」を選ぶことで配布用のステージを作成します。
しかし、この方法だと、編集用ファイルと配布用ファイルを別個に用意することになり、テストプレイは編集用、それとは別に配布用、と分けて使うと、ステージ作成者の手元には内容がほぼ同じの2つのステージができることになり、プレイに支障が出ることは必至です。
そこで考えたのですが、保存するときに編集用と配布用の両方を同時に記録して、本体のほうからは配布用=プレイ用のステージしか読み込まないようにすれば、配布用は常に最新だし、テストプレイも楽々、他人のステージは編集ファイルが無いのでプレイはできても編集不可能、というわけで、ディスク容量を考えなければこちらのほうがずっとよい方法なのです。
そして、1からのデータの引き継ぎについては、1のステージメーカーのほうでふにゃさん用の編集ファイルを作れるようにしておき、それをふにゃさんエディタで改めて読み直して保存するとプレイ用ファイルができて引き継ぎ成功ということになるわけです。

セキュリティと大小関係

ミディビで保存ができなかった原因がほぼ特定できました。
http://support.microsoft.com/default.aspx?scid=kb;ja;175622で見てみると、どうも我々のアプレットは信頼されていないため、クライアントであろうとサーバーであろうと関係なく保存できないようです。
お絵描き掲示板はどうなっているのかと見てみると、アプレットから画像ファイルのデータの中身がそっくりそのまま送られてきていて、それをCGI側で保存するようになっていたのですが、これは今回のようなセキュリティの問題だったのかもしれません。
そこで自分もそれに倣ってCGIにデータを渡す方法を考えることにしました。
MidiSystemのwriteメソッドにはFileクラスを渡して直接ファイルに書き出してもらうものともう一つ、OutputStreamの派生クラスを渡して自分で作った出力ルーチンに書き出すものがあって、それを使うと、出力先を自由に変えることができるんですね。
ここで、Socket通信によってデータ受け取りCGIに出力すると、セキュリティに問題の無いCGIから保存ができるようになるということです。
アプレットからCGIにデータを渡す方法などについてはhttp://www.sm.rim.or.jp/~shishido/cgij.htmlなど。

LineConstructorを使っていたら、大きなファイルを開いたときにエラーが起こりました。
機能の足りない部分があってもバグはない自信があったので少しショックだったのですが、原因はどうやらスクロールバーが大きな数に耐えられなかったことが原因だったようです。

今日はチャットにクッキー保存機能をつけました。
本当ならGBBSのプロフィール機能と連動させたかったのですが、それぞれで必須とされている要素が異なり、GBBSのプロフィール自体もまだ発展途上であるため、連携するようにするのは控えておくことにしました。
まあそんなこんなでアルニックはレベル24達成。
目指せレベル30です。

爆ボンのための3Dマップソフトを作成中です。
3Dマップはどの方向にどのようにマップが広がるか分からないし、マップのほとんどの部分は空白状態なので、2Dのときのように二次元配列を用意してそれぞれにマップチップを、というわけにはいかないので、STLのsetに、マップ上の位置とチップ情報を詰め込んだクラスを入れて、順序付けされた配列として扱っています。
なぜ順序付けされた配列にする必要があるかというと、描画段階において確実に奥のチップから表示するためには奥行きでのソート(Zソート)が不可欠であり、マップチップが動かず、視点も動かないことを考えると、描画の時点でソートするより、最初からソートされた配列に順序を狂わさないようにデータを入れてゆけばそのまま最初の要素から順番に描画してゆくことで簡単に描画ができるようになるためです。
しかし、クラスはそのままでは大小関係を見て順序付けすることができないので、operator<だとかoperator>だとかを使って大小関係をつける関数を自作(いや、この場合演算子を定義か)。
なにしろsetにぶち込んで利用するからには値のように扱えるようにしなければならないので、他にもコピーコンストラクタやらoperator=なども考える必要があったりして、結構いい刺激になりました。
もっとも、コピーコンストラクタとoperator=についてはC++が勝手に書いてくれてるので自分で書く必要はないはずですが。

ヘッドフォン

学校のパソコンで昨日に引き続き3Dを頑張ってみました。
とりあえずネットでサンプル明後日適当に自分なりに書き換えて2Dポリゴンを表示して自己満足して3Dポリゴンも調子に乗ってやってみようとしたら突然リンカエラーが!
libci.libが見つかりませんって言われたって、そんなのリンクするような設定はしていないのですが・・・?
で、勿論早速MSDNライブラリで調べてみたわけですが、見つからない。
帰ってからもう一度調べてみたら、「古い iostream ライブラリ」とのことで、「最新だったら新しいの使えよ!!」などと思ってみたりもしたのですが、新しいのにどうやって変えればいいのか、新しいのに変えることで不具合が起きるんじゃないか、新しいのがまだ古いのを使ってるのに何故に古いものを切り捨ててしまったのか、などなど気になってしまって、別に何もしませんでした。(何

「ByteEdit」を更新しました。
選択内容を検索します。
ついでに言うと、ドラッグによる範囲選択と右クリックにもこっそり対応させたので、検索したいバイト列をドラッグで反転→右クリックから検索で、簡易ながらもバイト列の検索ができるようになりました。
そこそこ拡張しやすい形になっていたので両方ともちょっとだけ手を加えただけで実現できました。
こんな感じですぐできる更新をちょっとずつやって行くことにしてます。

前にヘッドホンが壊れてしまっていたので、学校の帰りにヘッドホンを買ってみました。
買いに行くと、6000円くらいのオープン型・3000円くらいの密着型・2000円くらいの密着型・1000円程度のオープン型があったのですが、6000円のは完全に予算オーバーで問題外、1000円のは用途から考えてふさわしくないと感じ却下、3000円のは2000円のと比べてどこがいいのかわからなかったので結局2000円のにしました。

ピクミンその他のゲームのページ、気が向いたのでアップしてみました。
ついでにリンク集もちょい整理。
そんでもって新日記公開。

案ずるより生むが安し(←字が違う)

そういえば基底クラスと派生クラスってコンストラクタとデストラクタが呼び出される順ってどうだったっけ。
と思ったので、早速実験用のプログラムを作ってみました。
基底クラスAとそれを継承した派生クラスBを用意し、それぞれのコンストラクタとデストラクタにメッセージを表示するコードを書いて実行時にクラスBを生成!
結果は、予想通りに「Aのコンストラクタ→Bのコンストラクタ→Bのデストラクタ→Aのデストラクタ」でした。
これまでは念のため基底クラスには初期化のコードを書かないようにしていたのですが、これからは心置きなくコンストラクタで初期化できます。
一応、ダウンロードできます。

3DはZバッファを部分のコードを写すところで面倒になって中断しました。
とりあえず今度からは「ふにゃさん」の制作のほうに取り掛かって、3Dは思い出したときにでも、ということにしておきます。

今日は一教科だけテストがありました。
最後の問題で、答を導き出す簡単な一次方程式まで作って、いざ解こうとした瞬間に、
「はいそれまでです」
・・・・

無題

右上の「返信」「削除」は気にしないでください。

C++ってなかなか面白いです。
特にポインタだとかクラスだとか文字列の扱いだとかが独特で面白いです。
あるC++のプログラムにあったもの…

文字列を扱うクラス配列の先頭へのポインタの参照
こういうのってある関数の中で引数に渡された配列のサイズなどを変更したい時などに使えそうです。
あと、型キャストなんかもありますね。
どんな型のものでもいいから何かのデータの入った配列の先頭へのポインタをバイト型へのポインタとみなしてそのいくつか先のポインタをクラスのポインタに変換してそれをそのままクラスとして使う。
こんな使い方だってできてしまうのです。
面白いですね(ややこしいの方があってるかも)。