2011年4月17日日曜日

アンプ

前回からの話は割愛し、アンプを実装してみました。

写真をミスって消してしまって撮り直すのが面倒なので今回はなしということに(ぇ


回路図はこんな感じになりました。



なんとなく解りづらくなってしまいましたが、
AC-INにはイヤフォン端子からのプラスが刺さります。
グランド(マイナス)端子はもちろんグランド(電位のマイナス)に。

イヤフォンからは2本の線が出ているのが多いと思いますが(耳につける部分が2つあるのはそう)、
マイナス端子はどちらでもなく、周りについてる銀色の「網」みたいなのです。
2本の線は両方プラス端子なので、その2つをアンプにつなげてもたぶん変な音がします。


あんまり当初との差異はないですね。
右上の5kΩが1kΩに変化しているくらいでしょうか。

図面では修正していますが右側の0.1uFのコンデンサは最初は100uFの予定でしたけど、
100uFを入れてしまうとどうやらクリップしてしまうようなので結構小さくしました。

クリップというのは波形が大きすぎて(バイアス電流があっていなくて)、
上下がトランジスタの出力できる範囲から外れてしまっている現象です。


それとスピーカに直列になっているコンデンサも最初は10uFの予定でしたが、
10uFを持っていないので100uFにしました。
こっちは0.1uF(小さくする)だと若干不具合が起こったので大きい方に差し替えました。

どちらも正直、10uFがあればちょうどよかったんですけど、
持っていないのでしょうがない、って感じですかね。

まあ製品でもないしただの実験なので関係ない関係ない。動けばいいんです(笑


実験する場合にそこそこ重要だと思うのが、自分が持っている部品に合わせるということ。
ほんとは33kΩだったりのE系列とやらが適しているようなのですが、
自分は100、1k、10k、100kしか持っていないので、それで簡単に作れる数値に合わせました。

50kは100kを2つ並列、あとは単体で作れますね。
コンデンサは直列で抵抗の並列と同じ計算(和分の積)になるんですけど、
まあそこまで厳密な静電容量はいらないのでそのままで。


そしてこれが実装した波形のシミュレーションです。




下が入力、上が出力です。
クリップもなくいい感じです。
実際に聞いてみても結構クリアな音だと思いました。

ただトランジスタが2石なのと、1次側の出力をそのまま2次側の入力に持っていってるので
もう少し上手いこと増幅することは可能だと思います。
(2回もバイアスの計算をするのが面倒だったからとかではない)


今回は電池以外は手持ちだったので、電池の価格=製作費になりました。
この電池もまだまだ使えるのでパーツがひとつ増えたって感じですね。


アンプとは無関係ですけど実はいまさらマルチバイブレータが学校で出てきたので、
これで何かできないかなーとか考えてます。
せっかくだしパルス速度上げて音でも出してみようかな?


全くアナログ回路を知らないままデジタルを触り始めたので
まだまだやることがたくさんありそうです。

もともと若干ソフト寄りだからなぁー。
メカトロニクス技術者に向けてアナログ、デジタル、メカニクスは習得しておきたい。

なんというか抱負でした。以上。

2011年4月5日火曜日

LTspice(フリーソフト)とアンプ

私の部屋(というか家)にはオーディオというものが一切なくてですね、
もちろんスピーカーの類もないわけです。

音楽聴くときはだいたいノートPCのスピーカーとかイヤフォンとか。

そんなときにふと、PCのイヤフォンジャックから手持ちの0.5Wスピーカにつなげるのではないか、
とかいうわけのわからない発想が出てきましてイヤフォンのケーブルを切ってテスタで電圧とかを測ってみたんですけど
まったくもって針が振れないという結果に終わりました。
いや、10mAのレンジでやや振れるかなー程度には観測できました。

もちろんスピーカにつなげても音など鳴るはずもなく、ならトランジスタで増幅を~(アンプ自作)と思ったものの
現在、ブレッドボードは使用中…。
そして一回ずつ回路を組み替えて測定するのは骨が折れる。
入力波形も微弱なためミスが発見し難い。

そんなときにアンプ関連のサイトでLTspiceとかいうソフトが紹介されていたわけです。
一番上の箱の「ダウンロード!LTspiceIV」を押して、
「No thanks...」とかいう下の方を押せばDL完了です。


LTspiceは回路シミュレータ(シュミレータ、ではない)で、
回路をコンピュータ上で実験してくれるソフトです。

物理系ならphunとかBlenderとかのフリーソフトがあるんですけど、
電気はなかなか見つかりませんで^^;
(といっても探す気もなかった)

あと機械系ならAutodeskかどっかが出してたなぁ。これはもちろん有料(数百万のレンジだったと思う)。
ちなみにそこに使う3DcadもAutodeskが出してるけど有料。


それでまあ電気CADもAutodeskが出していたような気がするので大体有料か、
そうでなければ機能制限もしくはロークォリティな感じかと思っていましたが、まさかのミドルレンジ。

いや、実際そうなのかは知らないけど(笑
部品点数の制限がありません。

そんな感じで波形やら電圧やら電流やら消費電力やらを解析(シミュレーション)できるソフトを手に入れたってわけです。

余談だけど(我が)龍谷大学ではPspiceというソフトらしいです。これもフリー(まさかのフリー)


見ているうちにどっかのサイト(http://gomisai.blog75.fc2.com/blog-entry-448.html)が
PspiceとLTspiceの比較をしていたので見た結果、LTspiceに。

(前置きここまで)


試しにここ(http://www005.upp.so-net.ne.jp/guitarder/other/o-07-tr-01.html)の
一石トランジスタ回路をシミュレートしてみた結果、素晴らしい感じに。




中心付近の波形が入力(スピーカー端子から)で、一番振幅の大きいのが出力電圧、
あいだにある青いのが出力電流(負荷は適当)です。


なぜかへんに嵌ってしまってインダクタとコンデンサで適当な波形を作ったりして遊んでいます。
部品数の制限がないのでバーサライタのシミュレーションもできます。
もちろん、マイコン(AVRとか)は出来ませんけど。
解放時の出力電流や、消費電力などがシミュレートできるのでお薦め。


そんな感じで支離滅裂ながらお遊び日記。

使用方法はさっきのねがてぃぶろぐさんにあります。以上。

LEDバーサライタmarkII・スケッチ


前回の最後の方で行ってたスケッチです。
見ての通り一部の文字しか対応していません(笑

これでおおよそ1500byteくらいです。
Attiny2313のフラッシュメモリが2000byteなので頑張れば移植できそうです。
ただポート番号が変わるのと、PCINTがBピンの並びにしかないので
使うならばINT割り込みになるんじゃないでしょうか。
(INT0はPD2、INT1はPD3)

LEDが9列なので少し見難い感はありますけど当初よりはスマートになったんじゃないかな?
以下。


#include<avr/io.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include<util/delay.h>


const prog_uint8_t a_line[2][6] = {{0b00000000,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00001000,0b00001000,0b00001000,0b00001000,0b11111111}};
const prog_uint8_t b_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00010001,0b00010001,0b00010001,0b00010001,0b11101110}};
const prog_uint8_t d_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000000,0b00000000},
{0b11111111,0b00000001,0b00000001,0b00000001,0b10000010,0b01111100}};
const prog_uint8_t e_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001},
{0b11111111,0b00010001,0b00010001,0b00010001,0b00010001,0b00000001}};
const prog_uint8_t h_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111111,0b00010000,0b00010000,0b00010000,0b00010000,0b11111111}};
const prog_uint8_t i_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001},
{0b00000001,0b00000001,0b11111111,0b00000001,0b00000001,0b00000001}};
const prog_uint8_t l_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},
{0b11111111,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001}};
const prog_uint8_t m_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111111,0b11000000,0b01110000,0b01110000,0b11000000,0b11111111}};
const prog_uint8_t o_line[2][6] = {{0b00000000,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111110,0b00000001,0b00000001,0b00000001,0b00000001,0b11111110}};
const prog_uint8_t p_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00010000,0b00010000,0b00010000,0b00010000,0b11100000}};
const prog_uint8_t r_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00010000,0b00010000,0b00011000,0b00010100,0b11100011}};
const prog_uint8_t t_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001},
{0b00000000,0b00000000,0b11111111,0b00000000,0b00000000,0b00000000}};
const prog_uint8_t u_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111110,0b00000001,0b00000001,0b00000001,0b00000001,0b11111110}};
const prog_uint8_t v_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111000,0b00000110,0b00000001,0b00000001,0b00000110,0b11111000}};
const prog_uint8_t w_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111100,0b00000111,0b00111100,0b00111100,0b00000111,0b11111100}};
const prog_uint8_t y_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11000000,0b00100000,0b00011111,0b00010000,0b00100000,0b11000000}};

void space(){
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(30);
}

int main(void){
cli();
DDRB = 0b11111111;
DDRD = 0b11111111;
DDRC = 0b00000000;
PORTC = 0b11111111;
PCICR = (1<<PCIE1);
PCMSK1 = (1<<PCINT8);
int i;
sei();
while(1){
for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&h_line[0][i]);
PORTD = pgm_read_byte(&h_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&a_line[0][i]);
PORTD = pgm_read_byte(&a_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&p_line[0][i]);
PORTD = pgm_read_byte(&p_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&p_line[0][i]);
PORTD = pgm_read_byte(&p_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&y_line[0][i]);
PORTD = pgm_read_byte(&y_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


space();


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&b_line[0][i]);
PORTD = pgm_read_byte(&b_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&i_line[0][i]);
PORTD = pgm_read_byte(&i_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&r_line[0][i]);
PORTD = pgm_read_byte(&r_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&t_line[0][i]);
PORTD = pgm_read_byte(&t_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&h_line[0][i]);
PORTD = pgm_read_byte(&h_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&d_line[0][i]);
PORTD = pgm_read_byte(&d_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&a_line[0][i]);
PORTD = pgm_read_byte(&a_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&y_line[0][i]);
PORTD = pgm_read_byte(&y_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 2;i++){
space();
}
}
}

ISR(PCINT1_vect){
if(bit_is_clear(PINC,PC0)){
_delay_ms(80);

int i;

for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&d_line[0][i]);
PORTD = pgm_read_byte(&d_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&l_line[0][i]);
PORTD = pgm_read_byte(&l_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&r_line[0][i]);
PORTD = pgm_read_byte(&r_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&o_line[0][i]);
PORTD = pgm_read_byte(&o_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&w_line[0][i]);
PORTD = pgm_read_byte(&w_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


space();


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&o_line[0][i]);
PORTD = pgm_read_byte(&o_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&l_line[0][i]);
PORTD = pgm_read_byte(&l_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&l_line[0][i]);
PORTD = pgm_read_byte(&l_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&e_line[0][i]);
PORTD = pgm_read_byte(&e_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&h_line[0][i]);
PORTD = pgm_read_byte(&h_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);
space();
}else{
}
}

2011年4月1日金曜日

LEDバーサライタmarkII

そこそこ完成に近いと思います。

ブレッドボードの大きさの問題でLEDは初期と同じく9個ですけど
反対向きに振ったときの文字の表示もできるようになりました。

前回は割り込みを外部割り込みINT0~1を使う予定でしたが
あまりにも文字部分を書き換える手間が発生してしまうので、
最終的にはPCINTを使うことに。

INTもPCINTもたぶん大して変わりはない(INTはまったく使用せずなので)と思います。
INTがレジスタで割り込みの発生条件を決めるのに対して、
PCINTはプログラム内で発生条件を決める、という解釈でいいんでしょうか?

まあPCINTがなんでもかんでも拾うからそれをifとかで選別しろってことですね。たぶん(ぇ


というわけで回路図。


前より少しだけ横長になりました(笑

いつものことですけどGNDとかVCCとか書かないのはだれが見てもわかるように。
今はちょっと読めるようになったけど昔は「GNDってなんだ?」状態でしたので。



その他、プログラムの方は
「配列を作るとなぜかEEPROMに書き込まれる仕様」
となっていたので(AVR特有らしい)、それをフラッシュメモリ(プログラムと一緒のところ)に
入れるのに四苦八苦。

別にEEPROMでもよかったんですけどこれには深いわけが…。
ということもなく(実際にはあったんですけど)。

単純に電源の質が悪かっただけなのに行き着いた結果がこれです(笑
ダイジェストで説明。

LEDの点滅速度が一定じゃない(9個バラバラなので振っても文字にならない)
↓
もしかして割り込みが悪いんじゃないか
↓
違ったので、もしかしたら配列がEEPROMに入っているのが悪いんじゃ(略
↓
ここでEEPROMからフラッシュに移動させる(しかし改善されず)
↓
どうやらライタが接続されている間はちゃんと動作するのに、
ライタを外すとダメなようだ
↓
ライタの中で何か接続がされていてそこを繋げばいいんじゃ
↓
ISPケーブルを一本ずつ抜いていってどれを抜くとアウトかを調べる
↓
VCCまたはGNDでした。ということはつまり。


電源(電池)の接触が悪く、単にノイズ(というよりはもっと大きな電圧変化)の所為でした。
もともとブレッドボードは場所により接触悪いので、挿す場所を変え、
電源用の電解コンデンサをぶち込む事で解決でした。



なんという徒労…orz

上の「配列を作ると~」は全く関係なかったわけですね。
ライタを接続していれば大丈夫だった理由は、
たぶんライタ内にコンデンサでも入ってるってことなんでしょうね。
(半透明なのに見えない…( ̄⊿ ̄)ぐぬぬ…


まあ結果的に書き換え回数が10,000回のEEPROMを使わずに済んだのは良かったのかも。
今後はこれで嵌ることがないようにしないと…。数時間これと格闘してたからなぁ(遠い目

回路図のRESET10kΩもたぶんいらないです。

これを完成させるにはまずICソケットを買わないとなぁ。
物流動いてるんだろーか。
プログラムスケッチは別で貼ろう。

2011年3月23日水曜日

LEDバーサライタ続き

前回の続きです。

予想だにしない問題というのは、
「文字を選択できるようにするなら、どの文字を選択しているか解らなければならない」
ということ。

当たり前っちゃ当たり前ですね(笑)

フルLEDボードなら見ながら変更できますけど、バーサライタ(英語ではpersistence of visionと言うらしい)は
振らないと文字を表現できないので、どの文字を選択しているかは振ってみるまで解りません。

さすがにこれはダメだろ…。ということで文字選択は出来ないようにするかも。
その場合、簡単に書き換えが出きるようにICソケットか何かで着脱を簡単にしておこうかと思います。

文字選択を実装するならLCDとかで表示用のシステムを作らなければいけないし…。
ちょっと技術的にきついかなー。まだ2つ以上のマイコン同士の通信は出来ないので。
ポートが足りない…(´д`)

というわけでまずは概観から。


まだ割り込み関連を理解していないため、表示素子だけになっております。
前回バーサライタのLED増やしただけバージョンですね。

ここからたぶん4ピン(PD2)を使用しない方向で修正すると思うので
主にPORTCとPORTBで構成されることになるかと思います。
(割り込み処理がPD2を使う関係でPORTDが制限される)


割り込み処理とは、プログラムの実行中に割り込みの条件が起こることによって
一旦、そのプログラムを中断して割り込みプログラムを優先的に実行するシステムです。

AVRなどのマイコンは割り込み処理が定義されていて、
それにしたがって記述するだけで割り込み処理が実現できます。
(といってもこれがなかなか資料が無くて…^^;)

この割り込み処理でボタンを押している間はLEDの表示順序を反対にする
(双方向で表示が出来る)ようになり(し)ます。


まだプログラムも実験段階でとりあえず関数ポインタが使えるようになったくらいなので
実装は4月上旬かなー(遅い)。

それにしてもPD2を割り込みに使うとなるとプログラムの書き換えが面倒そうだな…。

そんな感じで再評価版も準備を始めています。
当たらしい物も何か作りたい…。でもアイデアが…orz。

だれかメンバー募集(ぇ
いや結構マジで

2011年3月20日日曜日

LEDバーサライタ再評価

前回のバーサライタでは、

・一方にしか文字が表示できない
・文字をあらかじめ決めておかなければならない
・文字が小さいので遠くから読みづらい
(バーサライタは遠くからの方がよく見えると感じたので)


などの問題があると感じました。
今回はそれをできるだけ改善する方向でいきたいと思っています。

まずは表示方法。
前回はLEDを縦に1列9個でしたが、今回は18個と倍に増やすつもりです。

5mmLEDを使っているので9個だと感覚1mmでも、
(5+1)*9=54mm
なのでたいした大きさではありませんでしたが、
倍に増やすことで表示サイズを108mmまで大きくすることができます。

108mmというとかなり遠くからも見えると思うので、大きいだけで暗くならないように
LEDも赤色に変えることにします。
最近手に入ったから使ってみようと思っただけなのは内緒。


大きくなったからと言って文字を書き換えるのも面倒なので出力はひとつでいきます。
つまり従来と同じ9ピンで18個を点灯させる予定です。

ここで問題になってくるのがマイコンからの出力可能電流で、
AVRの情報みてないですけどPICが±20mAらしいので同等かなーと。

今回LEDを10mA程度で使おうと思っているので、ちょっとオーバー気味かなと思い、
トランジスタを使うことにします。みんな大好き2SC1815!
まだ評価してないですけど、どうせスイッチング動作なので
あんまり気にしないでいいかなーと。(甘い?)


その次にプログラムのスケッチ(と言うと用語的には間違っているかも)。
いうなればアルゴリズムテスト用プログラムです。

今回は動的に表示するのが目標なのでそこを重点的に。

どうやら「関数ポインタ」とかいうので処理できるようです。
関数ポインタは関数に対するポインタでありアドレスを指し示し~なんて言っても
解る人には解るし、解らない人には解りません。

まあ今までのだと関数名(aとかbとか)を直接記入しないといけない
(=書き込み機で書き換えなければいけない)でしたが、関数ポインタを使うことで
関数をポインタの中に格納できます。(=プログラム中で選択できる)


たとえばA_writeという関数があったとして、
これを使用するには
A_write();
と記入する他ありませんでしたが、ポインタに入れると、
int (*pointer_name)();
pointer_name = A_write;
となり、呼び出しは
(*pointer_name)();
となります。カッコで囲んで先頭にアスタリスクです。

これだけだとあまりメリットは感じられませんが、真の使い道は配列にしてからだと思います。

同じく、関数A_writeとB_writeがあったとして、これを呼び出すならば、
A_write();
B_write();
となります。ちょっとC言語をさわったことがある人なら想像つくと思いますが、
これを例えばB_write→A_writeとしたいならば、一度プログラムを書き換えるしかありません。
実行中に選択するならばifとかforとかを使ってループさせれば実現出来ますが、
さらにCとかDとか増えてくるとifが増えてきたりともう大変なことになってきます。

上記を関数ポインタの配列として使うと、
int (*pointer_name[2])();
pointer_name[0] = A_write;
pointer_name[1] = B_write;
となります。呼び出しはもちろん、
(*pointer_name[0])();
(*pointer_name[1])();
となります。

こうするとちょっとメリットが見えてきました。
pointer_nameの配列番号を自由にいじることでfor 0 to 1やfor 1 to 0で
上からだったり下からだったり自由に選択出来ます。

こんな感じで今回はバーサライタに文字の選択を追加しようと思います。
しかしここで予想だにしない問題が!!!
続きます。

2011年3月19日土曜日

東北地方太平洋沖地震

前回の記事を投稿した当日、2011年3月11日金曜日にご存知のとおり地震が発生しました。
幸運なことに滋賀県在住のため被害などはありませんでしたが、
地震による災害は多くの生命を奪っていきました。

この件について多くのデマやチェーンメールが流され、
無為に不安を煽るような事がなされたことは遺憾です。

インターネットはもちろん民放や新聞でさえも多くの誤った情報が流されていると感じます。
どうか誤った情報に流されること無く、情報をよく吟味して、
正しい情報であろうと無作為に拡散することなく、口頭で伝えるなどの手段を取ってほしいと思います。

口頭で伝えることによって、現在の情報の真偽を疑うことができます。

地震により被害を受けていない人々が情報の撹乱により被害を大きくすることを人災と呼びます。
実害を受けた東北地方の方々のためにも落ち着いた行動をし、
現在、支援作業にあたっている方が全力で作業出来るように配慮してほしいと願います。