Translate

2017/05/24

Calling TRNSYS Functions from C/C++

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

1. 引数/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

 

コーディング例

1.1. 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;
}

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

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

 

2. 戻り値/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

 

コーデング例

2.1. 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++

2.2. Integer

- TRNSYS.h

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

- Source code

size_t maxlen = getMaxLabelLength();

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

2.4 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));
}

0 件のコメント:

コメントを投稿