人気ブログランキング | 話題のタグを見る

組み込みプログラミングを極めたいw


もっとマイコンに優しい記述をしたいねw

かといって、アセンブラのような互換性の無い記述言語は嫌い。

C言語は、低レベルでの互換性があるとしても、高レベルの互換性は怪しいのが現実・・・

fgets と fwrite のような関係かなw
高校時代C言語習ったとき、この二つがどうして同時に存在しているのかわからなかったよ・・・
紐解けば、fgetsの中でfwriteが動いているようなものなんだよね・・・

そう考えると、低レベルを固めることこそが、C言語では重要な項目ではないだろうかと僕は思っているw


え~と・・・・ ここの観覧者の少ないBlogに、ありがたくも親切な助言やコメントをしてくださった方々がいてくれて、僕は大変嬉しいですw
ありがとうございます! 感謝感激です!

ちょっと、前々回と前回はあまりのも抽象的で どういうところで苦戦していたのかがわからないと思いますので、僕が解決したソースをお見せしますw


#define MAX_LENGTH 25

void strcut(char *out,char *in,char key)
{
char strtmp[MAX_LENGTH];
char *tmp = strtmp;

strcpy(tmp,in);
while( *tmp != '\0' && *tmp != key)
{
*out++ = *tmp++;
}
*out++ = '\0';

while( *tmp != '\0' && *tmp == key)
*tmp++;
strcpy(in,tmp);
}

void strmix(char *out,char *in,char key)
{
while(*out != '\0')
{
*out++;
}
while(*in != '\0')
{
*out++ = *in++;
}
*out++ = key;
*out++ = '\0';
}


動作の説明をすると、 strcut は、文字列から、キーとなる文字を識別してそこを区切りにカットするというものです。
実は、全く同じ?機能が strtok という標準関数の中にあったんですね~
ちょっと、ショックでしたねw まぁアルゴリズムが少々異なる気がするからいいのですがw
僕の strcut は、キーとなる文字を境に、前半と後半に分けますので、

*strin = "123 456 789";
strcut(stroutm,strin," "); //"123" "456 789"
strcut(stroutm2,strin," "); //"456" "789"
strcut(stroutm3,strin," "); //"789" ""

って感じで分割されていくから記述が楽???? ごめんエラーを気にすると一緒な匂いがするw

で、strmix は逆に、文字列の最後にキー文字となる空白を代入する関数ね。
コレによって、自作コマンドを解釈したり、自作コマンドを製作したりすることが出来るwww

まぁ、まだバグが可能性がある記述で、エラーについて何も書いていない罠・・・
strmixとか、25文字以上来たら怖~よw
こういうのは気が付いたときに変更すべきなんだろうね・・・



で、問題となっていたポインタなんですが・・・

char strtmp[MAX_LENGTH];
char *tmp = strtmp;

これ、一件無意味な宣言の用に見えるんですけどね・・・
はっきり言って無意味ですw あまり賢い記述とは思えないんですけどね・・・

まず、問題なのは 配列で宣言した変数をポインタで弄れない という点ですね
コレは良くわからない部分なんですが、コンパイラによって違うのかな・・・
意味は一緒なのはわかっていますよ?w
一応カーニハンとリッチーさんの本は愛読書ですからね・・・
ただ、コンパイルしたときにワーニングが出るのは、そのときは良いんですけど、今後巨大な設計の一部となると非常に怖いですねw

なので、配列で宣言した領域をポインタで取得すれば結局同じ意味だから、それ以降ポインタで操作できるではないか! という安直な考えですwww

本当は、mallocで領域を取得して操作すればいいんですけどね
低レベルなマイコンだとメモリーの管理が出来なかったり、付属のC言語の標準ライブラリーにmallocが無かったりしますのでね・・・
真の互換性を保った関数とはいえないのですよw
なので、あえてmallocを使わない方法で領域を確保した上でポインタで操作する手法を考えてみましたw


実際、この関数は R8C2A で動いていますwww
シリアルから送られてきたコマンドを解釈するのに非常に有効的ですwww
まぁ、strtokの方が使いやすいかもしれませんがね・・・


なんというか、僕はこういう低レベルな段階を組み合わせて高レベルな関数を作るのが好きみたいですw
atoi  とか自分で作れるし、改造して atohex を作ってみたりw
コレは、文字列を16進数に変換した関数ねw
まぁ、そんな感じで低レベルから関数を作るのが好きですねw C言語はwww


mallocとか、使い方がわかっても内部がわからないと怖くて使えないのが僕の悪いところですね・・・
C++になってさらにブラックボックス化が進んで非常に困ってます・・・
DLL何か怖くて手が出せない・・・orz

Linuxは面白いですねw PCIのLANドライバーまでC言語で記述されてますからねw
ソレをアレコレすれば、SHとかOS入れなくても操作できるはずなんだよね・・・理論的にはw


もっと透明性を持たせて、尚且つ必要ないときは見なくて済むような感じにならないのかな~w
C言語だとヘッダー読めばプログラムわかるはずなんですけどねw ボーランドもヴィジュアルも、標準ヘッダー隠してるし・・・orz
GCCにはあるのかな・・・w
コンパイル自作とかやってみたいな~ 今後の夢だろうなw IF文で頭狂いそうw

ノイマンの頭が世界最初のコンピューターであるとは、面白いことを言ったなw

by Noise_Blog | 2008-10-12 23:27 | 【電子情報】

<< Blogが移転いたしました!!!    C言語は奥が深い・・・w >>