Re: MathLink & strings
- To: mathgroup at smc.vnet.net
- Subject: [mg21182] Re: MathLink & strings
- From: Dave Richardson <dhr at glue.umd.edu>
- Date: Fri, 17 Dec 1999 01:23:32 -0500 (EST)
- Organization: University of Maryland
- References: <831vhq$g7c@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Roger,
What follows is the response I got from P.J. Hinton at Wolfram, when I had a
similar problem.
What turned out to be the problem for me is this:
Let me know if it answers your question.
If not, I can send you some bits of my actual code...
Good luck,
Dave!
On 1 Dec 1999, Dave Richardson wrote:
> I am working with MathLink, and I have a question.
>
> Is String a valid type?
>
> Here is a basic program I am trying to write to read a string (from
> Mathematica) and make a decision based upon it. Then I want to return a
> double based upon this...
>
> Below is: string.cpp ********************************************
>
> #include "mathlink.h"
> #include <string.h>
>
> int main(int argc, char *argv[]){
> return MLMain(argc,argv);
> }
>
> double whichx(char* sRefrigerant){
> double rx;
> if (strcoll(sRefrigerant, "R134a" ) == 0) rx = 12.;
> else rx = 9;
> return rx;
> }
>
> end string.cpp **************************************************
>
> Here is the Template File string.tm *******************************
>
> :Evaluate: BeginPackage[ "StringTest`"]
> :Evaluate: WrapProps::usage = "whx("R134a"), returns 12 if the entered
> string is R-134a, 9 if not."
>
>
> :Evaluate: whx::usage = "a number"
> :Begin:
> :Function: whichx
> :Pattern: whx[sRefrigerant]
> :Arguments: {sRefrigerant}
> :ArgumentTypes: {String}
> :ReturnType: Real
> :End:
>
>
> :Evaluate: EndPackage[]
>
> ::This is a comment line.
>
> end string.cpp **************************************************
>
>
> According to the Mathematica book, String is a valid argument type in
> Mathematica (Thus the template file), and its equivalent in c (c++) is
> the char*.
>
> For some reason, I am not getting a good link, and thus a crash and
> burn...
>
> If I change the type to double (In the c++ code and .tm template), I get
> a compile/link/run just fine.
>
> Can anyone point to the flaw in my logic here, and direct me around the
> problem?
There are a couple of things that I can think of here.
1) Add "const" to the declaration of sRefrigerant.
2) Change the pattern for whx[] in the template so that the argument is
real pattern.
:Pattern: whx[sRefrigerant] -> :Pattern: whx[sRefrigerant_String]
3) Just for good measure, throw in a prototype for whichx().
4) Escape out the literal quotes in the usage message in the template.
--
P.J. Hinton
Mathematica Programming Group paulh at wolfram.com
Wolfram Research, Inc.
[begin string.cpp]
#include "mathlink.h"
#include <string.h>
double whichx(const char* sRefrigerant);
int main(int argc, char *argv[]){
return MLMain(argc,argv);
}
double whichx(const char* sRefrigerant){
double rx;
if (strcoll(sRefrigerant, "R134a" ) == 0) rx = 12.;
else rx = 9;
return rx;
}
[end string.cpp]
[begin string.tm]
:Evaluate: BeginPackage[ "StringTest`"]
:Evaluate: WrapProps::usage = "whx(\"R134a\"), returns 12 if the entered
string is R-134a, 9 if not."
:Evaluate: whx::usage = "a number"
:Begin:
:Function: whichx
:Pattern: whx[sRefrigerant_String]
:Arguments: {sRefrigerant}
:ArgumentTypes: {String}
:ReturnType: Real
:End:
[end string.tm]
This source code compiled and ran successfully with egcs-2.91.66 under
Linux.
In[1]:= Install["string"]
Out[1]= LinkObject['./string', 1, 1]
In[2]:= LinkPatterns[%]
Out[2]= {whx[sRefrigerant_String]}
In[3]:= whx["R134a"]
Out[3]= 12.
Roger Mason wrote:
> Hi,
>
> I am trying to send strings from Mathematica to C via MathLink. I have
> been trying now for two days to accomplish this seemingly simple task.
> Much of the problem stems from the absolutely hopeless documentation for
> MathLink functions. If Mathematica were free, one might sigh and accept
> the kindness of others in making code available. However, Mathematica is
> (very decidedly) not free. Is WRI going to turn into another monster
> like Micro$oft?
>
> So much for venting spleen.
>
> Does anyone have any examples of C code that implements string transfer
> between Mathematica and C, in both directions? If you do, please make
> clear what the types of the variables must be (this is an area where I
> came to grief by assuming that the documentation is accurate!).
>
> Many thanks in advance.
>
> Roger Mason
--
Dave Richardson
University of Maryland
Department of Mechanical Engineering
Center for Environmental Energy Engineering
(301) 405-8726
dhr at glue.umd.edu