プログラミング言語 C++

C++でメモリストリームを扱う方法

C++はファイルストリームやストリングストリームはあるのに、何故かメモリストリームが存在しない!!! 今回はストリングストリームをメモリストリームとして扱う方法を紹介する。 まずは出力ストリームの使い方だ。 #include <iostream> #include <sstream> #include <vector> int mai</vector></sstream></iostream>…

VisualStudio2008 SP1 vectorのバグ?

以下のプログラムはstd::allocatorを継承して自作アロケータを作成し、実際よりも32byte多めに確保してその前後に 固定値を入れ、解放時に固定地を書き込んだ領域に不正書き込みがないか確認するものである。 #include <stdio.h> #include <map> #include <vector> #include <string> struc</string></vector></map></stdio.h>…

データ整合性チェックについてうんたらかんたら

まったく更新していないのでたまには、何か書くかなってことでデータ整合性チェックについて 以前(2か月前)に書いたCRCチェックのプログラムは、PSPのデータインストール時の整合性チェック用に つかったもの。本来であれば、より安全性の高いMD5を使うべき…

CRC32を求めるCのコード

Javaしか書いていなかったのでC版も書いておく #include <limits.h> typedef unsigned char uint8; typedef unsigned long uint32; static const uint32 CRC32Table[] = { 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E4</limits.h>…

PSPの浮動小数点の処理遅すぎ

最近お仕事ないの・・・お金は入ってくるけどね そんなわけで、PSPで3D周りをちょくちょくいじって遊んでいます。 ソフトはMetasequoiaを使い、保存したファイルがテキスト形式なので そいつを読み込んで、PSPで表示している。 それにしても読み込みが遅い!…

定数の記述場所

外部に公開する必要があるものはヘッダーに 公開する必要がないものは、cppファイルに書きましょう。

アロケータの使い方

作成したアロケータの使い方 #include <vector> // 64バイトアラインメントでメモリ確保を行うvector std::vector<char, CAllocator<char, 64> > buffer;</char,></vector>

アロケータの作り方

STL標準のstd::allocatorには、アラインメントを操作する機能がないので 確保したいメモリのアイランメントを設定したい場合、自前でアロケータを作る必要がある #include <malloc.h> typedef unsigned long uint32; // デフォで4バイトアラインメント template <class T, uint32 N = 4> class</class></malloc.h>…

セーブとロードでの型違いは×

固定長のものはセーブとロードが同一環境であるならば、構造体にして その構造体をそのままセーブ、ロードすることで問題ない。 しかし、可変長のものはそうはいかないので、可変した際の数やらなんやらを保存しなくてはいけない。 今回、std::mapを使ってい…

戻り値ありの関数で

値を返さない(return;)は未定義動作だ。 大抵のコンパイラは警告を出してくれるから、気付こうね。

ひどいプログラムを見た

こんなのがあった。一瞬何をやっているかわからなかった。 if (IsHoge()) { // いろいろ } else if (IsHogeHoge()); else { // いろいろ } 普通こうだろ if (IsHoge()) { // いろいろ } else if (!IsHogeHoge()) { // いろいろ }

メモリプールを活用しよう

メモリが非常に厳しい環境でゲームを作る場合、最低でも1つメモリプールを作成しよう。 グローバルnewやmallocは通常のメモリからメモリを確保し、画像やサウンドなど メモリ消費が多いものはメモリプールを使うようにする。 そうしないと、メモリの断片が発…

メモリが少ないときは、std::mapよりstd::vectorを使用しよう

現在サウンドノベルを作成しているのだが、すでに一度通過したことがある場所は スキップを行うことができるようにするという処理を導入する場合、スクリプト命令一つにつき 変数一つを用意して0を代入しておき、通過したら1を代入する。 スキップ処理の開始…

std::vectorのメモリ解放

vecotrで確保したメモリは、clearメソッドを呼んでも解放されず デストラクタが来るまではずっとメモリを確保している。 そこで、以下の方法で解放することができる。 std::vector<int> hoge; // hogeのresizeとclearを繰り返す。 // 解放 std::vector<int>().swap(hog</int></int>…

WindowsAPIメモ

デバッグ時に出力ウインドウに出力するAPI OutputDebugString

おい、スクリプタふざけるな!

フラグは0〜255の256個までしか使えないぞって言っておいたのに 256番を使いやがった! フラグは配列で管理しているので、当然アクセス違反が発生していた。 なんか、勝手にスキップも起こっているので、自分が作ったプログラムに アクセス違反のバグがどっ…

おい、グラフィッカーふざけるな

昨日書いた日記のメモリ確保だが、実は作成された元データが不正で そいつを読み込んでいたことによるバグだった。 元データを作っていたのはグラフィッカーは保存形式をビックエンディアンにしていた。 今の開発環境ではリトルエンディアンで保存する必要が…

おい、勝手にメモリ持ってくな

他社ライブラリの初期化関数の一つに、メモリ確保、メモリ解放関数の指定を 行うところがあるが、その設定を行ったにもかかわらず、通常のmalloc使って メモリを確保しているところがあるっぽい、それも1MBも!(全体でMAX20MBまでしか使えません) ざけんな!…

高速格納Order書き換えメモ

通常 void* dst; uint32 pitch; int xp, yp; const int ey = yp + 10; texture.Lock(dst, pitch); for (int y = yp; y < ey; ++y) { uint8* dp = (uint8*)dst+ y * pitch + xp; for (int x = 0; x < 10; ++x) { *dp++ = 0; } } texture.Unlock(); 高速 void*…

DirectXのライブラリ

PSP開発をやって半年位たつんだが、そろそろDirectXのライブラリを、修正したくなって来たぜ。 昔の俺が画像処理を周りを、いかに理解していなかったかがわかるわ。

std::vectorのメモリ保持

vectorはclearを呼んだ時点で、メモリを解放するものだと思っていたが 実はデストラクタまで解放されることはない。 しるかー!くそがー!

アクセス違反

バグの箇所がわからなくなってきたので、std::vectorをラップして バグの位置を突き止めるぞー! ・・・最初からやれよ、俺!

すたっくおーばーふろー

サウンド停止メソッド内部で、スタックオーバーフローが発生している。 最初は、初期化前にアクセスをしているから、初期化するまでは何もしない用に プログラムを書き換えたが、直らない。 よくよく見ていると、メソッドの一番最後で自身のメソッドを呼び出…

ライブラリの競合

とある事情により、3Dライブラリを2つ導入しているのだが この二つが、内部で設定をいじっているため、二つを同時に使う場面で 片方の表示がおかしくなる。 仕方がないので、俺が途中途中で設定を直してやってる。 あーめんどい。

CRIの解凍アルゴリズムってよくできているなぁ

あの実装方法なら、解凍時にワーク領域を取らなくて済むというのもうなずけるわ(実際はヘッダー分の何バイトかは別にとっている気がしなくもないが、とっても許容範囲です) ただ、あの方法をそのまま実装すると、俺の中で不都合なことが起こる部分があるから…

メモリ食いすぎ

他社のライブラリに総メモリの約1/3もってかれて、マジムカつく今日この頃

等倍表示でもテクスチャーフィルタは適応される

されないとおもっていたおー。 こいつのおかげで2日くらい、悩まされたおー。 まぁ、板ポリだから等倍といっても、本当の等倍じゃないんだろね。 解決したから今日は帰って寝る・・・わけにもいかないよね。

ファイル名指定でconstにしない理由がわからん!

今使用しているライブラリで、ファイル名を求められるメソッドがあるわけだが こいつがconst char*ではなく、char*で受け取ろうとしているため こいつをラップしているメソッドの引数のファイル名指定で const char* が使えないのがすごくムカつく。 あんま…

シェルスクリプトが使いづらい

Cygwin上でプログラムを組んでいるので、シェルスクリプトとGCC(正確には特定のプラットフォームの拡張GCC)を 使っているわけだが、このシェルスクリプトがとっても使いづらいです。 現状で使いづらい箇所は2箇所あって、 一つ目はシェル1からシェル2を起動…

Makefileを書こう

現在、GCCのMakefileを勉強中。 今まで、JavaとかBREWとかではMakefileを使用してはいたが Javaはバッチファイルのような使い方しかせず BRWEではすでに書かれたMakefileにoファイルの追加程度しかやっていなかったため きちんとした記述方法を勉強したこと…