Re: Differential equations error with MathLink/JLink
- To: mathgroup at smc.vnet.net
- Subject: [mg28053] Re: Differential equations error with MathLink/JLink
- From: Ralph Gauges <ralph.gauges at eml.villa-bosch.de>
- Date: Thu, 29 Mar 2001 03:24:18 -0500 (EST)
- References: <98vh54$8sr@smc.vnet.net> <99chhr$8bi@smc.vnet.net> <99hcmk$eb8@smc.vnet.net> <%nEv6.8240$uR4.70938@ralph.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Todd Gayley wrote: > Ralph, > > You cannot necessarily use MLGetFunction() to read what's on the link just because > MLGetNext() returned MLTKFUNC. MLGetFunction() only works for functions with symbols as > their head. You can write a function that does not have a symbol as its head, and a > classic case is > > Derivative[1][x][t] > > which is, coincidentally, exactly the return value of your computation. This expression is > a function of one argument (t), with Derivative[1][x] as its head. (Note that this head is > itself a function with a function, not a symbol, as _its_ head.) > > If you want to be able to read arbitrary expressions off a link, your handling of MLTKFUNC > has to look like this: > > if (MLGetNext(link) == MLTKFUNC) { > long argCount; > MLGetArgCount(link, &argCount); > // Read the head, first by checking MLGetNext() and then the correct get call > for (int i = 0; i < argCount; i++) { > // Read the args > } > } > > Take a look at the read_and_print_expression() function in the MathLink example program > factor2.c to see general-purpose expression-reading code. > > This complexity is one reason why the Expr class in J/Link is so useful. Yes, it really is, I like JLink, but I don't want to switch to Java right now. Thank you very much for the hint. I will try to change the function reading method to something that resembles this general purpose expression reading code in factor2.c, Will there be a function for reading expressions in upcoming MathLink Versions, or even an Expression class? > > > One more thing. MLGetNext() is a destructive call--it advances the link position. You got > MLTKFUNC twice in your example because the expression is a function, and its head also > happens to be a function. In other words, the second time you called MLGetNext(), you were > reading a new part of the result, not just reaffirming the first call. > I had feared that this might be the case, but since it was not the cause for the original error, I did not investigate further. Shame on me, I actually did read the manual, but at least the part in the mathematica book is kept rather short considering dummies like myself. )-: For example it doesn't state anywhere that you can only use MLGetFunction when the head of the function is a symbol! From the manual I assumed that when GetNext tells you that the next thing will be a MLTKFUNC, you use MLGetFunction. Sorry for having bothered you. Is there an more indepth API Documentation somewhere on the net, something like the API for java would be nice? Bye Ralph