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.
FORTRAN | C/C++ |
Integer | int* |
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.
FORTRAN | C/C++ |
Logical | int |
Integer | int |
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));
}