組み込みC/C++

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

関数に対するconst について

関数に対するconstですが、ここではconstのメソッドではなく戻り値に対するconstに関して見ていこうかと思います。意図をもってconstをつけることで関数のユーザに関数の機能を明確に伝えることができますが、逆に意味のないconstをつけることで関数のユーザ…

MathJaxに関するメモ

TEXの表示がおかしくなっていました。サイドバーのアドレスを変えたら直ったので記載しておきます。CDNと書いてあるから近場のサーバからサービスを供給してくれるのだと思います。 変更前のアドレス <script src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script> 変更後のアドレス

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

C++は型Checkが厳密で暗黙の型変換で行けると思っていたらキャストをつけないといけないパターンに良く出くわします。しかし気軽にキャストしていると思わぬ落とし穴がありますので切り取っておきます。 Pattern5 #include "stdafx.h" typedef short LEVEL; …

constの位置の覚え方

constの置く位置はいつも「どこに置くんだっけな?」と迷うものですが、僕の覚え方を紹介したいと思います。C言語の文献やサイトでは特に言及されているのを見たことがないので、内容の正しさには少し自信がありません。ひょっとするとコンパイラの作成者の…

乗算と除算

前回のエントリで乗算器と除算器の話題に触れました、今回はコーヒーブレークとして実践的ではないですが乗算と除算をハードウェアではなくてソフトウェアで実現する場合どうするかを見ていきたいと思います。 乗算(掛け算) 筆算の手順をそのまま再現します…

固定小数点数について

何回かに渡り初等関数の計算について取り上げてきました。本ブログのテーマが組み込みである事を差し置いて変数の型にdoubleを使用していましたが、実際に組み込みにおいてdoubleを使用するには、対象マイコンのアーキテクチャにFPU(Floating point number P…

XMLを作ってみる②

今回はデザインパターンの一つであるコンポジットパターンを応用してXMLを作ってみます。C言語で四苦八苦したソースが大分すっきりした形でかけます。前回と同様次のXMLを作成する事を目標とします。 <root> <tag1> <tag2>element_start</tag2> <tag2>element_middle</tag2> </tag1> <tag1> <tag3>element_last</tag3> </tag1> </root> コン…

対数関数( log )の数値的解法

今回は対数の数値的解法を整理しておこうと思います。まずは自然対数です。 テーラー展開での解法となりますが、ただ \(log(x)\) では0近傍でのテーラー展開ができませんので、工夫のためとりあえず\(log(1+x)\)及び、\(log(1-x)\)を展開します。 \begin{al…

平方根( sqrt )の数値的解法③

既に平方根の計算方法として最も有用なニュートン法を紹介していますが、その他にも興味深い方法がありますので紹介しておきます。 <テーラー展開> 平方根の計算方法としては難がありますが、計算機科学はテーラー展開の発見なしには語れません。\( sin(x)…

平方根( sqrt )の数値的解法②

引き続き平方根の数値的解法を見ていきたいと思います。ここではニュートン法での解法をまとめておきます。ほかの方法よりも収束が早く平方根の解法としてmath.hで定義されているのがニュートン法です。 <ニュートン法> ニュートン法も二分法と同じく平方…

平方根( sqrt )の数値的解法①

math.h で定義されている初等関数の数値計算に関してまとめておこうかと思います。(必ずしもmath.hで定義されているものと同じとは限りませんので注意ください)まずは一番初歩的な平方根( sqrt )の解法を幾つか紹介します。 <二分法> 平方根を方程式の問題と…

doubleを掘り下げる

doubleの中身を確認し整理しておこうと思います。浮動小数点演算標準としてIEEE754で定義されていますが、少し難解な印象があります。まず前提としてすべての実数\(x\)は \begin{align*} x=(-1)^{(2-\delta)} \cdot \alpha \cdot 2 ^n \tag{1}\end{align*} …

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

ビットフィールドを掘り下げる①では主にビットフィールドで宣言した構造体のサイズに注目しました。今回は符号修飾 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>…