[TRNSYS-users] C++ API not working

Yuichi Yasuda via TRNSYS-users trnsys-users at lists.onebuilding.org
Sat Apr 15 00:00:54 PDT 2017


FYI

Finally I found a way to call the getDeckFileName() function  from C/C++ 
directly.
See example below.

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

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

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;

cheers,

Yuichi

On 2016/05/26 14:17, Yuichi Yasuda via TRNSYS-users wrote:
> Michael,
>
> I assume you are using TRNSYS16 coding style in your component. I'm 
> not sure that the getMaxLabelLength() function works with the coding 
> style.However, the function works fine in my TRNSYS'17' coding style 
> component.
>
> The getDeckFileName() seems to me that the function does not care 
> about C/C++ strings. I have got exactly same error.
> Unless, you modified the function to cope with C/C++ style, I think 
> that you can not avoid the access violation error.
> For example, I have added the following new function in the 
> TrnsysFunction.f90 to avoid the error.
>
> -TrnsysFunction.f90
>
> Function getDeckFileNameEx() bind(c,name="getDeckFileNameEx")
>  !dec$ attributes dllexport :: getDeckFileNameEx
>  Use TrnsysData
>  Use, intrinsic :: iso_c_binding
>  type(C_ptr) :: getDeckFileNameEx
>  Character(len=maxPathLength) ret
>  ret = trim(deckn1)//CHAR(0)
>  getDeckFileNameEx = C_LOC(ret)
> End Function getDeckFileNameEx
>
> - C/C++ Component sourcecode
> extern "C" __declspec(dllimport) char*    _cdecl getDeckFileNameEx(void);
>
>       char *dckfilename;
>       dckfilename = getDeckFileNameEx();
>
> I do not like this idea because an expensive Fortran compiler is 
> needed to build.
> Does anyone know that how to call FORTRAN function returns characters?
>
> Best regards,
>
> Yuichi Yasuda
> quattro corporate design co.,ltd
> T2000 Bld. 4F, 1-11-29 Mita, Meguro-ku, Tokyo, 153-0062, Japan
> Tel:+81 (0)3 5768 6744 Fax:+81 (0)3 5768 6745
> Email: yasuda at qcd.co.jp
> http://www.qcd.co.jp/
>
>
>
>
>
>
> On 2016/05/21 0:22, Michael Holzhauser via TRNSYS-users wrote:
>> Hello all,
>>
>> I managed to build a customized TRNSYS Type in C++ by extending the 
>> Type202 example that is delivered with TRNSYS 17. I can access the 
>> input values and return the corresponding output values without any 
>> problems. However, the communication with the TRNSYS Core functions 
>> somehow don’t work. Whenever I invoke some function that returns an 
>> integer value (like getMaxLabelLength()), the result is NaN. Whenever 
>> I try to invoke some function that returns characters (like 
>> getDeckFileName()), TRNSYS crashes with something like „Access 
>> violation at address XXXXX in module ‚TRNDLL.DLL‘. Write of address 
>> XXXXX.“ or with „forttrl: severe (408): fort: (18): Dummy character 
>> variable ‚GETLABEL at 0‘ has length 300 which is greater than actual 
>> variable length 1“ (in case of getLabel).
>>
>> As I read in other topics like this one, there seemed to be several 
>> issues in the TRNSYS.h header file and the library files long ago:
>> https://www.mail-archive.com/trnsys-users@engr.wisc.edu/msg00005.html
>>
>> However, 11 years later, is there a workaround for this problem?
>>
>> Thanks in advance.
>>
>> --
>>
>> M.Sc. Michael Holzhauser
>> AG Optimization
>> University of Kaiserslautern
>>
>> Paul-Ehrlich-Str. 14 - 451
>> 67663 Kaiserslautern, Germany
>>
>> Phone: +49 (631) 205-2511
>> E-mail: holzhauser at mathematik.uni-kl.de 
>> <mailto:holzhauser at mathematik.uni-kl.de>
>>
>> www.mathematik.uni-kl.de/~holzhauser 
>> <http://www.mathematik.uni-kl.de/%7Eholzhauser>
>>
>>
>>
>> _______________________________________________
>> TRNSYS-users mailing list
>> TRNSYS-users at lists.onebuilding.org
>> http://lists.onebuilding.org/listinfo.cgi/trnsys-users-onebuilding.org
>
>
>
>
> _______________________________________________
> TRNSYS-users mailing list
> TRNSYS-users at lists.onebuilding.org
> http://lists.onebuilding.org/listinfo.cgi/trnsys-users-onebuilding.org


-- 

株式会社クアトロ
http://qcd.co.jp/
安田 雄市
TEL 03-5768-6744
FAX 03-5768-6745
e-mail: yasuda at qcd.co.jp

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/attachments/20170415/cb5354d0/attachment-0002.htm>


More information about the TRNSYS-users mailing list