実現したいこと
変数 x1, x2, x, v を有理数の抽象データ型に変更して、二分法を用いて解を求めるプログラムを作成したい。
ヘッダファイルで関数を定義しているはずなのに、コンパイルすると定義されていない。
特に文法のミス等はないと思うのですが、どこが問題なのでしょうか。
header.h
/*有理数処理のヘッダファイル*/ typedef struct rational { int bunshi ; /* 分子 */ int bunbo ; /* 分母 */ } RATIONAL ; /* 有理数の生成 */ RATIONAL newRational(int n, int d) ; /* 有理数の簡約処理 */ RATIONAL raReduce(RATIONAL v) ; /* 四則演算 */ RATIONAL raAdd(RATIONAL a, RATIONAL b) ; RATIONAL raSub(RATIONAL a, RATIONAL b) ; RATIONAL raMul(RATIONAL a, RATIONAL b) ; RATIONAL raDiv(RATIONAL a, RATIONAL b) ; /* 比較 */ int raEq(RATIONAL a, RATIONAL b) ; int raGt(RATIONAL a, RATIONAL b) ; int raLt(RATIONAL a, RATIONAL b) ; /* 有理数の表示 */ void raPrint(RATIONAL v) ; void raPrintNl(RATIONAL v) ; /* char *raString(char buff[], RATIONAL v) ; */
main.c
#include <stdio.h> #include "header.h" int main(void) { RATIONAL x1, x2, x, v ; RATIONAL eps, c1, c2 ; eps = newRational(2, 1000); c1 = newRational(1, 1) ; c2 = newRational(2, 1) ; x1 = newRational(0, 1); x2 = newRational(1, 1); while (raGt(raSub(x2, x1), eps)) /* (a) x2 - x1 > eps に相当する条件式 */ { x = raDiv(raAdd(x1, x2),c2); /* (b) x = (x1 + x2) / 2.0; に相当する計算式 */ /* 以下は v = x * (x * x + 1) - 1 に相当する式.そのまま使用 */ v = raSub(raMul(x, raAdd(raMul(x, x), c1)), c1); /* x1, x2, x, v の表示 */ printf("x1 = "); raPrint(x1); printf(", x2 = "); raPrint(x2); printf(", x = "); raPrint(x); printf(", v = "); raPrintNl(v); if (raGt(v, x1) /* (c) v > 0 に相当する条件式 */) x2 = x; else x1 = x; } x = raDiv(raAdd(x1, x2),c2); /* (d) x = (x1 + x2) / 2.0; に相当する計算式 */ raPrintNl(x); /* (e) 求まった解 x の表示 */ return 0; }
エラーコード
/tmp/cc5jtIoE.o: 関数 main' 内: main.c:(.text+0x13):
newRational' に対する定義されていない参照です
main.c:(.text+0x26): newRational' に対する定義されていない参照です main.c:(.text+0x39):
newRational' に対する定義されていない参照です
main.c:(.text+0x4c): newRational' に対する定義されていない参照です main.c:(.text+0x5f):
newRational' に対する定義されていない参照です
main.c:(.text+0x7b): raAdd' に対する定義されていない参照です main.c:(.text+0x8d):
raDiv' に対する定義されていない参照です
main.c:(.text+0xa4): raMul' に対する定義されていない参照です main.c:(.text+0xb6):
raAdd' に対する定義されていない参照です
main.c:(.text+0xc8): raMul' に対する定義されていない参照です main.c:(.text+0xda):
raSub' に対する定義されていない参照です
main.c:(.text+0xf9): raPrint' に対する定義されていない参照です main.c:(.text+0x114):
raPrint' に対する定義されていない参照です
main.c:(.text+0x12f): raPrint' に対する定義されていない参照です main.c:(.text+0x14a):
raPrintNl' に対する定義されていない参照です
main.c:(.text+0x15d): raGt' に対する定義されていない参照です main.c:(.text+0x186):
raSub' に対する定義されていない参照です
main.c:(.text+0x198): raGt' に対する定義されていない参照です main.c:(.text+0x1b3):
raAdd' に対する定義されていない参照です
main.c:(.text+0x1c5): raDiv' に対する定義されていない参照です main.c:(.text+0x1d5):
raPrintNl' に対する定義されていない参照です
collect2: error: ld returned 1 exit status