C++」タグアーカイブ

高速なatoiとatof作ってみた。

必ず数字が引数に渡されるという限定した状況に限り使用可能な、atoiとatof(数字文字列を数値に変換するC言語関数)を作ってみました。
作ってみたっていうか、こちらの丸パクリして、ほんのちょっとさらに高速にしてみただけですけど。

続きを読む

rdbuf->in_avail()でファイルサイズ取得は危険じゃね?

もしかしたらWindows環境だけのことで、他のOSでは問題ないのかもしれないけど(いや、そんなことはないと思うけど)

C++でファイル読込みするときに、fstreamだけを使ってファイルサイズを得る方法をググると、

//ファイルを開く
ifstream ifs("test.dat", std::ios_base::binary);

//ファイルサイズ取得?
streamsize size = ifs.rdbuf()->in_avail();

なんて感じのコードが結構でてくるんだけど、ちょっと待って欲しい。

in_avail()の戻り値はMSDNによると

バッファから読み取ることが準備完了している要素の数です。

ということで、ストリームバッファ内で現在利用可能なバイト数なんですよ。

なので、小さなファイルならいいけど、ストリームバッファのサイズを超えるファイルのサイズを得ようと思っても、バッファの上限までしか得られない。
環境によって違うかもしれないけど、さっき試したら4096以上は返ってこなかった。

じゃぁどうしたらいいかというと、

//ファイルを開く
ifstream ifs("test.dat", std::ios_base::binary);

//ファイルの最後の位置(=ファイルサイズ)を得る
size_t fileSize = (size_t)ifs.seekg(0, std::ios::end).tellg();

//ファイル読み取り位置を先頭に戻す
ifs.seekg(0, std::ios::beg);

コレで正確なファイルサイズが取れる。

速度はもしかしたらin_avail()の方が早いかもしれないから、扱うファイルのサイズが小さいことが解ってるならin_avail()を使った方が良いのかもしれないね。

ゲーム用ライブラリ

度々発生する「なにか作りたい病」が、今のニート生活中ずっと続いてたりします。
で、ゲーム作ろうとするんだけど、ライブラリを色々試してみて途中まで作って止めたりしてます。

そんな訳で、現時点でもっとも実用性の高いと思われるゲーム用ライブラリを紹介。有名だから今更って感じだけど。

続きを読む

CとC++

CとC++は似たようなモノか?
プログラマになって10年以上経ちますが、この1年でようやくC++でまともになにか組めるようになった私です。

題の「CとC++は似たようなモノか?」という問いは、回答者によって変わるモノじゃないでしょうかね。
C++を「オブジェクト指向もつかえるC言語」と見るか、「オブジェクト指向言語C++」と見るか。

オブジェクト指向言語を先に覚えた人ならば、CとC++は別言語として見るだろうし、C++をオブジェクト指向的に使うでしょう。
正しくオブジェクト指向を理解して、C++をそのように使える人も別言語として扱うんじゃないでしょうかね。

でも、C言語から何となくC++やってる人の多くは、「C++はCの拡張」くらいにしか思ってないんじゃないかと。

「C++でゲーム開発」的なユルいプログラム入門書とか、C++って書いてあるのに使い方はほとんどC言語のままで、API呼び出しのために仕方なくクラスやインターフェース使ってるっていう感じの書き方してある本が結構あったり。

オブジェクト指向は開発効率のために処理速度を犠牲にしてる部分があるから、処理速度がシビアなゲーム開発では非オブジェクト指向になりがち・・・というのも解らなくはないけど、「ゲーム開発で覚えるC++」的なタイトルの本でも拡張C的な書き方してないのがあったりするのはどうなのよ。と、偶に思う。

私はCとC++は別言語だと思ってるけど、拡張C的に使ってる人には拡張Cにしかみえないんじゃないでしょうかね。

VC++6でGDI+メモ

追記
2011年4月の時点で、まだこの記事にソコソコのアクセスがあるようなので一応書いておきますが、この記事に書かれている「PlatformSDK February 2003」は、たぶんもう手に入りません。(少なくともマイクロソフト公式からはダウンロード出来ない様子)
どうにかしてPSDKを探すか、GDI+を諦めるか、VC6を諦めるかなさそうです。
VC6を諦めるをオススメ

更に追加
2017年7月時点でMSDNで検索した結果、一応まだダウンロードできるようです。
https://www.microsoft.com/en-us/download/details.aspx?id=12261
もしまたダウンロード出来ない(上記URLが無くなってる)としても、MSDNで「PlatformSDK 2003」で検索すると出てくるかもしれません。
また、下記のインストールの方法とは変わっており、インストーラーでインストールするので簡単になっているようです。

Javaとか.NETみたいな、メモリ管理を自動でやってくれる言語に慣れきったヌルプログラマの私は、C言語みたいな自分でメモリ管理しなきゃいけない言語が拒絶反応がでるくらい苦手になってたりします。
が、仕事では好き嫌いできないわけで、先週もVC++で画像を読み込んだり表示したり保存したりするプログラムを組むことになったのですが、けっこうハマったのでメモしておく。

同じようにハマってる人が、一人でも救われれば、このエントリーは十分な意味を持つだろう。
とか言ってみたり

続きを読む