プログラム

さらに1日かかったけど
ローマ字自動変換(自動認識?)クラスができたー♪
オブジェクト指向にのっとってるかどうか微妙だけど、あとから自由に拡張できるように基本的な部分だけを実装した「つもり」。


とりあえず、ローマ字を探すときなんか普通にループ回してるだけなので速度面でもう少し改善できると思う。標準STLとかってのもわからないし。
現在の処理時間は40文字を100回変換するのに1.5秒程度。


まぁ、1.5秒は遅い例なので40文字を変換するのに平均で0.01秒程度か。それでもちと遅い気がする。タイプウェルなんかで一回変換するのに0.01秒かかってたら、それだけでかなりの遅れである。でも、実際はせいせい10文字程度までだから0.003秒くらい。
ん〜、これでいいような気もしてきた。
速度気にするのは、これ使ってなんか作ってみてからだな。


しかし、自動認識をさせる上で結構いろんな場合を考えないといけなくて大変だった。
「んあ」等の「ん」のあとにくるア行、ナ行が来たらn2回
「った」等の普通の促音
「っあ」等の促音のあとのア行、ナ行が来たら「っ」は「ltu」「xtu」
「しゃ」等の拗音つきの文字
ある場合を処理して、これでできたかな?と思っていろいろ試してるとまた違う場合を見つけて、その処理を・・・とやっているうちに処理時間が長くなってしまう。


でもって、使い方はこんな感じ。
Windowsプログラムだったら、WM_KEYDOWNメッセージのwParamを下のkeyの代わりに使えばいい。

void main(){
  char *buf="あいうえお!abcde!";  //アルファベットや記号もOK
  RomanTable rt;  //変換テーブルを生成
  AutoJudg t(&rt);  //Typingクラスからテーブルを使えるようにする

  cout << buf << endl;
  t.SetText(buf);

  while(1){
    if(kbhit()){
      int key = getch();
      int result = t.Type(key);
      if(result==HIT)
        printf("input = \"%c\" -> HIT\n\n",key);
      else if(result==MISS)
        printf("input = \"%c\" -> MISS\n\n",key);
      else if(result==END){
        printf("input = \"%c\" -> END\n\n",key);
        t.Clear();
        break;
      }
    }
  }
}

ソース晒してみるのでC++な人がいたら、意見をくださるとありがたい。(いないと思うけど)
main.cpp
AutoJudg.cpp
AutoJudg.h
RomanTable.cpp
RomanTable.h
以下の二つは内部でUnicodeを使うためにhttp://www.ksky.ne.jp/~seahorse/bslib.htmlのものを使わせていただきました。
bsWString.cpp
bsWString.h
アーカイブ