現状
めちゃくちゃ 久しぶりに書きます。
最後は、C++で~ な感じでしたが、あれからまあ C++は慣れて
その後 JSP で、CSS が不慣れで、JavaScript もちょっとだったので携帯サイトの方を
作ったりして、HTML やらをやってました。
その後、PLSQL + VB6 を少しして、現在は
UNIX で C++ です。
IDEに慣れ親しんでいたので、非常にめんどくさいです。 エディタも Vi なんか使いたくないし
FTP で Windowsに落として ,テキストエディタ( ECLIPSE も無し)な状態で、業務の調査から
現状の開発に入っています。
オブジェクトの型とか、メンバとかが自動で出てこないと、一つ一つ検索して頭がこんがらがっています。
なんか良い開発方法ってないんですかねぇ
シリアル通信
しばらくぶりです。
実は最近は1ヶ月ほど初めての機器とのRS232通信をやっておりまして、初めてのRS232C通信をどうにか一人で調べてやり取りができるようになりました。
RS232C通信で重要なところをまとめてみます。
まず、どうやって送受信するのかというところですが、基本はファイルIOと同じで
COM: をオープンし、そこに Read/Write する感じです。
そして、受信に関してはスレッド処理にして、常に受信待機状態にして、ある程度データがたまり、相手からのデータが(私が行った装置では 簡単に言うと <STX>から<ETX>までのデータをコマンドとして扱う)きたら、受信イベント
を発生させる方法にしました。
そして、送信に関しては PCと機器が 1:1であり、送信データも1コマンドづつ送る形なのでスレッドにはしませんでしたが、複雑になると送信もスレッドにして、送られたコマンドを逐次送っていく形が通常みたいです。
そして、送受信時のエラー訂正はハードウェア的にもある(水平パリティ?)が、垂直パリティもチェックするようにもしました。
通信機器の仕様書が難解で苦労しましたが、どうにか機器と通信できたときは感動しました。
まあ、実際は、最初初めてうまくいった通信はフリーの通信ソフトでやりましたが・・・・
あ、あとリンクレベルの通信クラスとして、ネットにあった通信クラスを参考にさせてもらい重宝しました。
制御系のアプリの難しさを知れて楽しかった
C++疑問点
前回の問題点なんですが、
#include "stdafx.h" を入れないといけないのか?
うーん、いまいちよく解りませんが、入れとけみたいな感じみたいです。
プリコンパイルヘッダーは、ヘッダーをあらかじめコンパイルしといて、コンパイル速度を速めるというものです。
また、前回、C++ の test.h に定義した、メンバー変数(プロパティ)a,b にアクセスするのに this->a としているところも良くわかってません。
ただし、VisualC++ で開発する限り IDEがちゃんと指示してくれるので、ポインタなどのメンバーにアクセスで凄い悩むことは無いです。
さて、C++を扱いだして、数週間ですが、なかなか楽しい言語だというのがわかりました。
ただし、今の環境の問題かはわかりませんが、部品化についてはあまり優秀でないように思います。
Static な関数などは作成できるのでしょうか?
ま、そげな感じでやっております。
では
スコープ、メンバ参照接続文字等?
C++では通常、定義はヘッダーファイル( .h )に、実装はソースファイル( .cpp )に記述します。
通常と言ってるので、 .h に実装を書いても、 .cpp に定義を書いても良いんでしょう。 簡単な PGならそうしてもいいんでしょう。
このとき、メンバー関数(メソッド)の実装の際は、どのクラスのメンバーかを明確にするため、クラス名+演算子 '::' をメンバー名の前につける必要があります。
C# のように、クラスの実装はクラスの中で行うのではなく、 .cpp にクラス名::メンバー名を書いて実装します。
たとえば、
test.cs
class A {
private int a;
public int b;
public A(){
this.a = 0;
this.b = 0;
}
private void func1(){
a++;
}
public void func2(){
b++;
}
}
というような C#のソースは
test.h
class A {
public:
A();
~A();
private:
int a;
void func1();
public:
int b;
void func2();
}
test.cpp
#include "stdafx.h"
#include "test.h"
A::A(){
this->a = 0;
this->b = 0;
}
A::~A(){
}
A::func1(){
a++;
}
A::func2(){
b++;
}
で良いと思いますが・・
いろいろまた難しいところが。
実は上の C++ のソースは、デバッグしながら作成しました。
まず、 #include "stdafx.h" これがないと、
警告 1 warning C4627: '#include "test.h"': プリコンパイル済みヘッダーの使用を検索中にスキップされました
エラー 2 fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?
と、怒られます。
また、this-> のところも、なぜポインタなのかいまいち解りません。
これらについては、また次回までに勉強しときたいと思います。
では。
さっそく覚え書き
Visual C++
C++って調べると調べるほどいろいろな書き方がありますね
用語もいっぱい
C++/CLI,ATL,WTL,MFC,Win32・・・・
C++/CLI は、C++の.NETの中間コード生成する形式で、マイクロソフトが拡張した部分が沢山あるみたいです。
で、中間コード を作成するものをマネージ形式、ネイティブな実行コードを作成するものをアンマネージ形式と呼ぶ模様です。
ATLは、ActiveX や OCX みたいなものみたいです。
WTL は ATL のWindows描画関連のもの?
MFC は Windows のクラスライブラリです。
基本的な書き方は C と同じです。 Cのソースは C++コンパイラで通ります。
でポインタ。 一応Cはやったことあるので。
int aa,bb; int型の変数
int *pt; int型のポインタ宣言
pt = &aa; ポインタに aa のアドレスをセット
これで ptとaaのアドレスは同じ
aa=1234; aa に 1234を入れる。
bb=*pt; bb に ptの指してるアドレスの内容を入れる
つまり aa の指してるアドレスと同じだから aa の内容を入れているのと同じ。
キャストは C++ では 4つの方法があるみたいです。
1.Cの形式と同じ (型)式
2.単純型名(式) 関数形式
3.静的キャスト static_cast<目的の型>式
4.動的キャスト dynamic_cast<目的の型>式
3.と4.はまだ良くわかりません。
<>はジェネリック関数と思ってたら違うみたいです・・
メンバ参照演算子は "." と "->"があります。
違いは、 "." は構造体、共用体やクラスが実体表現されたときのメンバ参照に使う。
"->"は構造体、共用体やクラスがポインタとして表現されたときのメンバ参照につかう。
ここで、
struct smpt {
int aa;
char cc;
};
int main()
{
smtp dt; クラスや構造体のインスタンス作成 new はいらない?
smtp *p;
p = &dt; 構造体dtのアドレスをpに入れる
pは構造体dtのポインタ表現
dt.aa = 1000; 実体表現なので
p->aa = 2000; ポインタ表現なので
}
c++ で new は smtp *p; とかでポインタを定義したとき
p = new smtp; こんな使い方です。
C# とは随分違う使い方ですが、ポインタをイメージして、メモリ確保という意味合いでしょう。
でガーベージコレクションはないので、new でメモリ確保した場合
delete p;
とかで開放してやる必要があります。
クラスの場合、コンストラクタの開放版、デコンストラクタを設定すると開放時デコンストラクタを実行してくれます。
デコンストラクタの記述は ~クラス名です。
あと、CやC++ではプロトタイプ宣言が必要になります。
関数の型などを参照する前に宣言してあげます。
また、C#やjavaと違うところで
クラスは、プロトタイプ宣言でクラスの型、プロパティやメソッドの型を指定して、実体は外で
void class::a(int a){
~
}
などとして記述します。
また、プロパティやメソッドは C++ では メンバー変数、メンバー関数などと呼ぶのが通常らしいです。
あと、セッターやゲッターはメソッドとして普通の定義し、メンバー変数にprivate設定するだけの模様です。
以上長くなりましたが、数日勉強した結果を記しました。
