基礎 C言語
  1. プログラミング手法(オーバーライド)

  2. 配列の引数

  3. プログラミング手法(キューとスタック)












プログラミング手法(オーバーライド)

ウィンドウプログラムでは、コントロールやクラスには、動作が予め決まっている部分がある。 しかし、本来プログラマーが変えられないその部分を変えることができる。 これを、オーバーライドと呼ぶ。 コントロールの場合は、サブクラス化することによって可能となる。
		


配列の引数

一次元配列を関数の引数にする場合は、ポインタを使う。
多次元配列の場合は、ポインタは使えないため、以下のようにする。

変数が引数の場合は、呼び出された関数内で値を変更しても、呼び出し元の関数では反映されないが、引数が配列やポインタの場合は、呼び出し元の関数内でも値の変更が反映される。
// 引数が一次元配列の場合(1)
Show_Text(char *str)
{
    puts(str);
}

main()
{
    Show_Text("おはよー");
}

----- 出力結果 -----
おはよー
--------------------


// 引数が一次元配列の場合(2)
Set_Value(int *n)
{
    int i;
    for(i=0; i<5; i++)
        n[i] = i + 1;
}

main()
{
    int n[5];
    Set_Value(n);
    printf("%d %d",n[0],n[2]);
}

----- 出力結果 -----
1 3
--------------------


// 引数が多次元配列の場合
Show_Text(int n[][2])
{
    printf("%d %d",n[0][0],n[2][1]);
}

main()
{
    int n[][2] = {{1,2},{3,4},{5,6}};
    Show_Text(n);
}

----- 出力結果 -----
1 6
--------------------


多次元ポインタを引数にする場合
		


プログラミング手法(キューとスタック)

配列にデータを入れた順にデータを取り出す方式をFIFO(First In First Out)、または、キューと言う。
配列にデータを入れた順とは逆順にデータを取り出す方式をLIFO(Last In First Out)、または、スタックと言う。
ウィンドウズでは、ウィンドウ メッセージの蓄積にはキューを、再帰構造の実現にはスタックを使っているらしい。
これらは、メモリ空間がプログラマーが使うのとは別だから、プログラマーが直接操作することはできない。
プログラムでキューやスタックを使う場合は、1次元配列を1つと、次のデータを入れる配列位置を覚えておく変数を1つ用意すれば良い。もちろん、これらは、ウィンドウズが使うそれらとは別物である。
スタックにデータを入れる操作をプッシュ、取り出す操作をポップと呼ぶ。
// スタックの場合
int data[32]; // データを格納する配列
int index = 0; // 次のデータを入れる配列位置の添え字を入れる変数

// データの追加
push_stack(int val)
{
    if(val >= 0 && index < sizeof(data) / sizeof(int)){
        data[index] = val;
        index ++;
    }
}

// データの取り出し
int pop_stack()
{
    int val = -1; // 空の場合は -1
    if(index > 0){
        index --;
        val = data[index];
    }
    return val;
}

main()
{
    push_stack(2);
    push_stack(5);
    push_stack(16);
    printf("%d\n", pop_stack());
    printf("%d\n", pop_stack());
    printf("%d\n", pop_stack());
    printf("%d\n", pop_stack());
    push_stack(8);
    push_stack(20);
    printf("%d\n", pop_stack());
    printf("%d\n", pop_stack());
}

----- 出力結果 -----
16
5
2
-1
20
8
--------------------


// キューの場合
int data[32]; // データを格納する配列
int index = 0; // 次のデータを入れる配列位置の添え字を入れる変数

// データの追加
push_queue(int val)
{
    if(val >= 0 && index < sizeof(data) / sizeof(int)){
        data[index] = val;
        index ++;
    }
}

// データの取り出し
int pop_queue()
{
    int val = -1; // 空の場合は -1
    if(index > 0){
        val = data[0];
        index --;
        memmove(data, data + 1, sizeof(int) * index); // 残りのデータを1つ前に詰める
    }
    return val;
}

main()
{
    push_queue(2);
    push_queue(5);
    push_queue(16);
    printf("%d\n", pop_queue());
    printf("%d\n", pop_queue());
    printf("%d\n", pop_queue());
    printf("%d\n", pop_queue());
    push_queue(8);
    push_queue(20);
    printf("%d\n", pop_queue());
    printf("%d\n", pop_queue());
}

----- 出力結果 -----
2
5
16
-1
8
20
--------------------