Skip to main content
1-Visitor
November 19, 2013
Solved

Prime 3.0 Custom Functions (string arguments)

  • November 19, 2013
  • 6 replies
  • 3919 views

I have a user function for Mathcad 15 that works great (in Mathcad 15). I'm attempting to build that .dll for Mathcad Prime 3.0. After compiling the code (linking the mcaduser.lib that is distributed with Mathcad Prime 3.0), all the custom functions defined in my .dll work fine in Mathcad Prime 3.0, except those which return a string type value. Any function which returns a string will crash Mathcad Prime 3.0 when the function is called. Even the most simple test cases, such as the following function:

LRESULT testFunction(LPMCSTRING ParamValue, LPCMCSTRING ParamName)

{

ParamValue->str = "foo";

return 0;

}

will crash Prime 3.0 when invoked in a worksheet.

Anyone else experience this issue? Thanks for the feedback!

Scott

Best answer by LucMeekes

Hi Scott,

I hope the failure is not due to missing a call to MathcadAllocate, to obtain storage for the string...

{Don't know if allocation for storage of strings and arrays is required in Prime as it is in Mathcad.}

Success!
Luc

6 replies

spolak1-VisitorAuthor
1-Visitor
November 22, 2013

By the way, the custom/user function I'm trying to build is a wrapper for CoolProp, which is an open-source library of thermophysical fluid properties, including humid air (water/steam). The user function I compiled for Mathcad 15 wraps the CoolProp library quite well. I've only implemented a few of the top level functions, but enough to sufficiently extract all properties for all the fluids in the CoolProp library. CoolProp is open-source, and so is the Mathcad wrapper for it. Here's a link to the Mathcad wrapper:

http://sourceforge.net/projects/coolprop/files/CoolProp/4.0.0beta/MathCAD/

Now I just need to figure out these "nuances" of Prime 3.0 that are preventing me from building the CoolProp wrapper...

Scott

1-Visitor
November 23, 2013

R&D has been informed of this issue. Thank you for bringing it to our attention!

LucMeekes23-Emerald IVAnswer
23-Emerald IV
November 24, 2013

Hi Scott,

I hope the failure is not due to missing a call to MathcadAllocate, to obtain storage for the string...

{Don't know if allocation for storage of strings and arrays is required in Prime as it is in Mathcad.}

Success!
Luc

1-Visitor
November 25, 2013

Luc

You are correct, nice catch . Our QA/Engineering team suggests replacing the call to "new"

char

* c = MathcadAllocate(s.size()+1);

// creat a c-string (pointer) c with the same size as s

In your

GetCoolPropsParamMathcad

Function

This will protect your code across DLL boundaries.

John

1-Visitor
December 6, 2013

Hi guys,

just to develop a little more this subject, this is what works for me:

// -----------------------------------------------

// File: test_string_return.cpp

// test for a function that returns a string

#include "stdafx.h"

#include "mcadincl.h"

#include <string>

using namespace std;

LRESULT test_string_return_Function( LPMCSTRING ParamValue, LPCMCSTRING ParamName );

LRESULT test_string_return_Function( LPMCSTRING ParamValue, LPCMCSTRING ParamName )

{

// see: http://stackoverflow.com/questions/347949/convert-stdstring-to-const-char-or-char

string str_val = "foox";

char *cstr_val = MathcadAllocate(str_val.size() + 1);

std::copy(str_val.begin(), str_val.end(), cstr_val);

cstr_val[str_val.size()] = '\0';

ParamValue->str = cstr_val;

// normal return

return 0;

}

// fill out a FUNCTIONINFO structure with

// the information needed for registering the

// function with Mathcad

FUNCTIONINFO test_string_return =

{

// Name by which mathcad will recognize the function

"test_string_return",

// description of "test_string_return_Function" parameters to be used

// by the Insert Function dialog box

"string-value",

// description of the function for the Insert Function dialog box

"test: pass a string and receive a string as output",

// pointer to the executible code

(LPCFUNCTION)test_string_return_Function,

// type of returned object

STRING,

// number of input parameters (not including the returned object)

// test_string_return_Function( value )

1,

// types of input parameters

{STRING}

};

// -----------------------------------------------

This is needed, for example, when one wants to read the attribute of a dataset in an HDF file. In that case the string, which is the attribute value, has to be returned to Mathcad.

Agostino