Menu
Coddy logo textTech

復習:ジェネリック配列

CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 53/61。

challenge icon

チャレンジ

簡単

void*ポインターを使用して、同じコレクション内に整数と文字列を混在させて保持できる柔軟なデータ構造、GenericArrayコンテナーを構築しましょう。

コードを3つのファイルに分けて整理します。

  • generic_array.h:3つのメンバーを持つGenericArray構造体を Define します。ポインターを hold するvoid** array、current count 用のint、capacity 用のintです。array の作成、elements の追加、index による elements の取得、array の解放を行う function prototypes を Declare します。
  • generic_array.c:コンテナーの機能を Implement します。
    • create_array:given initial capacity の GenericArray を Allocate し、count を 0 に初期化します
    • add_element:次に利用可能なスロットにvoid* pointer を格納し、count をインクリメントします(capacity は十分であると仮定します)
    • get_element:指定された index にあるvoid*を返します
    • free_array:items array と GenericArray 構造体自体を解放します
  • main.c:整数と文字列の両方を格納して、generic array の使い方を示します。追加する elements の数を読み取り、続いて each element について type indicator(整数の場合はi、文字列の場合はs)と value を読み取ります。すべての elements を追加した後、array を Iterate して各 value を print します。整数の場合は数値を直接 print します。文字列の場合はテキストを直接 print します。

プログラムは次の入力を受け取ります。

  1. 追加する elements の数
  2. each element について:value に続く type indicator(iまたはs

整数を追加するときは、int 用のメモリを Allocate して pointer を格納します。文字列を追加するときは、メモリを Allocate して文字列を copy します。取得するときは、適切な型に Cast して print します。

重要:print のために型を追跡するには、main で type indicator の単純な parallel array を使用するか、各 element とともに type indicator character を格納します。

入力が 3、続いて i 42s Helloi 100 の場合の出力例:

42
Hello
100

入力が 4、続いて s Worlds Generici -5s Arrays の場合の出力例:

World
Generic
-5
Arrays

header file では include guards を使用することを忘れないでください。コンテナー自体は、どのような型を格納しているかを知る必要はありません。単にvoid* pointers を hold します。型を知る責任は、elements を add および retrieve するコード側にあります。

自分で試してみよう

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: 容量 n の GenericArray を作成する
    
    // TODO: 型を追跡するための並列配列を作成する(サイズ n の char 配列)
    
    // TODO: 各要素について:
    // - 型インジケータ(i または s)を読み取る
    // - 値を読み取る
    // - 整数の場合: int 用のメモリを割り当て、値を格納し、配列に追加する
    // - 文字列の場合: 文字列用のメモリを割り当て、値をコピーし、配列に追加する
    // - 型インジケータを並列配列に格納する
    
    // TODO: 配列を反復処理して各要素を出力する
    // - 並列配列から型を確認する
    // - void* を適切な型にキャストして出力する
    
    // TODO: 割り当てたすべてのメモリを解放する(整数、文字列、および配列)
    
    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ