kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

Array機能を使ってみる

APR(Apache Portable Runtime)のArray機能で動的配列を使ってみました。Array機能を利用する場合の手順は次のようになるようです。

  1. apr_pool_create関数を使用して、Array機能で使用するメモリプールを作成します。
  2. apr_array_make関数を使用して、apr_array_header_tを作成します。
  3. apr_array_push関数を使用して、要素を追加します。
  4. apr_is_empty_array, apr_array_push, apr_array_pop関数など、またapr_array_header_t構造体の各要素を使用して、配列の各要素にアクセスします。
  5. 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