ふじ@メガネボーイズのメモのような日記 RSSフィード

2009-08-21

汎用的なスタックをC言語で

前回に引き続き「汎用的なをC言語で」シリーズ。

OSが提供する機能を使わないようなローレイヤー向けの汎用スタックを作ってみた。

データとして整数値/アドレスのどちらでも格納できること、

スタック用のメモリ領域を自由に設定できることが特徴。

(datatype.hは環境に合わせて書き換えてね)

datatype.h

キューと同じ。⇒http://meganeboy.g.hatena.ne.jp/fuji_ttt/20090804

stack.h

#ifndef __STACK_H__
#define __STACK_H__

#include "datatype.h"

/* スタック構造体 */
typedef struct {
	VP_INT	*p_data;	/* データ配列の先頭アドレス */
	UINT	num;		/* 格納されているデータ数 */
	UINT	depth;		/* スタックの深さ(最大データ数) */
} STACK;

/* スタック初期化 */
ER stack_initialize(STACK *p_stack, VP_INT a_data[], UINT depth);

/* プッシュ */
ER stack_push(STACK *p_stack, VP_INT data);

/* ポップ */
ER stack_pop(STACK *p_stack, VP_INT *p_data);

#endif /* __STACK_H__ */

stack.c

#include "datatype.h"
#include "stack.h"

ER stack_initialize(STACK *p_stack, VP_INT a_data[], UINT depth) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_stack == NULL || a_data == NULL || depth <= 0 ) {
		return E_PAR;
	}
	
	/* メンバーの初期値を格納 */
	p_stack->p_data = a_data;
	p_stack->num = 0;
	p_stack->depth = depth;
	
	/* 初期化できた場合はE_OKを返却 */
	return E_OK;
}

ER stack_push(STACK *p_stack, VP_INT data) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_stack == NULL ) {
		return E_PAR;
	}
	
	/* スタックが満杯の場合はプッシュせずにE_OBJを返却 */
	if ( p_stack->num >= p_stack->depth ) {
		return E_OBJ;
	}
	
	/* スタックに格納 */
	p_stack->p_data[p_stack->num] = data;
	p_stack->num++;
	
	/* プッシュできた場合はE_OKを返却*/
	return E_OK;
}

ER stack_pop(STACK *p_stack, VP_INT *p_data) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_stack == NULL || p_data == NULL) {
		return E_PAR;
	}
	
	/* スタックが空の場合は何もせずにE_OBJを返却 */
	if ( p_stack->num == 0 ) {
		return E_OBJ;
	}
	
	/* トップのデータを取り出して指定されたアドレスに格納 */
	*p_data = p_stack->p_data[p_stack->num-1];
	
	/* 格納されているデータ数を更新 */
	p_stack->num--;
	
	/* ポップできた場合はE_OKを返却 */
	return E_OK;
}

jvdfrgzwvxjvdfrgzwvx2014/01/19 02:32ddjffnfhbofcpz, <a href="http://www.rfhbisblww.com/">lwwyimaspn</a>

osqlhymyrvosqlhymyrv2014/01/21 16:24gjcyqnfhbofcpz, <a href="http://www.wkhjvgxhes.com/">znmldtctdb</a>

eebuwgzjdieebuwgzjdi2014/01/24 18:09fqgognfhbofcpz, http://www.iosmxaiqvf.com/ gjcujgfpab

guuhpdpqyrguuhpdpqyr2014/01/29 21:03upsynnfhbofcpz, <a href="http://www.cjikclonds.com/">vhwnmephfp</a> , [url=http://www.qfjfzqiuhh.com/]gzqzcyntls[/url], http://www.nzeockmese.com/ vhwnmephfp

xjjfnhslfhxjjfnhslfh2014/06/02 18:00sclcpnfhbofcpz, <a href="http://www.nnevhzeaoy.com/">vgegvytadw</a> , [url=http://www.ecyvzziytg.com/]wgxpnrpgeu[/url], http://www.jmisxysenl.com/ vgegvytadw

2009-08-04

汎用的なキューをC言語で

OSの提供する機能を使わないようなローレイヤー向けの汎用キューを作ってみた。

パフォーマンスが気になる場合は剰余の計算をどうにかしようw。

データとして整数値/アドレスのどちらでも格納できること、

キュー用のメモリ領域を自由に設定できることが特徴。

(datatype.hは環境に合わせて書き換えてね)

datatype.h

#ifndef __DATATYPE_H__
#define __DATATYPE_H__

/* 型定義 */
typedef	unsigned int	UINT;	/* 符号無し整数 */
typedef	int		VP_INT;	/* voidポインタまたはint(どちらでも格納できる型で定義) */
typedef	int		ER;	/* エラーコード */

/* 定数定義 */
#ifndef NULL
#define NULL	0		/* 無効ポインタ */
#endif	/* NULL */
#define E_OK	0		/* 正常終了 */
#define E_PAR	(-17)		/* パラメータエラー */
#define E_OBJ	(-41)		/* オブジェクト状態エラー */

#endif /* __DATA_TYPE_H__ */

queue.h

#ifndef __QUEUE_H__
#define __QUEUE_H__

#include "datatype.h"

/* キュー構造体 */
typedef struct {
	VP_INT	*p_data;	/* データ配列の先頭アドレス */
	UINT	head;		/* キュー先頭データの添え字 */
	UINT	num;		/* 格納されているデータ数 */
	UINT	len;		/* キューの長さ(最大データ数) */
} QUEUE;

/* キュー初期化 */
ER queue_initialize(QUEUE *p_queue, VP_INT a_data[], UINT len);

/* エンキュー */
ER queue_enqueue(QUEUE *p_queue, VP_INT data);

/* デキュー */
ER queue_dequeue(QUEUE *p_queue, VP_INT *p_data);

#endif /* __QUEUE_H__ */

queue.c

#include "datatype.h"
#include "queue.h"

ER queue_initialize(QUEUE *p_queue, VP_INT a_data[], UINT len) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_queue == NULL || a_data == NULL || len <= 0 ) {
		return E_PAR;
	}
	
	/* メンバーの初期値を格納 */
	p_queue->p_data = a_data;
	p_queue->head = 0;
	p_queue->num = 0;
	p_queue->len = len;
	
	/* 初期化できた場合はE_OKを返却 */
	return E_OK;
}

ER queue_enqueue(QUEUE *p_queue, VP_INT data) {
	UINT index;
	
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_queue == NULL ) {
		return E_PAR;
	}
	
	/* キューが満杯の場合はエンキューせずにE_OBJを返却 */
	if ( p_queue->num >= p_queue->len ) {
		return E_OBJ;
	}
	
	/* 末尾より1つ後の格納位置を計算 */
	index = ( p_queue->head + p_queue->num ) % p_queue->len;
	
	/* キューに格納 */
	p_queue->p_data[index] = data;
	p_queue->num++;
	
	/* エンキューできた場合はE_OKを返却*/
	return E_OK;
}

ER queue_dequeue(QUEUE *p_queue, VP_INT *p_data) {
	/* 引数が不正な場合はE_PARを返却 */
	if ( p_queue == NULL || p_data == NULL) {
		return E_PAR;
	}
	
	/* キューが空の場合は何もせずにE_OBJを返却 */
	if ( p_queue->num == 0 ) {
		return E_OBJ;
	}
	
	/* 先頭データを取り出して指定されたアドレスに格納 */
	*p_data = p_queue->p_data[p_queue->head];
	
	/* 先頭の添え字を更新 */
	p_queue->head = ( p_queue->head + 1 ) % p_queue->len;
	
	/* 格納されているデータ数を更新 */
	p_queue->num--;
	
	/* デキューできた場合はE_OKを返却 */
	return E_OK;
}

ekhjqkkavpekhjqkkavp2013/12/17 16:08cuvzrnfhbofcpz, <a href="http://www.kxcbmwblsw.com/">soenthfoby</a> , [url=http://www.axdcokrawl.com/]yqubwljtxo[/url], http://www.mdcczuzjvs.com/ soenthfoby

2008-11-15

skelton_boyskelton_boy2008/11/16 13:27ステアリング補正のとこで、ステアリングの慣性を見極める方法がどうしたらいいんだろう?

2008-10-19

fuji_tttfuji_ttt2008/11/16 10:25ステアリングの慣性は、平均的な黒の期間を計算しておいて、直近の黒の期間が、その半分よりも長かったら「↑」で、短かったら「↓」かなぁ。

2008-10-16

チャンピオンシップのシナリオ案

坂道入口のマーカーを確実に検知するっていう方針でいくとこんな感じ?

f:id:fuji_ttt:20081016204452p:image

分岐が無くなった。w

いいのかコレ?

チャンピオンシップのシナリオ案(代案)

こんなのもアリかもね。

f:id:fuji_ttt:20081016205411p:image

あっ、コーナー検知の精度が高ければ、坂道前のコーナーを検知する方法もあるな。

skelton_boyskelton_boy2008/10/18 17:42コーナー検知ってまだ実装してないけど、大丈夫かな?可能であれば、両方とも試走会で試せるといいけど。

fuji_tttfuji_ttt2008/10/18 17:47僕が実装するという話なら、ちょっと時間的に余裕がないので上の案かな。

fuji_tttfuji_ttt2008/10/18 17:48コーナーがうまく検知できるかも調べてないし。

2008-10-15

ユースケース図修正案

こんな感じでどうでしょうか?

f:id:fuji_ttt:20081015230729p:image

skelton_boyskelton_boy2008/10/18 17:36試走担当者とかを出した意義って何かあるのかな?シナリオとかシーンとかは、走行シナリオ、走行シーンとした方がいいね。クラス図に合わせて。

skelton_boyskelton_boy2008/10/18 17:36あと、走行パラメタをユースケースに書くということは、本編で言及する必要あると思うんだけど、その余裕はあり?

fuji_tttfuji_ttt2008/10/18 18:02両者は以下のように役割が違うから試走担当者を出した意義はあると思うよ。
・試走担当者:パラメタ設定のための情報を収集する。うまく走ることを確認する。
・本番スタータ:本番走行させる。
(鑑識とデカみたいな関係)
シナリオとシーンには「走行」をつけときます。
走行パラメタはユースケースにだけ書いて、本編ではスルーするつもりだったけどダメ?
コンセプトにログ取得とか書いてるけど、本編ではスルーしてることだし。

fuji_tttfuji_ttt2008/10/18 23:23そうか。アクターについては、文章で役割を説明しておくといいね。

2008-10-05

オンライン会合10/05(日) ~チャンピオンシップに向けて~

アジェンダ

  • スケジュールの確認
  • 目標の決定
  • 改善方針の決定
  • 作業分担の決定

出席者

  • れごぼく
  • めがね兄さん
  • ふじ

スケジュール

目標

総合入賞

モデルの改善

  • ユースケースをどのように見せるか再検討する(目的レベル、実現レベルで書きたい)
    ⇒ やってもよい
  • クラス図に属性や操作を追加する
    ⇒ 必須
  • シナリオの進行か各走行ロジックのステートマシン図を書く
    ⇒ 必須
  • ドメイン分割とドメインコミュニケーションへの話の持っていき方を再検討したい(現状のだと実は唐突すぎる?)
    ⇒ やったほうがよい
  • ショートカットやツインループをシナリオに含める
    ⇒ めがね兄さんの調査しだい
  • クラス図にOCLで制約を書く(関連が循環しているので制約を書いた方がよいと思う)
    ⇒ コメントで
  • オブジェクト図はシーンの分岐も表現したものにしたい
    ⇒ やる
  • シーンが切り替わった状態を書いている部分(コミュニケーション図)は、Before&Afterで分けたい
    ⇒ 方法は置いておいて、とりあえずやる
  • モデルとコースの対応関係とか
    ⇒ やる

※期限:モデル提出まで

実装の改善

  • 試走での調整を簡単&確実に
    ⇒ 積極的マーカー検知走行で脱線しないように改良

※期限:試走会まで

その他の改善

  • トラブル対応を事前にもっと考えよう

※期限:チャンピオンシップまで

作業分担

  • 目標設定理由の作成 [めがね]
  • ユースケースの修正 [ふじ]
  • クラス図の修正(属性、操作、制約) [めがね]
  • ステートマシン図の作成 [れごぼく]
  • ドメインの話にもっていく方法の検討 (優先度低⇒後回し)
  • オブジェクト図の修正 [ふじ]
  • コミュニケーション図の修正 [れごぼく]
  • モデルとコースの対応関係の作成 [れごぼく]
  • 積極的マーカー検知走行ロジックの改良 [ふじ]
  • トラブル対応の検討 (後回し)

※初版の期限:10/18(土)-10/19(日)のオンラインミーティングまで

skelton_boyskelton_boy2008/10/05 22:36本当に作業できるのは13(月)くらいかも・・・

fuji_tttfuji_ttt2008/10/05 23:10まぁ、仕事関係を優先で。

2008-09-26

privateとprotectedの使い分け

※これは自分の考え方なので正しいかわかりません。(^^;

これまでの考え方

  • 基本はprotected
  • 派生クラスで使うことを意図的に禁止するものはprivate

最近の考え方

  • 利用する言語の思想に合わせる
C++

C++は、仮想関数として指定した関数のみ動的結合され、継承によるポリモフィズムが利用できる。

このような作りであることから、指定したもののみ継承を許可する思想だと考えられる。

この思想に合わせ、基本はprivateにした方がよいと思う。

  • 基本はprivate
  • 派生クラスで使うことを意図的に許可するものはprotected
Java

Javaは、finalを指定したクラスのみ継承が禁止される。

このような作りであることから、指定したもの以外は継承を許可する思想だとわかる。

この思想に合わせ、基本はprotectedにした方がよいと思う。

  • 基本はprotected
  • 派生クラスで使うことを意図的に禁止するものはprivate

skelton_boyskelton_boy2008/09/27 01:00こういうのってEffective C++とかに書いてないのかな?

fuji_tttfuji_ttt2008/09/27 19:48デストラクタがvirtualでないクラスは一般的に継承してはいけないとかってのは書いてあるみたいだけど、この日記に関連する内容が書いてあるかは不明です。C++を使う人は読むべき1冊だと言われているので、そのうち読みたいなぁ。。。

2008-09-22

実装においてチャンピオンシップに向けて改善したい点

  • パフォーマンス改善(1ループの処理速度を測ってみて必要があれば)
  • 走行状況データに操作の履歴を追加(どのようにステアリングを切ってきたか)
  • 積極的マーカー検知走行ロジックの改良(脱線しないように)
  • ツインループ走行ロジックの実装
  • ショートカット走行ロジックの実装(できたら)