共通のプログラムはDLL化したい
- ◆プログラム作成ガイド
- ◆プログラムの開始
- ◆初期表示のデザイン
- ◆データの入力方法
- ◆クラスの作り方
- ◆データをメモリーに
- ◆ファイル読み書き
- ◆データの保存方法
- ◆ツリービューマウス右
- ◆画面表示インプリメント
- ◆複数のページ印字
- ◆DLL化する
- ◆エクセル似の入力
ここに紹介するプログラムは、WIN
XP 2003/Windows 7 (32bits) -
OS 環境でマイクロソフトのVisual Studio 2010 で作ったものです。
Windows XP/
Windows 7(32bits) での動作は確認済みですが…
共通で使うことが考えられるコードは、DLLとして作成しました。
将来別のプログラムでも再利用が出来るように考えたのですが...
Cプログラミングを習い始めた頃、参考書では「ひとつの関数は出来るだけすっきりとコーディングすべき」とありエキスパートになると、ほんの数行で関数を作るのが良いと書かれた本が多かったと思います。
本来はスピードと安定があるコードが良いと思うのですが、後々のメンテナンスを考えると一つの関数にだらだらとコーディングするのは確かにわかり難くなります。
C++のオブジェクト指向プログラミングは、更に基底クラスを整然と作り、それから派生させて作る方法が良いのでしょ うが、それには作り始める前に体系だった考えにまとめなければ難しいと思います。
特にC言語で過去に作成した資産の再利用の場合は、なかなか体系だったコードになりません。ここで使われているDLLも過去にC言語で作成していたコードの再利用ですので、悪い典型かもしれません。
然しながら、作り直し程の根気はないため、以下の点に気を付けてDLLとしました。
SunApp.DLL |
太陽の輻射熱を計算するのに必要な関数群 |
Psycal.DLL |
空気状態を計算する関数群 |
PsyDLL.DLL |
上記の空気状態計算を利用したリソースを含んだ関数群 |
HayFunc.DLL |
ファイルの入出力やデータの一般的なチェックなど |
ファイルの大きさはそれ程でもありませんが、プログラム計算の中心的な部分です。
SunApp.DLL
このDLLには、下に上げるようなクラスをまとめました、 リソースを含んだデータ入出力ダイアログクラスです。
-
CountryDlgクラス
-
SunCalDlgクラス
-
YearTempDlgクラス
Itemsクラス
国情報を扱う関数群です、緯度・経度の度や分を度に換算する関数
double Keido_cal(int keidod, int keidof) const;
double Ido_cal(int dd, int ff) const;
double Deg_cal(int dd, int ff) const;
外部国情報ファイルを読み込む関数
BOOL GetCountryData(CString data);
BOOL CountryDataFileRead(LPCTSTR fname);
ダイアログで入力したデータを内部変数に登録する関数
void SetCountryName(LPCTSTR ctry);
void SetIdod(int idod);
void SetIdof(int idof);
void SetKeidod(int keidod);
void SetKeidof(int keidof);
void SetTimeDiff(double td);
void SetAlt(int alt);
void SetOaDb(double oadb);
void SetOaWb(double oawb);
void SetOaRh(double oarh);
void SetZone(int zone);
内部変数から国情報を呼び出す関数
LPCTSTR GetCountryName()const;
int GetIdod();
int GetIdof();
int GetKeidod();
int GetKeidof();
double GetTimeDiff();
int GetAlt();
double GetOaDb();
double GetOaWb();
double GetOaRh();
int GetZone();
Orientクラス 太陽輻射熱を計算する関数群
public:
COrientData OrientSun(ymd, itm, time, orient); |
方位別の輻射熱量を計算する関数 |
||
CDate* ymd |
ymdクラスメンバ |
||
CItems* itm |
Itemクラスメンバ |
||
double time |
時間 |
||
int orient |
方位係数 |
||
|
戻り値はCOrientDataクラスメンバ |
||
double m_ivs; |
|||
double m_ivd; |
|||
double m_cid; |
太陽入射角 |
||
double m_cosi; |
日射入射角の余弦 (rad) |
||
double m_tang; |
|||
|
double m_tanp; |
|
|
|
double m_sr; |
日の出の時間 |
|
|
double m_ss; |
日没の時間 |
熱量単位を変換する関数
COrient(BOOL unit); // unit=0 Kcal/h, unit=1 Watts
Responceクラス(スペルミス - Response のつもりですが直してません)
相当温度を計算する応答係数を計算
public:
double CResponce_cal(int density, int i, double sat);
Spaceクラス 太陽の天空輻射量を計算する基本関数
public; |
戻り値は double (均時差)
|
|||
double SekiCal(yr, acc); |
||||
|
int yr |
計算する年(西暦年数) |
||
int acc |
1月1日よりの通年の日数 |
|||
double Kinjisa(yr, acc); |
戻り値は double (均時差計算)(山崎の式) |
|||
int yr |
計算する年(西暦年数) |
|||
int acc |
1月1日よりの通年の日数 |
|||
double Doukei(yr, acc); |
戻り値は double (公転動径) |
|||
nt yr |
計算する年(西暦年数) |
|||
int acc |
1月1日よりの通年の日数 |
|||
double SpcSun(yr, acc); |
戻り値は double (大気圏外の太陽熱量) |
|||
nt yr |
計算する年(西暦年数) |
|||
int acc |
1月1日よりの通年の日数 |
|||
double Ajst_altitude(alt); |
戻り値は double (高度補正) |
|||
|
int alt |
海抜(m) |
||
double Jikaku(time, td, keido, kj); |
||||
double time |
計算する地点の時間 |
戻り値は double (時角) |
||
double td |
時差(日本標準時を標準) |
|||
double keido |
経度 |
|||
double kj |
均時差 |
|||
double Sin_h(seki, jku, ido); |
戻り値は double (太陽高度) |
|||
double seki |
均時差 |
|||
double jku |
計算する地点の時角 |
|||
double ido |
計算する地点の緯度 |
|||
double IshSun(sh, mn, time, ajst, izero, zone); |
戻り値は double (天空輻射量) |
|||
double sh |
太陽高度 |
|||
int mn |
計算する月 |
|||
double time |
計算する時間 |
|||
double ajst |
高度補正 |
|||
double izero |
大気圏外の太陽熱量 |
|||
UINT zone |
計算する地区のゾーン設定 |
|||
double IdnSun(sh, mn, time, ajst, double izero, UINT zone); |
戻り値は double (直達日射量) |
|||
double sh |
太陽高度 |
|||
int mn |
計算する月 |
|||
double time |
計算する時間 |
|||
double ajst |
高度補正 |
|||
double izero |
大気圏外の太陽熱量 |
|||
UINT zone |
計算する地区のゾーン設定 |
|||
CSpaceData PreCal(double ido, double keido, double td, CDate* ymd); |
戻り値は予備計算 CSpaceDataクラス
|
|||
double ido |
計算する地点の緯度 |
|||
double keido |
計算する地点の経度 |
|||
double td |
計算する地点の時差(日本との時差) |
|||
|
CDate* ymd |
計算する年月日(CDateクラスメンバ) |
||
CSpaceDataクラスメンバの説明 |
||||
m_seki | 太陽赤緯 | |||
m_kj |
近似角 |
|||
m_izero |
大気圏外の太陽熱量 |
|||
m_sr |
日の出の時間 |
|||
m_sr |
日没の時間 |
SunFuncクラス
YearTempDlgクラスを呼び出すための関数
void GetYearTemp(void);
PsyCal.DLL
このDLLには、下に上げるようなクラスをまとめました。
-
Calcuクラス
public:
PSYCAL Cal_PsycalPoint(CDataManager* data, double po);任意の2点より空気状態を計算
bool EnableCalCheck(CDataManager* data);空気状態計算で有効データかどうかのチェック -
DataManagerクラス
public:
内部変数よりデータを呼び出す関数
CString GetStrDb();
CString GetStrWb();
CString GetStrRh();
CString GetStrDp();
CString GetStrHi();
CString GetStrXi();
CString GetStrDn();
内部変数にデータをセットする関数
void SetStrDb(CString db);
void SetStrWb(CString wb);
void SetStrRh(CString rh);
void SetStrDp(CString dp);
void SetStrHi(CString hi);
void SetStrXi(CString xi);
void SetStrDn(CString dn); -
PsycalApp(PsycalFunctionクラスよりの派生クラス)
public:
/* --------------- コンストラクタ ------------------- */
CPsycalApp();
CPsycalApp(int unit);
virtual ~CPsycalApp();
/* ---------------- 計算結果の出力 ------------------- */
PSYCAL SetData(double db, double wb, double rh, double dp,
double hi, double xi, double px, double dn, double mt);
/* --------------- 応用計算 -------------------------- */
double cal_H_KcalG(double kcal, double g);
double cal_AIR_KcalDh(double kcal, double dh); 熱量とエンタルピ差で風量算出
double cal_TH_GDh(double g, double dh); 風量Gとエンタルピ差より風量算出
PSYCAL cal_SHF(PSYCAL pn, double shf, double cf, double mt, double po);
PSYCAL cal_SHF_AirQtyTh(PSYCAL p1, double shf, double cf, double kcal,
double qty, double po) const;
PSYCAL cal_SHF_FixedSaTemp(PSYCAL p1, double shf, double satemp, double po);
PSYCAL cal_SHF_FixedOffTemp(PSYCAL p1, double offxi, double shf, double cf, double po);
PSYCAL cal_SHFOnPointDt(PSYCAL pt1, PSYCAL pt2, double dt, double po);
PSYCAL cal_SHFOnPointQtyTh(PSYCAL pt1, PSYCAL pt2, double qty, double th, double po);
PSYCAL cal_SHFOnPointDh(PSYCAL pt1, PSYCAL pt2, double dh, double po);
PSYCAL cal_Heat_Temp(PSYCAL p, double temp, double po);
PSYCAL cal_Heat_Air(PSYCAL p, double kcal, double saqty, double shf, double po);
PSYCAL cal_Mix(PSYCAL p1, PSYCAL p2, double ratio, double po);
PSYCAL cal_Dlt(PSYCAL p1, PSYCAL p2);
double cal_FanLoad(double qty, double sp);
PSYCAL cal_Heat_Hum(PSYCAL pn, double shf, double dh, double po);
double cal_Udx(double u, double dx);
double cal_Udh(double u, double dh);
/* ------------ 任意の2点より各データの算出 -----------*/
PSYCAL cal_HX(double hi, double xi, double po);
PSYCAL cal_DPH(double dp, double hi, double po);
PSYCAL cal_RHX(double rh, double xi, double po);
PSYCAL cal_RHH(double rh, double hi, double po);
PSYCAL cal_RHDP(double rh, double dp, double po);
PSYCAL cal_WBX(double wb, double xi, double po);
PSYCAL cal_WBDP(double wb, double dp, double po);
PSYCAL cal_WBRH(double wb, double rh, double po);
PSYCAL cal_DBX(double db, double xi, double po);
PSYCAL cal_DBH(double db, double hi, double po);
PSYCAL cal_DBDP(double db, double dp, double po);
PSYCAL cal_DBRH(double db, double rh, double po);
PSYCAL cal_DBWB(double db, double wb, double po);
-
PsycalFunctionクラス
public:
void SetUnitChange(int unit);
CPsycalFunction();
virtual ~CPsycalFunction();
double CALWKJ(int unit) const;
double Vpre(double db) const;
飽和蒸気圧を算出
double Abs_p(double pr, double po) const;
蒸気圧から絶対湿度を算出
double Vp_xi(double xi, double po) const;
絶対湿度から蒸気圧を算出
double Hum_db(double db, double pr) const;
相対湿度を算出
double Vp_dbrh(double db, double rh) const;
蒸気圧を算出
double Dew_t(double pr) const;
露点温度を算出
double Dew_prh(double pr, double rh) const;
乾球温度を算出
double Ab_dww(double db, double wb, double po) const;
絶対湿度を算出
double Ab_dwi(double db, double wb, double po) const;
絶対湿度を算出
double Db_xiwbw(double xi, double wb, double po) const;
乾球温度を算出
double Db_xiwbi(double xi, double wb, double po) const;
乾球温度を算出
double Wb_dbxi(double db, double xi, double po) const;
湿球温度を算出
double DryAir_Svol(double db, double po) const;
ドライ空気の比容積を算出
double Svol(double db, double xi, double po) const;
絶対湿度より比容積を算出
double Db_vxi(double vl, double xi, double po) const;
相対湿度より乾球温度を算出
double Ab_vdb(double vl, double db, double po) const;
絶対湿度を算出
double Steam_Entalpy(double db) const;
乾き蒸気のエンタルピ算出
double Entalpy(double db, double xi) const;
エンタルピを算出
double Ab_hidb(double hi, double db) const;
絶対湿度を算出
double Db_hixi(double hi, double xi) const;
乾球温度を算出
double DryAir_Spedn(double db, double po) const;
ドライ空気の比重を算出
double Spedn(double db, double xi, double po) const;
乾球温度より比重を算出
-
PsyDataクラス
空気状態点を保持するためのクラス
大まかなクラスや関数を説明しましたが、ここで使われている変数や構造体は独自に作成しました。
省略している部分が多々ありますが、作成方法は理解していただけたと思います。
もし、詳細について興味がおありでしたら、メールなどでご連絡ください、ヘッダーファイルやライブラリーファイルを無償で配布いたします。
ページ先頭に戻る
最終更新日: 2020/02/04