KIMURA Shigenobu
skimu****@mac*****
2004年 7月 11日 (日) 23:39:05 JST
On Jul 11, 2004, at 7:40 AM, shelarcy wrote: > > Scm_ReadUvectorHook って宣言があるだけで、定義があるように見えないのですが 宣言は uvinit.c の 75 行めにありますが、これは 75 SCM_EXTERN ScmObj (*Scm_ReadUvectorHook)(ScmPort *port, const char *tag, 76 ScmReadContext *ctx); の様に SCM_EXTERN になってます。てーことは libgauche の中に実体があるんだなぁ、 って察しがつくので調べてみるとやはり src/read.c の中で実体が定義されてます。 しかし、いま SCM_EXTERN は extern __declspec(dllimport) の筈ですから、うまく シンボルを見つけられないのは困まりものです。 ちなみにこの関数は Scheme プログラムの中で (use gauche.uvector) した後で #u32(1 2 3) とかやったときに u32vector として読み込む仕組みを提供しています。 dl_win.c の方ですが、 > gcc.compile.c gauche\bin\gcc\release\load.o > In file included from ../src/load.c:524: > ../src/dl_win.c: In function `dl_error': > ../src/dl_win.c:52: parse error before "void" > ../src/dl_win.c:53: warning: int format, DWORD arg (arg 3) > ../src/dl_win.c:54: parse error before "char" 52 行めで最初のエラーが出てるので見てみると 49 static const char *dl_error(void) 50 { 51 char buf[80], *p; 52 DWORD code = GetLastError(void); 53 sprintf(buf, "error code %d", code); 54 p = SCM_NEW_ATOMIC2(strlen(buf)+1, char *); 55 strcpy(p, buf); 56 return p; 57 } DWORD というのはきっと windows.h で typedef されてるものと仮定すると 52 行めは auto 変数の初期化をしてる様に見えます。で初期値を作るのに GetLastError () に変数 void を渡して... えっ? void?!?!.... って予約語じゃないのよ。 バグじゃないかな。 diff -u -d -b -w -r1.3 dl_win.c --- dl_win.c 5 Jul 2003 03:29:12 -0000 1.3 +++ dl_win.c 11 Jul 2004 14:38:27 -0000 @@ -49,9 +49,9 @@ static const char *dl_error(void) { char buf[80], *p; - DWORD code = GetLastError(void); + DWORD code = GetLastError(); sprintf(buf, "error code %d", code); - p = SCM_NEW_ATOMIC2(strlen(buf)+1, char *); + p = SCM_NEW_ATOMIC2(char *, strlen(buf)+1); strcpy(p, buf); return p; } --skimu