組み込みC/C++

C/C++リテラシー向上のためのページ

2013-01-01から1年間の記事一覧

ビットフィールドを掘り下げる②

ビットフィールドを掘り下げる①では主にビットフィールドで宣言した構造体のサイズに注目しました。今回は符号修飾 signed, unsigned, 符号なしに注目したいと思います。 struct StBit{ unsigned char foo: 4; unsigned char bar: 4; }; 通常、上記のように…

ビットフィールドを掘り下げる①

ビットフィールドを指定した場合、一般には下のような書き方をします。 struct StBit0 { unsigned btFirst: 1; unsigned btSecond: 1; unsigned btNull: 5; unsigned btLast: 1; }; 今回注目したいのはビットフィールドで宣言した構造体変数のサイズについて…

ポインタでやってしまうミス③

ポインタというよりかは、演算子の優先順位に関する物ですが、ミスしがちかなと思いましたので切り取っておきます。 Pattern 4 #include <stdio.h> void mesurement(unsigned int *iChk, unsigned char cNum); int _tmain(int argc, _TCHAR* argv[ ]) { unsigned int </stdio.h>…

volatileの使い方②

volatileの使い方としてvolatileの使い方①で説明しました。ここではその続きとして他のパターンを見てみたいと思います。 Pattern 5 unsigned int iTimer;#pragma interruptvoid Interrupt1msecTimer(void){ if(iTimer){ iTimer--; }}void PortWait(void){ i…

バイナリとテキスト②

テキストがバイナリのサブセットな為、基本的にはバイナリと言っていれば間違いではないのですが、それでもテキストとバイナリは意識して使い分けています。(以下は私の解釈なので一般的ではないかもしれません) テキストファイルとバイナリファイルというと…

バイナリとテキスト①

バイナリとテキストが並列関係にあるものと誤解する場合が見られますが(直積集合である順序対の関係と勘違いしている。) テキストはバイナリのサブセットであり、バイナリはテキストのスーパーセットです。 テキスト ⊂ バイナリ(テキストはバイナリの部分集…

条件付きコンパイル②

今回も条件付きコンパイルの詳細を見ていきましょう。 例2.否定 #include <stdio.h> #define YELLOW 0 #define BLUE 1 #define LED //#define GREEN void func(int num){ printf("%d\n", num); } int main(){ /* 否定 */ #if !YELLOW //真 func(11); #endif //#if !LE</stdio.h>…

条件付きコンパイル①

条件付きコンパイル、プリプロセッサは、コンパイラの違いを吸収したり、テストコードを残したり、同じソースをプロジェクト毎に使い分けたり、コメントアウト(//や/**/、/**/は入れ子が出来ないので)の代わりに使ったりと、どのプロジェクトでも大活躍だと…

volatileの使い方①

型修飾子にはconstとvolatile(人によっては型修飾子はlongとかshortのサイズ修飾のキーワードを指している場合があるようですが、ここではK&Rに従います。)がありますが、volatileを使う事はそうそうないかと思います。しかしマイコンの周辺機能を使用するエ…

ポインタでやってしまうミス②

一番基本的なミスを切り取っておこうかと思います。 Pattern 3 #include <stdio.h> int _tmain(int argc, _TCHAR* argv[ ]) { int *bar ; *bar = 100; return 0; } ローカルでポインタを宣言しています。その時点ではアドレスを入れる箱があるだけで、ポインタの値(b</stdio.h>…

古のコード①

一般的な開発というのは古くからの流用ソースを使いますのでレガシーコードの中に古の仕様を見ることが良くあります。 far と near 修飾子 これらの修飾子は16bitから32bitへの移行期に見られたマイコン独自に持つ修飾子です。概ねnear は2byte, farは4byte…

暗黙の型情報

関数プロトタイプの混乱①で一度暗黙の型情報に関して紹介しました。そんな中次のようなプログラムを見つけました。 型情報なしの関数 func_a(int x); int main(){ func_a(100); return 0; } func_a(int x) { printf("%d\n", x); return 0; } このプログラム…

ポインタでやってしまうミス①

ポインタのミスはやってしまいがちです。多くの場合はスコープの消滅に関連しているような気がします。というわけでポインタのミスのパターン化のために悪い例のプログラムを切り取っておこうかと思います。 Pattern 1 #include <stdio.h> char *foo; char *sub_routi</stdio.h>…

添字演算子と間接参照演算子の振る舞い

添字演算子[ ](ブラケット)と間接参照演算子*(アスタリスク)の振る舞いで迷わないために少しまとめておこうかと思います。 宣言時 char *foo = "abc"; char bar[ ] = "abc"; では確保するRAM(もしくはスタック)が異なります。間接参照演算子を使って初期化し…

クラスTemplate内のメンバの実体化

クラスTemplate内のメソッドはヘッダ内に定義する事となっています。試しに.cpp側で定義をするとコンパイルは通るのですがリンクエラーになってしまいます。そういえばコンパイルというのはcppファイル毎に行うものでした。Templateクラスのcppファイルをコ…

多相性について

CからC++へプログラムを移行する動機として多相性を使いたいというのがあるかと思います。さて、次のようなCソースがありました。これを多相性を使って、オブジェクティブなソースにしてみましょう。 void *copy_char(char *to, const char *from, int lengt…

動的引数の仕組み

動的引数(可変引数)のプロトタイプ宣言のお話しがありました。printf文の裏ワザのお話しもありました。どちらもきちんとした説明は省いてしまいました。ということでここでは、Visual C++でのお話しに特化してしまいますが、動的引数の中身を理解しておこう…

関数プロトタイプの混乱④

プロトタイプ宣言の中でも動的引数の宣言方法はかなり特殊です。printfの定義で使われているのですが、とりあえず動的引数のサンプルを見てみたいと思います。 Pattern 11 #include <stdio.h> #include <stdarg.h> int func(int arg_num, ... ); int main(){ func(5, 4, 3, 2, 1</stdarg.h></stdio.h>…

関数プロトタイプの混乱③

C++で追加されたデフォルト引数について見ていきましょう。 Pattern 6 double func(int i_a, int i_b ); int main(){ func(3); } double func(int i_a, int i_b ){ printf("i_a=%d\n",i_a); return(0); } Pattern 6はCではコンパイルできますが、C++ではエラ…

関数プロトタイプの混乱②

前回のエントリ関数プロトタイプの混乱①では前方宣言なしのパターンを扱いました。今回は関数宣言、プロトタイプ宣言有りの場合について考えていきたいと思います。 Pattern 4 double func(); int main(){ func(3); } double func( int i_a ){ printf("i_a=%…

関数プロトタイプの混乱①

CとC++では関数プロトタイプの考え方が違いますが、そのことを理解されている方というのは意外と少ないように思います。Cでの関数プロトタイプに関する仕様の曖昧さが為、混乱を招いていると思いましたので少しまとめてみます。ところで、 関数定義 ≠ 関数宣…

Template Methodのインターフェースを抽象クラスにする

Template Methodはデザインパターンの中でも最も理解のしやすいメソッドであり、C++設計の基本となるものです。一般的にはTemplate Methodはインターフェースで提供されますが、ほとんど共通という処理を抜き出したときは抽象クラスで定義してみるとよいかと…

構造体を使ったテクニック②

構造体は便利ですが面倒と感じるのが初期化や、メンバ一つ一つへの代入だと思います。ここではすべてのメンバが同じ型である場合に限定して使えるTIPSを紹介します。 「構造体を配列にして使う」 typedef struct StData_{ unsigned int x; unsigned int y; u…

構造体を使ったテクニック①

組み込みのプログラミングでは外部デバイスとアドレスの受け渡しを行うことが良くあります。デバイスメーカが決めたプロトコルに従ったり、独自のプロトコルを取り決めたりとさまざまなケースがあると思います。ここではbyte単位でコマンドを送受信する場合…

構造体変数の考察

先のエントリビットフィールドの使用方法の中でキャストをdefineする方法を紹介しました。 typedef struct BIT_TYPE1_{ unsigned btCom0:1; unsigned btCom1:1; unsigned btCom2:1; unsigned btCom3:1; unsigned btDummy:4; } BIT_TYPE1; #define DfBitType1…

ビットフィールドの使用方法

組み込み現場ではフラグ処理を多用するかと思います。イベント発行などでフラグ処理を使っている場合はフラグではなくキューでのイベント発行を心掛けた方がよいかと思いますが、それでもフラグ処理が有効な場合は多々あるかと思います。 ここでは一例として…

case文を消したい③

次のプログラムを見てください。 cliant.cpp #include "stdafx.h" #include <conio.h> #include <iostream> void sequenceTask(void); unsigned int iTask = 0; int _tmain(int argc, _TCHAR* argv[ ] ) { iTask = 1; while(iTask){ sequenceTask(); } return 0; } void sequenc</iostream></conio.h>…

はてなキーワード

ソースにリンクが張られるのは、はてなキーワードのせいでした。 はてなでは当たり前なんですね。知らなかった。 mallocとかenumはあるのにreallocはないんですね。 CSSではどうにも出来そうにないですね。 なんらかの対策をしばらく探ってみます。 → 暫定と…

XMLを作ってみる①

XMLはNETWORKの基盤技術のため現代プログラマにとっては必須の技術です。XMLの作成やパースという作業を一度は経験しているのではないでしょうか?ただし、多くの場合フレームワークがXMLオブジェクトを作るためのインターフェースを準備してくれているので…

オブジェクト指向?

構造化プログラミングからオブジェクト指向へというのをよく聞きます。 構造化プログラミングの定義を調べると「一つの入口と一つの出口を持つプログラムは、順次・選択・反復の3つの論理構造によって記述できる」とあります。 順次はPCが逐次実行されていく…