院長のメモ帖
2016年5月15日 日曜日
C#プログラマへのC/C++の罠
ずいぶん、前回の記事から時間が開いてしまいましたが、除湿器の方は一応の完成をしていて、運用状態に持ち込めています。
この件についても製作記事をまとめたいところですが、今回はちょっと違う切り口で...
Arduinoの開発はVisual StudioにVisual Microを組み込んでC/C++で開発していますが、C#との違いになれるまでずいぶんあほな間違いを犯しました。
数年前にH8Tinyで開発したときにある程度C++をマスターしたつもりでしたがもうすっかり忘れてました。
CもMS-DOSの時代はポインターを使ったプログラムもばりばり書いてたはずですが、やっぱり結構忘れています...
そう、プログラミング言語も慣れが重要です。どっぷりC#に浸かりきってしまい初心者なバグを連発しています。
まず、最初にやらかしたのはinclude文、というかヘッダファイルの書き方。CPPとhの使い分けが全然思い出せませんでした。
変数の宣言の先頭にexternをつけて、headに記載し、どこか一か所のCPPで実体を定義するという、C時代なら当たり前にやっていたところからつまづきました。
あらためて、1か所で定義すればOKなC#のありがたみを感じました。
それから、アクセス修飾子にinternalがない!
これは、C#にはあるモジュールの概念がないからどうしようもないのですが、internal classを作れないと、外からはいじらせたくないけど関連するクラス間のデーター共有のためのローカルクラスが作れない...
まあ、気にせずにグローバルに定義するとか、名前空間をうまく利用すればいいのでしょうが...
それからforeach構文に相当する、for( : )構文。こんなの昔なかったけど、CPP2011から使えるようになったんですね。とてもありがたいです。
でも、なんでこんな構文なんだろう。JavaやC#にあわせて素直にforeachにすればいいと思うんですが、キーワードを極力増やさないためなんでしょうか。
逆にC#にはなくて、便利だと思った機能の筆頭に関数内のstatic変数。
C#だとclass内のprivateフィールドで対応するしかないですが、特定の関数でしか使わない変数をクラス全体で共有しなくちゃならないのは、スコープがでかすぎます。
他にもいろいろ躓いたり頷いたりしてますが、順調にarduino開発にのめりこんでいます。
前述の除湿器のほかにも、検査キット用タイマー(キッチンタイマーみたいなものですが、あらかじめ院内で使う検査キットの時間をプリセットしてある)も作って、フィラリア検査の効率化に寄与しております。
この件についても製作記事をまとめたいところですが、今回はちょっと違う切り口で...
Arduinoの開発はVisual StudioにVisual Microを組み込んでC/C++で開発していますが、C#との違いになれるまでずいぶんあほな間違いを犯しました。
数年前にH8Tinyで開発したときにある程度C++をマスターしたつもりでしたがもうすっかり忘れてました。
CもMS-DOSの時代はポインターを使ったプログラムもばりばり書いてたはずですが、やっぱり結構忘れています...
そう、プログラミング言語も慣れが重要です。どっぷりC#に浸かりきってしまい初心者なバグを連発しています。
まず、最初にやらかしたのはinclude文、というかヘッダファイルの書き方。CPPとhの使い分けが全然思い出せませんでした。
変数の宣言の先頭にexternをつけて、headに記載し、どこか一か所のCPPで実体を定義するという、C時代なら当たり前にやっていたところからつまづきました。
あらためて、1か所で定義すればOKなC#のありがたみを感じました。
それから、アクセス修飾子にinternalがない!
これは、C#にはあるモジュールの概念がないからどうしようもないのですが、internal classを作れないと、外からはいじらせたくないけど関連するクラス間のデーター共有のためのローカルクラスが作れない...
まあ、気にせずにグローバルに定義するとか、名前空間をうまく利用すればいいのでしょうが...
それからforeach構文に相当する、for( : )構文。こんなの昔なかったけど、CPP2011から使えるようになったんですね。とてもありがたいです。
でも、なんでこんな構文なんだろう。JavaやC#にあわせて素直にforeachにすればいいと思うんですが、キーワードを極力増やさないためなんでしょうか。
逆にC#にはなくて、便利だと思った機能の筆頭に関数内のstatic変数。
C#だとclass内のprivateフィールドで対応するしかないですが、特定の関数でしか使わない変数をクラス全体で共有しなくちゃならないのは、スコープがでかすぎます。
他にもいろいろ躓いたり頷いたりしてますが、順調にarduino開発にのめりこんでいます。
前述の除湿器のほかにも、検査キット用タイマー(キッチンタイマーみたいなものですが、あらかじめ院内で使う検査キットの時間をプリセットしてある)も作って、フィラリア検査の効率化に寄与しております。
投稿者 美濃加茂市のIT獣医師 近藤 博 | コメント(0)
コメントする