[Gauche-devel-jp] Re: gosh の開発で行き詰まった

Back to archive index

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







Gauche-devel-jp メーリングリストの案内
Back to archive index