組み込みC/C++

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

2013-03-01から1ヶ月間の記事一覧

クラス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オブジェクトを作るためのインターフェースを準備してくれているので…