問題はプログラムの中でsprintf()を使うと山のようにリンク未解決エラーが出ることです
mallocは下請け関数としてsbrk()を呼び出し、これはDOSエクステンダのサービスを使って
メモリブロックを取得しようとします。
ところがsbrk()を含むcrt0.oをリンクしてないし、大体この386ボードにはOSがありません。
libc.a(malloc.o)(.text+0x1e):malloc.c: undefined reference to `__sbrk' libc.a(malloc.o)(.text+0x43):malloc.c: undefined reference to `__sbrk' libc.a(malloc.o)(.text+0x112):malloc.c: undefined reference to `__sbrk' libc.a(crt1.o)(.text+0xc7):crt1.c: undefined reference to `_stubinfo' libc.a(crt1.o)(.text+0x143):crt1.c: undefined reference to `_stubinfo' libc.a(crt1.o)(.text+0x178):crt1.c: undefined reference to `_stubinfo' libc.a(crt1.o)(.text+0x2f6):crt1.c: undefined reference to `_crt0_init_mcount' libc.a(dpmiexcp.o)(.text+0x129):dpmiexcp.c: undefined reference to `__djgpp_selector_limit' libc.a(dpmiexcp.o)(.text+0xab8):dpmiexcp.c: undefined reference to `__djgpp_base_address' libc.a(dpmiexcp.o)(.text+0xc04):dpmiexcp.c: undefined reference to `__exit' libc.a(c1args.o)(.text+0x59e):c1args.c: undefined reference to `_stubinfo' libc.a(c1args.o)(.text+0x669):c1args.c: undefined reference to `_stubinfo' libc.a(c1args.o)(.text+0x6ec):c1args.c: undefined reference to `_stubinfo'どうもsprintfは内部処理の作業エリアとしてmalloc()でメモリ確保しているようです。
mallocは下請け関数としてsbrk()を呼び出し、これはDOSエクステンダのサービスを使って
メモリブロックを取得しようとします。
ところがsbrk()を含むcrt0.oをリンクしてないし、大体この386ボードにはOSがありません。
エラーが出るのは当然なんですが、できればシリアル出力の書式制御のためにprintf系関数は使いたい
ところです。
そこで前に68000ボードで使ったBDS-Cのsprintfのソースをビルドしてリンクしました。
ところです。
そこで前に68000ボードで使ったBDS-Cのsprintfのソースをビルドしてリンクしました。
これでint型の数値表示はできるようになりましたが、なんとlong型をサポートしていないので
「"%ld"」が使えません。
そういえばCP/M-80上のC処理系であるBDS-Cは、long型とfloat型は基本的に使えなかったなぁ・・・
「"%ld"」が使えません。
そういえばCP/M-80上のC処理系であるBDS-Cは、long型とfloat型は基本的に使えなかったなぁ・・・
まあこれはこういうふうに3桁ずつ表示すれば良しです。
printf("%03d%03d\n\r",i/1000,i%1000);
これでやっとプログラムを実行。NUM=500000でsieve()関数自体は1秒以下で終了します。
けっこう高速です。
けっこう高速です。