2009年10月06日
exeGCCのVLINK機能の応用(1)
前回はexeGCCのVLINK機能を使ってターゲット側からホストPCの標準入出力を利用することができることを説明しました。
今回はコマンドウィンドウへのキー入力を拾って対話的なプログラムをつくる時の具体例を紹介します。
以下のような関数を単体デバッグするときのことを考えてみます。
int fibo(int x)
{
if (x <= 0) return 0;
if (x == 1) return 1;
return fibo(x - 2) + fibo(x - 1);
}
この関数はフィボナッチ数を求める関数です。この例では単純に入力は引数のみ、出力は関数値のみで他の副作用はありません。なのでこの関数のテストドライバは引数と関数値だけ扱えれば十分です。
以下のプログラムは対話的に動作して、端末から入力された値を引数として関数fiboを呼び出し、その結果を端末に表示ということを繰り返します。
#include <stdio.h>
extern int fibo(int x);
#define BUFSIZE 256
#define PROMPT "fibo> "
int
getline(char *dst, int linemax)
{
int i;
for (i=0; i<(linemax-1); i++) {
int c;
c = getchar();
if (c == EOF) break;
if ((c == '\r') || (c == '\n')) break;
*dst++ = c;
}
*dst = '\0';
return i;
}
int
main()
{
int x;
char buf[BUFSIZE];
printf(PROMPT);
while(getline(buf, BUFSIZE) > 0) {
sscanf(buf, "%d", &x);
printf("%d\n", fibo(x));
printf(PROMPT);
}
}
これを実行したときのスクリーンショットです。

ESCキーでブレークさせれば、通常のPARTNERのプロンプトに戻ります。
今回の例は非常に単純な関数ですが、実際にはキューやハッシュテーブルなどの複雑なデータ構造のダンプに使うと便利だと思います。