別に積分に限らないと思うのですが、積分を例にして質問させていただきます。
次のようなルーチンがあります。
integral( double (*func)(double), double a, double b );
/* a~bまで関数funcを積分する。 */
そこで、簡単に被積分関数を
fx=3*x とすれば、
double fx(double x)
{
return 3*x;
}
というようにすれば良いですよね。
でも、例えば
fx = exp(x-X) とか fx = x*X
のような関数を積分したいときはどうすればよいのでしょうか?
Xは変数ですが、xにはよらないので積分の中では定数とみなせます。
ループで
X=0 のときにfxを積分
X=1 のときにfxを積分
X=2 のときにfxを積分…
というようにしたいのですが、
fxの引数をfx(double x, double X)
とすると、プロトタイプ宣言もルーチンの中も書き換えなければならなくなりますよね。
さらに fx = x-X + x' などとなったりすると、さらに書き換えなければならなくなり、せっかくの積分のルーチンをうまく使えません。
Xをグローバルで宣言する方法と、
プログラミングの前に、x-X を x' などと置きかえた式を実際に手計算で作る方法を思いついたのですが、
グローバル変数を使うのはあまりよくないし、手計算では簡単な場合しか置換を思いつかなかったりします。
fxの中で X を宣言して、
double fx(double x)
{
static double X;
double y;
y = x-X;
X++;
return y;
}
という方法も考えたのですが、どうもイマイチ良くないような…
こういう場合に、良い方法はありますか?
ここには簡単な関数を書きましたが、少し複雑な関数を積分するので。
質問の意図がうまく伝わらなかったらすいません。
書きにくかったです。
No.4ベストアンサー
- 回答日時:
> fxの中の *(double*)params
> がどういう扱い方をしているのか教えていただけないでしょうか?
たとえば f(x) = x * X で X が 3.0 のとき、integral を使うには:
double f(double x, void* params) {
double X = *(double*)paramsl
return x * X;
}
...
double X = 3.0;
double result = integral(f, &X, a, b);
No.3
- 回答日時:
現状から大きく変わるので、単なる案です。
C++もありと考えると、積分関数を定義して渡すのではなく、
関数をメソッドとして実装している関数オブジェクトを
integral関数に渡すと、面白いかもしれません。
・実行しようとする関数のオブジェクトを生成
・定数など必要な物をオブジェクトに設定
・integralにオブジェクトと範囲a,bを渡す
・integralでは、オブジェクト内の関数メソッドをcall(名前は固定)
・関数オブジェクトではパラメータxと内部の定数で値を返す
みたいな感じです。
Cでも、構造体(or共用体)で似た実装をすることは可能でしょう。
(構造体中に関数ポインタと定数メンバを設ける感じ)
No.2
- 回答日時:
integralのインターフェースを変えないという前提で考えると、
外部static変数を使うのはどうでしょう。
static double X;
double fx(double x) {
・・・
}
void setParameter(double p) {
X = p;
}
というようにしておけば、Xはこのソースファイルの外からは直接アクセスできません。
integralを呼び出す前に予めsetParameterでXをセットしておきます。
No.1
- 回答日時:
僕ならこうする:
integral( double (*func)(double,void*), void* params, double a, double b ); {
...
(*func)(x,params);
...
}
double fx(double x, void* params) {
double X = *(double*)params;
...
}
void* params を介して受け渡します。
回答ありがとうございます。
でも、すいません。
初心者なので、このプログラムがよく分からないです。
(*func)(double, void*), void* params,
の宣言は何を意図しているのか。
fxの中の
*(double*)params
がどういう扱い方をしているのか教えていただけないでしょうか?
すいません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
float型とdouble型の変数の違い...
-
C言語の型による処理速度の違い
-
C言語のpow関数の不具合
-
int とdoubleの比較
-
浮動小数点の定数
-
たくさんの数の平均を求める方...
-
はさみうち法のプログラム(C言...
-
doubleの変数にintとintの割り...
-
C言語 入力した数値の平均値の...
-
「割り算」 と 「分数の掛け算」
-
3次方程式の求解プログラム(...
-
Cで3乗根を求める方法
-
C言語について(三角形の面積・d...
-
マチンの公式による円周率のプ...
-
SetPixel関数のmath.h
-
プログラミングC言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
関数におけるif文とreturn文に...
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
int とdoubleの比較
-
C言語の型による処理速度の違い
-
c言語のコンパイルエラー canno...
-
doubleは常に%lfとするべきなのか
-
difftime()について
-
C言語初心者 構造体 課題について
-
C言語でintをdoubleに
-
listに構造体を格納
-
たくさんの数の平均を求める方...
-
(C,C++言語)関数の引数は自動キ...
おすすめ情報