組み込みC/C++

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

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

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が逐次実行されていく…

case文を消したい②

前回に引き続きcase文の回避方法です。今回は多相性(多様性、多態性、どれが正しい表現かわかりませんが関数のオーバーロードを使います)を使ってみたいと思います。 リファクタリング対象のコードは下記になります。 cliant.cpp #include <iostream> #include <conio.h> #inclu</conio.h></iostream>…

case文を消したい①

case文といえば後の変更がわずらわしい悪の権化のように語られます。そんなわけでcase文の消し方を紹介しようかと思います。 リファクタリング対象のコードは以下のようなコードです。 #include <iostream> #include <conio.h> void writeWhiteTask(void); void writeBlueTask(v</conio.h></iostream>…

”長さ”について

文字列やバイナリデータを扱う上で”長さ”は非常に大切な要素です。しかしながらなかなか長さについて言及される事がないように思いましたので、ここで”長さ”について改めて考えてみます。 たまに”長さ”なのに0スタートで数えるプログラム(0x00~0x0Fの長さを…

ゼロ初期化する時にどうするべきか?

C言語ならアドレスの初期化は NULL ←(void *)0 で定義されている事が多いですが処理系のstdio.hの中身をチェックしてみてください。多くの場合0で構わないと思われます。void*でキャストしたときの評価が16bit, 32bitと選べる処理系もあるようです。 C++言語…

ヘッダのプロトタイプ宣言にstaticをつける

下記のようにヘッダのプロトタイプ宣言にstaticをつけるとどうなるでしょうか? ab.h static void g_func(void); a.cpp #include "ab.h" int main(void){ g_func(); return 0; } b.cpp #include <iostream> #include "ab.h" static void g_func(void){ std::cout << "</iostream>…

#define をconstにすべきか?

C++の教科書を見ると定数は#defineを使用しないでconstを使用する事を推奨しています。しかし組み込みシステムではいささか疑問が残ります。多くの人が経験するように組み込みシステムのリソースは常に逼迫しています。出来るだけオブジェクトの容量は小さ…

C言語アドレス(ラべリング)の不備

C言語ではコンパイラがコンパイルの際にリンカが検索できるようにグローバル関数の名前を変えます。void a_func(void) とあったらオブジェクト(アセンブリ)では _a_funcのように接頭に_(アンダーバー)が付帯されて表現されます。ここに引数の情報がない事で…

関数プロトタイプの多重宣言

次のようなプログラムに出くわすことがあります。 a.cpp void g_func(void); int main(void){ g_func(); return 0; } b.cpp #include <iostream> void g_func(void); void g_func(void){ std::cout << "文字出力" ; } どっちにも同じ名前のg_funcというプロトタイプ宣</iostream>…