Array機能を使ってみる
APR(Apache Portable Runtime)のArray機能で動的配列を使ってみました。Array機能を利用する場合の手順は次のようになるようです。
- apr_pool_create関数を使用して、Array機能で使用するメモリプールを作成します。
- apr_array_make関数を使用して、apr_array_header_tを作成します。
- apr_array_push関数を使用して、要素を追加します。
- apr_is_empty_array, apr_array_push, apr_array_pop関数など、またapr_array_header_t構造体の各要素を使用して、配列の各要素にアクセスします。
- apr_array_headerを使い終わったら、apr_pool_clearまたはapr_pool_destroy関数を使用して、メモリプールを破棄します。
プログラム例
try_apr_array.c
/* * APR Array機能 * 新規作成:2008/01/14 */ #include <stdio.h> #include "apr_tables.h" void print_array(apr_array_header_t *arr) { int i = 0; int *val_ptr = NULL; if (apr_is_empty_array(arr)) { printf("要素はありません。\n"); } else { // Arrayの内容を出力する。 for (i = 0; i < arr->nelts; i++) { val_ptr = (int*)(arr->elts + (arr->elt_size * i)); printf("要素[%d]の値:[%d]\n", i, *val_ptr); } } } int main(int argc, char **argv) { apr_status_t status = APR_SUCCESS; apr_pool_t *pool = NULL; apr_array_header_t *arr = NULL; int *val_ptr = NULL; // APRを初期化する。 apr_initialize(); // メモリプールを作成する。 status = apr_pool_create(&pool, NULL); if (status == APR_SUCCESS) { // int型要素のArrayを作成する。 arr = apr_array_make(pool, 0, sizeof(int)); // 要素を追加する。 val_ptr = apr_array_push(arr); *val_ptr = 10; val_ptr = apr_array_push(arr); *val_ptr = 20; val_ptr = apr_array_push(arr); *val_ptr = 30; // Arrayの内容を出力する。 print_array(arr); // 2番目の要素を変更する。 val_ptr = (int*)(arr->elts + (arr->elt_size * 1)); *val_ptr = 21; // Arrayの内容を出力する。 print_array(arr); // 要素を削除する。 apr_array_pop(arr); // Arrayの内容を出力する。 print_array(arr); // メモリプールを破棄します。 apr_pool_destroy(pool); } else { printf("メモリプールを作成できませんでした。\n"); } // APRを終了する。 apr_terminate(); return 0; }
実行結果
$ ./try_apr_array.exe
要素[0]の値:[10]
要素[1]の値:[20]
要素[2]の値:[30]
要素[0]の値:[10]
要素[1]の値:[21]
要素[2]の値:[30]
要素[0]の値:[10]
要素[1]の値:[21]
補足
参考サイト
Apache Portable Runtime: Table and Array Functions
http://apr.apache.org/docs/apr/1.2/group__apr__tables.html
井上の日誌 -Apacheの話-(2006-03-30)
https://www.codeblog.org/blog/inoue/20060330.html
動作環境
OS : Windows XP, Cygwin
APR Version : 1.2.12