C

たらい回し関数によるGCC、OCaml、Haskellの速度比較

「お気楽 OCaml プログラミング入門」に色んな言語のたらいまわし関数の結果が掲載されていて、OCamlがCよりも速い驚異的な数値を叩き出していました。 Haskell がありませんでしたので比較してみました。 C #include <stdio.h> int tak(int x, int y, int z){ if (x </stdio.h>…

Haskell から MultiByteToWideChar を呼び ShiftJIS←→UTF16 変換する

Windows のターミナルでは SJIS の文字以外は文字化けすることから、Windows で Haskellを使う場合は常にSJISへの変換が必要になります。 Windowsは内部ではユニコード(UTF16)が使われています。ユーザが実際に触れるのは ShiftJIS ですから、Windowsはには…

wxHaskell での「応答なし」を回避する。

重い処理をしながら textCtrl に記入しようとすると、Windows のイベントループが回らなくなって(応答なし)になってしまい、処理が終了すると一括して表示されてしまうという不具合が起きました。 重い処理をしながら結果をtextCtrl に記入したいのですが…

COM を学ぶ(7) : HaskellでExcel

HaskellでExcelを読み書きしてみました。 Haskell のソースコードは UTF8。UTF8 のソースはコンパイルすると内部コードUCS4に変換されます。Windows は表面はSJISですが、COM を呼ぶときにはBSTRに変換しています。 ソースに書かれた文字列を直接Excelに書き…

COM を学ぶ(6) : C言語でExcel を操作する(Mingw)

C++ を Haskell から呼ぶのが大変だというのが分ったので、Ruby の win32ole.c を参考にC言語で Excel を操作する関数を書いてみました。 これらの関数を Haskell から呼べば HaskellでExcel を操作出来ます(^^)/ C++ ではシートから行・列を指定してCellsオ…

FFI を学ぶ(3) : 自前のCで書いたCOM で MS-Access、SQL server にアクセスする。

小さいMDBですが、10000回連続読み込みでもOKでした。 XP では正常に動作するが、VISTAではSEGV になった。 XP ではmalloc して LSICD の値を保持しているので ((IDispatch *)pDisp)->lpVtbl->Release( (void *)pDisp) で開放したあと free(pDisp) していた…

FFI を学ぶ(2) : Cの関数とデータをやりとりしてみる。

ffi.c : C側のメモリは Haskell で確保してのを受け取って使うか、malloc で確保して開放する関数を Haskell から呼べば良い、たぶん。 勿論、C で開放できるならその方が楽です。 #include <stdio.h> #include <windows.h> #include <malloc.h> #include <objbase.h> /* CLSID構造体へのポインタを返</objbase.h></malloc.h></windows.h></stdio.h>…

FFI を学ぶ(1) :初めての Foreign Function Interface (FFI)

Haskell からは C の関数が呼べます。 {-# OPTIONS -fglasgow-exts #-} import Foreign import Foreign.C.String import Foreign.C.Types import System.IO.Unsafe (unsafePerformIO) foreign import ccall "math.h sin" c_sin :: Double -> Double foreign …

COM を学ぶ(5) : Mingw で MS-Access,SQL server に接続

COM C

小さい mdb ですけど 10000回連続読み込んでも、メモリ消費は増えませんでした。 参考にしたところ。 Win32OLE 製作過程の雑記 Ruby win32ole.c 「るびま」連載:Win32OLE 活用法 C++ アプリケーションではなく C アプリケーションからOLE オートメーション…

COM を学ぶ(4) : ProgID から CLSID を求める。

COM C

CLSID は GUID の別名として定義されています。 typedef struct _GUID { DWORD Data1; // 4バイト WORD Data2; // 2バイト WORD Data3; // 2バイト BYTE Data4[8]; // 1バイト×8 } GUID; typedef GUID CLSID; typedef GUID IID; ProgID "ADODB.Connection" …

COM を学ぶ(2):CでADODB.Connectionに接続する

COM C

GHCはCのコンパイルも出来ます。C言語でCOMクライアントを参考にして、SQL server, MS-Access にアクセスする ADODBConnection に接続してみました。 #include "stdio.h" #include "windows.h" #include "objbase.h" typedef struct tagMyVTable { /* VTable…