INIファイルの保存ディレクトリを取得する(2) / PNGけっこういいかも / 危険なコーディング / TCHARはchar? / CStringとマルチバイト / 文字列操作

投稿日: 2004年10月08日 更新日: 2017年07月22日

INIファイルの保存ディレクトリを取得する(2)

http://techtips.belution.com/ja/vc/0027/より

_tsplitpathの引数で必要ないところはNULLにすればいいからfilenameとextは必要なかった。

CString appdir;

//splitpath用
TCHAR drive[ _MAX_DRIVE ];
TCHAR dir[ _MAX_DIR ];
TCHAR path[ MAX_PATH ];

// 実行中のプロセスのフルパス名を取得する
::GetModuleFileName(NULL, path, sizeof path / sizeof path[0] );

// フルパス名を分割する
_tsplitpath( path, drive, dir, NULL, NULL ); 

// アプリケーションディレクトリ文字列を作成
_tmakepath( appdir.GetBuffer( MAX_PATH ), drive, dir, NULL, NULL );
appdir.ReleaseBuffer();

return appdir; 

PNGけっこういいかも

昨日のSVGの調査のメモに関して、libpngを使ってはどうかとツッコミをもらった。

libpngだとjpegとかgifとかと手間とか手順とか一緒かなー、と思ってて気づいたんだけど大事なことを書くのを忘れてた。「数値データ」は座標データのことで、本来の目的では画像にしたいというのはグラフ化したいのではなくて、実際に座標から点なり線を描画して視覚化したかったのである。

ツッコミの方の名前欄はGDだったのでおそらくグラフにすることを考えて、GDとlibpngを使ってはどうかということだと思う(違ったらごめんなさい)。ていうか昨日の書き方(数値データ)だとそう思うのが普通かも。

で、グラフについては考えてなかったんだけど、統計情報も取るのでグラフを出すのはそれはそれでやってみたい。グラフライブラリに関してもGDに限らず他にもありそう。

今かいてて思ったんだけど、座標データから点/線を描画してSVGなどのベクタ画像じゃなくてラスタ画像作るときのフォーマットとしてはjpegは妥当じゃないな。にじんだりするとまずいし。gifについても256色だと線に色とかつけてくとちょっと心許ない。pngなら劣化も無いしlibpngで手軽に扱えそうだし色も十分。アルファチャンネルも利用できるし、レイヤーの概念はあるんだっけ?SVGよりは枯れてるし案外良いのでは・・・。もちろん他にも山ほどラスタ画像フォーマットはあるけど、TIFFとか枯れすぎててつまらないし。WEB方面では性能を活かしきれてないPNGだけどゲームやらこういうときにはとても便利なフォーマットだ。Thanks gdさん。

相変わらず思考そのままメモってるから話がとびとびになってるけどそのまま発行。

危険なコーディング

if( a == 0 )
{
}

こう書くつもりで、下のように書いてしまった。

if( a == 1 );
{
}

VCのワーニングですぐに気づいたけどあやうかった。

TCHARはchar?

TCHARって_UNICODEを宣言してない限りcharだと思ってたんだけどどうもちがうっぽい動作が・・・。

CStringとマルチバイト

CStringについて今までかなり誤解していた。

  • CString::GetLength()は文字数を取得する関数だと思っていたらバイト数を取得する関数だった。
  • CString::GetAt()は1文字を取得する関数だと思っていたら1バイトのcharを返す関数だった。
  • CString::Left()の引数は文字数だと思っていたらバイト数だった。
  • CString::TrimRight()の引数にスペースを指定したら全角スペースのトリミングができると思っていたらできなかった。

うぉい!全然マルチバイト対応してないじゃん!ちなみにこれら1バイト(char)といってもTCHARなので_UNICODE指定すると2バイトになるんだろう。多分。っていっても単位が変わるだけだけど。

マルチバイト対応というより、文字エンコーディングか。マルチバイトに関してはTCHAR使うことで対応しているわけだし。

つまり、CStringはあたりまえのことだけど文字エンコーディングには一切関知しないクラスではないのだと今更ながらに気づいた。

文字列操作

今日は一日文字の比較とかチェックのコードを書いていた。久々にビット演算とかがちょこちょこ。お、ポインタとかビット演算とかだいぶ慣れてきたんじゃないか?という感じでちょっとうれしい。

しかしCで文字列を操作するプログラム、というとよほど気をつけていてもバグが出そうというイメージがある。どっかに綺麗なコードがないかなー。今度PHPのマルチバイト文字列操作関数のコードを見てみよう。確かmbfilterだったけどライセンス関係でライブラリ化するとかしないとかMLで議論されてた気が。

mbfilterで検索していたらこんな記事発見。

http://www.textfield.net/gtext/archives/000004.html

PHP関数のmb_convert_kanaをJavaに移植したサンプルです。mb_系の関数群はC言語で記述されたUnicode対応の非常に賢いコード群で覗くと非常に参考になります。

良いコードに出会えました。

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ