Calling TRNSYS Functions from C/C++

2023/09/19追記 TRNSYS18以降、C/C++のヘッダーファイルが標準で用意されています。詳しくは「7.7. Programming a Type in C++」を参照。

TRNSYSの関数をC/C++から呼び出す方法について紹介します。というか備忘です。
In this article I will explain how to call TRNSYS functions from C/C++.

引数/argument

C/C++では引数は下表のように置き換える必要があります。
In the C/C++ language, the argument needs to be replaced as shown in the table below.

FORTRANC/C++
Integerint*
Real(8),
Double Precision
double*
Character(Len=n)char*, size_t n

コーディング例

Integer

– TRNSYS.h

extern “C” __declspec(dllimport) void _cdecl SETTYPEVERSION(int* ver);
#define setTypeVersion                 SETTYPEVERSION

– Source code

if (getIsVersionSigningTime())
{
     int ver = 17;
     setTypeVersion(&ver);
     return 1;
}

Double Precision

– TRNSYS.h

extern “C” __declspec(dllimport) double _cdecl TRNSYSFUNCTIONS_mp_GETINPUTVALUE(int* n);
#define getInputValue                   TRNSYSFUNCTIONS_mp_GETINPUTVALUE

– Source code

int no = 1;
double ret = getInputValue(&no);

Character

文字列を渡す引数では、size_t(文字列の長さ)を引数の最後に加える。
NOTE: For string argument, the length(size_t) has to be added at the end of the arguments.

– TRNSYS.h

extern “C” __declspec(dllimport) void _cdecl SETINPUTUNITS(int*i, char* string, size_t len);
#define setInputUnits                   SETINPUTUNITS

– Source code

int i = 1;
setInputUnits(&i, “DM1”, 3);  

戻り値/return value

戻り値は下表のように置き換えます。
In the C/C++ language, the return value needs to be replaced as shown below.

FORTRANC/C++
Logicalint
Integerint
Real(8),
Double Precision
double
Character(Len=n)char* , size_t n

コーデング例

Logical

– TRNSYS.h

extern “C” __declspec(dllimport) int    _cdecl TRNSYSFUNCTIONS_mp_ERRORFOUND(void);
#define ErrorFound                     TRNSYSFUNCTIONS_mp_ERRORFOUND  

– Source code

if (ErrorFound()) return 1; // 0:false, except 0: true in C/C++

Integer

– TRNSYS.h

extern “C” __declspec(dllimport) int _cdecl TRNSYSFUNCTIONS_mp_GETMAXLABELLENGTH(void);
#define getMaxLabelLength        TRNSYSFUNCTIONS_mp_GETMAXLABELLENGTH  

– Source code

size_t maxlen = getMaxLabelLength();

Double Precision

– TRNSYS.h

extern “C” __declspec(dllimport) double _cdecl TRNSYSFUNCTIONS_mp_GETINPUTVALUE(int* n);
#define getInputValue                TRNSYSFUNCTIONS_mp_GETINPUTVALUE

– Source code

int no = 1;
double ret = getInputValue(&no);

Character

※文字列(Character型)を返す関数では、「引数」としてchar* と size_t(文字列の長さ)を第1、第2引数として指定する。
NOTE: For a function which returns ‘Character’, char* and size_t has to be needed as the first and second arguments in C/C++.

– TRNSYS.h

extern “C” __declspec(dllimport) int  _cdecl TRNSYSFUNCTIONS_mp_GETMAXPATHLENGTH(void);
extern “C” __declspec(dllimport) char*  _cdecl TRNSYSFUNCTIONS_mp_GETDECKFILENAME(char* dck, size_t len);

#define getMaxPathLength         TRNSYSFUNCTIONS_mp_GETMAXPATHLENGTH 
#define getDeckFileName           TRNSYSFUNCTIONS_mp_GETDECKFILENAME

– Source code

size_t maxlen = getMaxPathLength();
char *fname= new char[maxlen];
getDeckFileName(fname, maxlen);
std::string deckFileName = trim(std::string(fname,0,maxlen)); // trimming the string, just in case
delete[] fname; // Trimming the string
std::string trim(const std::string& str)
{
    size_t first = str.find_first_not_of(‘ ‘);
    if (std::string::npos == first)
    {
        return str;
    }
    size_t last = str.find_last_not_of(‘ ‘);
    return str.substr(first, (last – first + 1));
}

Pocket

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です