前回
参考ページ
モノづくりC言語塾 C言語 関数ポインタ【ポインタを使って関数を呼ぶ仕組み解説】
準備
今回はオンラインコンパイラを使用します。
オンラインコンパイラ
ソースコード
sample.c
#include <stdio.h>
//HELLO_VARIABLE型を定義する
typedef struct{
long i;
double d[11];
}HELLO_VARIABLE;
//関数fを代入することを想定して、関数ポインタfupo型を定義する
typedef HELLO_VARIABLE* (*fupo)(HELLO_VARIABLE*);
//関数fを代入することを想定して、fupo型の変数uを構造体HELLO型の内に定義する
typedef struct {
HELLO_VARIABLE j;
fupo u;
}HELLO;
HELLO_VARIABLE* f(HELLO_VARIABLE* v){
//引数v->iを表示
printf("_%ld_",v->i);
//引数v->dに値を代入
v->d[v->i]=1+(v->i*0.1);
//引数v->dを表示
printf("_%1.2lf_\n",v->d[v->i]);
//引数v->iに1を加算
v->i++;
if(v->i>10){
//引数iが10より上になったらHELLO_VARIABLEポインタ型vを返す
return v;
}
else{
//関数fを再帰呼び出し
v=f(v);
}
//HELLO_VARIABLEポインタ型vを返す
return v;
}
int main() {
//HELLO型の変数lを宣言する
HELLO l;
//変数l.j.iに0を入れる
l.j.i=0;
//関数ポインタl.uに関数fを入れる
l.u=f;
//関数ポインタl.uを実行する
l.j=*l.u(&l.j);
//戻り値を表示する
printf("%ld",l.j.i);
//改行する
printf("\n");
//戻り値を表示する
for(l.j.i=0;l.j.i<11;l.j.i++){
printf("_%1.2lf_",l.j.d[l.j.i]);
}
//改行する
printf("\n");
return 0;
}
実行結果
console
_0__1.00_
_1__1.10_
_2__1.20_
_3__1.30_
_4__1.40_
_5__1.50_
_6__1.60_
_7__1.70_
_8__1.80_
_9__1.90_
_10__2.00_
11
_1.00__1.10__1.20__1.30__1.40__1.50__1.60__1.70__1.80__1.90__2.00_