プログラミング言語 C言語 〜上級〜

プログラミング



はじめに

初級(前編)(後編)、中級と続いて、いよいよ上級編まできました☺️

C言語 〜上級〜

C言語を扱う上で必須ではありませんが、より実践的な手法を紹介します。

関数マクロ

#define 定義名 定義値

#defineは、値に名前を付けるだけでなく、処理を書くことも可能です。
正確には、ソースコードのビルド時に定義名を定義値に置き換えています。

処理を書くとは、たとえば以下のようなことです。

#include <stdio.h>

#define ADDVAL(n1,n2) \
 int ret = 0; \
 ret = ((n1)+(n2)); \
 printf(“ret = %d\n”, ret);

int main(void)
{
 ADDVAL(1, 2);
 return 0;
}

実行結果はこうなります。

ret = 3

引数2つを加算する関数マクロADDVALを定義しました。
複数行に分割する場合はバックスラッシュを使用します。
引数には型を指定しません。
見た目は通常の関数定義に似ていますが、関数とは異なり、ビルドした時点でmain関数のADDVALが定義値に記載した処理に置き換わっています。
つまり、main関数を以下のように書いたものと解釈されます。

int main(void)
{
 int ret = 0;
 ret = 1 + 2;
 printf(“ret = %d\n”, ret);
 return 0;
}

このため、置き換え後に文法として成立する書き方でないと、ビルドエラーとなります。

便利な機能ではありますが、定義値の部分を単純に置き換えるが故の注意点もあるため、扱いには気をつけましょう。
注意点:
 ・引数に型を指定しないため、予期せぬ演算結果になる可能性がある
 ・デバッグが困難
  などなど

関数ポインタ

中級のポインタの章で、関数もメモリ上にロードされ、アドレスが割り当てられるというお話をしました。
詳しく見てみます。

#include <stdio.h>

int addval(int n1, int n2);
int (*p_calc)(int n1, int n2); //ポインタ関数

int addval(int n1, int n2)
{
 int ret;
 ret = n1 + n2;
 return ret;
}

int main(void)
{
 int result = 0;
 p_calc = addval; //p_calcはaddvalのアドレスを参照するようにする
 result = p_calc(1, 2); //p_calcを介してaddvalを実行する
 printf(“result=%d\n”, result);

 return 0;
}

実行結果はこうなります。

result=3


ポインタ関数p_calcを定義しました。
関数名は何でも良いのですが、引数は使いたい関数に合わせる必要があります。
p_calc = addval; によって、p_calcにaddvalのアドレスを設定することで、p_calcを介してaddvalを呼び出すことができます。

関数ポインタは配列にすることもできます。ただし、引数は揃える必要があります。

#include <stdio.h>

int addval(int n1, int n2);
int multival(int n1, int n2);

int addval(int n1, int n2)
{
 int ret;
 ret = n1 + n2; //加算
 return ret;
}

int multival(int n1, int n2)
{
 int ret;
 ret = n1 * n2; //乗算
 return ret;
}

int main(void)
{
 int result = 0;
 int (*p_calc[])(int n1, int n2) = {addval, multival}; p_calc[0]にaddval、p_calc[1]にmultivalを設定

 for(int i=0; i<2; i++){
  result = p_calc[i](i+1, i+2); //p_calcを介して関数実行
  printf(“p_calc[%d] result = %d\n”, i, result);
 }

 return 0;
}

実行結果はこうなります。

p_calc[0] result = 3
p_calc[1] result = 6


2つの引数を加算するaddvalと、同じく2つの引数を乗算する関数を用意しました。
int (*p_calc[])(int n1, int n2) = {addval, multival};
これによって、p_calc[0]でaddvalを、p_calc[1]でmultivalを使用可能となります。
要素番号をfor文のカウンタで指定することで、連続実行することなどができます。

さいごに

より実践的な使用方法のお話しでした。
これまでお伝えした機能を使えば、だいたいのコードは書けるようになっていると思います。
しかし、実はお伝えしていない機能もまだあるのです。それらについても追々書いていこうと思っています。

それでは、C言語については一旦以上とさせていただきます。
ありがとうございました😊

コメント

タイトルとURLをコピーしました