【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

Xcodeでのc言語のプログクムについて。

ルンゲークッタ法のプログラムを書いているのですがビルドエラーになってしまい、原因が分かりません。
 ビルド結果は、
"_func",referenced from:
_main in main.o
"_dvector",referenced from:
_main in main.o
_rk4 in main.o
symbol(s) not found
collect2: ld returned 1 exit status

 プログラムは、
#include <stdio.h>
#include <stdlib.h>

double *dvector(long i, long j); /* ベクトル量領域の確保*/
void free_dvector(double *a, long i); /* 領域の解放*/
double func(double x, double y); /* 関数の定義 */
/* ルンゲークッタ法 */
double *rk4( double y0, double a, double b, int n, double (*f)());

int main (void)
{
double *y, h, a=0.0, b=1.0, y0=1.0 ;
int i, n;

printf("分割式を入力してください-->");
scanf("%d",&n);

y = dvector( 0, n );/*領域の確保*/
y = rk4( y0, a, b, n, func );/*ルンゲクッタ法*/

/* 結果の表示 */
h = (b-a)/n ;/* 刻み幅 */
for (i = 0 ; i <= n ; i++)
{
printf("x=%f \t y=%f \n", a+i*h, y[i] );
}

return 0;
}

/* ルンゲクッタ法 */
double *rk4( double y0, double a, double b, int n, double (*f)() )

{
double k1, k2, k3, k4, h, *y, x;
int i;
y = dvector( 0, n );/* y[0,1,....,n]の確保 */
h = (b-a)/n ;

/* 初期値の設定 */
y[0] = y0; x = a;

/* ルンゲクッタ法 */
for ( i = 0 ; i < n ; i++)
{
k1 = f(x,y[i]); k2 = f(x+h/2.0, y[i]+h*k1/2.0);
k3 = f(x+h/2.0, y[i]+h*k2/2.0);
k4 = f(x+h, y[i]+h*k3);
y[i+1] = y[i] + h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 );
x += y[i];
}

return y;
free_dvector(y, 0); /* 領域の解放 */
}

A 回答 (3件)

> y = dvector( 0, n );/*領域の確保*/


> y = rk4( y0, a, b, n, func );/*ルンゲクッタ法*/
> y = dvector( 0, n );/* y[0,1,....,n]の確保 */
> この部分が、関数の実体なのだと思うのですが、、、
 
 これは関数を呼び出してる部分です。
 呼んだ関数の実体(関数の処理が書かれているコード)がどこかにないといけません。
 
 一般的なライブラリ関数なら該当するライブラリをリンクすれば良いのですが、ソース中に直にプロトタイプ宣言が書かれているということはユーザー定義の関数かと思われますので、その関数のソースコードがどこかになくてはいけません。
 元のソースをネットなり書籍なりのどここから引っ張ってきたのなら、その近くにあるのかもしれませんので探してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。もう一度やり直してみたいと思います。

お礼日時:2010/08/23 07:32

それは「呼び出している」だけであって実体ではない.

    • good
    • 0

> double *dvector(long i, long j); /* ベクトル量領域の確保*/


> double func(double x, double y); /* 関数の定義 */
 
 プロトタイプ宣言されているこの2つの関数が無いと言ってるのですが、関数の実体はどこにありますか?

この回答への補足

y = dvector( 0, n );/*領域の確保*/
y = rk4( y0, a, b, n, func );/*ルンゲクッタ法*/
y = dvector( 0, n );/* y[0,1,....,n]の確保 */
この部分が、関数の実体なのだと思うのですが、、、

補足日時:2010/08/23 00:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!