共通のプログラムは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には、下に上げるようなクラスをまとめました。

 

  1. Calcuクラス

    public:
    PSYCAL Cal_PsycalPoint(CDataManager* data, double po);任意の2点より空気状態を計算
    bool EnableCalCheck(CDataManager* data);空気状態計算で有効データかどうかのチェック

     

  2. 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);

     

  3. 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);

     

  4. 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;

    乾球温度より比重を算出


     

  5. PsyDataクラス

    空気状態点を保持するためのクラス

     

大まかなクラスや関数を説明しましたが、ここで使われている変数や構造体は独自に作成しました。

省略している部分が多々ありますが、作成方法は理解していただけたと思います。

もし、詳細について興味がおありでしたら、メールなどでご連絡ください、ヘッダーファイルやライブラリーファイルを無償で配布いたします。


ページ先頭に戻る
最終更新日: 2020/02/04