In article <4ojdrs$5i8 at dragonfly.wolfram.com>,
JANAUDY Thierry <janaudy at eerie.fr> wrote:
>
> MLPutFunction(lp, "D", 2);
> MLPutString(lp, "Sin[x*x]") ; <-- I tried this ... but no result :-(
> MLPutSymbol(lp, "x");
> MLEndPacket(lp) ;
You are sending the expression D["Sin[x*x]", x]. If you type this in
a Mathematica session, you won't get a result either!
You need to send Sin[x*x] as an expression. You could do this with a
nested sequence of MLPutFunction and MLPutSymbol calls, but it's far
easier to do this:
MLPutFunction(lp, "ToExpression", 1);
MLPutString(lp, "Sin[x*x]");
Now you will be sending D[ToExpression["Sin[x*x]"], x]. As long as you're
doing this, might as well wrap the entire thing in ToExpression:
MLPutFunction(lp, "ToExpression", 1);
MLPutString(lp, "D[Sin[x*x], x]");
The only reason to send expressions to the kernel a bit at a time is if
your program is actually calculating those expressions as they are sent.
Even if the expression is very complicated and is constructed from other
pieces, it's still far easier to do something like this:
char buf[size1], expr[size2], sym[size3];
/* Calculate expr and sym */
...
/* send ToExpression[D[expr, sym]] to the kernel */
sprintf(buf, "D[%s, %s]", expr, sym);
MLPutFunction(lp, "ToExpression", 1);
MLPutString(lp, buf);
In fact, if you want the result to be a string as well, send the expression
this way:
MLPutFunction(lp, "ToString", 1);
MLPutFunction(lp, "ToExpression", 1);
MLPutString(lp, buf);
Now you are sending the expression ToString[ToExpression["D[expr, sym]"]],
so you'll get back a string.
Dave Wagner
Principia Consulting
(303) 786-8371
dbwagner at princon.com
http://www.princon.com/princon
==== [MESSAGE SEPARATOR] ====