0
1

More than 1 year has passed since last update.

再帰的関数呼び出しを使った配列代入方法と関数管理方法

Last updated at Posted at 2023-08-31

前回

複数の変数を関数の戻り値とする方法と関数管理方法

参考ページ

モノづくり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_

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1