MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: MLPutRealList vs. sequence of MLPutDouble

  • To: mathgroup at smc.vnet.net
  • Subject: [mg61859] Re: Re: MLPutRealList vs. sequence of MLPutDouble
  • From: "Jens-Peer Kuska" <kuska at informatik.uni-leipzig.de>
  • Date: Wed, 2 Nov 2005 04:09:27 -0500 (EST)
  • Organization: Uni Leipzig
  • References: <djq618$jb5$1@smc.vnet.net> <200510270954.FAA20752@smc.vnet.net> <djskkf$8mu$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Hi,

first of all, it is nearly impossible to find out what goes wrong
when you don't write down the Mathamtica code that 
you are calling.  If you have setup your Mathematica function as

test[x1_,x2_]:=somethingUsefullWith[x1,x2]
test[{x1_,x2_}]:=somethingUsefullWith[x1,x2]

it will work in both cases
If you have only the definition

test[x1_,x2_]:=somethingUsefullWith[x1,x2]
and the C-code

MLPutFunction(link,"test",2);
  MLPutDouble(link,x1);
  MLPutDouble(link,x2);

will work and
double x[2];

MLPutFunction(link,"test",1);
  MLPutRealList(link,x,2L);

will not work because than you call test[{x1,x2}] 
and not
test[x1,x2]

If you have only the definion
test[{x1_,x2_}]:=somethingUsefullWith[x1,x2]

in Mathematica, than

double x[2];

MLPutFunction(link,"test",1);
  MLPutRealList(link,x,2L);

and

MLPutFunction(link,"test",2);
  MLPutDouble(link,x1);
  MLPutDouble(link,x2);

will not.

And clearly the Get[] command at the beginning of 
your
code generate a return value Null or several 
messages
and a $Failed and you must read it from the link.

Regards
  Jens

"Reese Jones" <rjones at sandia.gov> schrieb im 
Newsbeitrag news:djskkf$8mu$1 at smc.vnet.net...
| ...perhaps I don't understand but what you are 
saying
| is exactly what I  would expect:
|
| MLPutFunction(link, SCRIPT_NAME, 1);
| MLPutRealList(link,x,NUM_VARS);
|
| calls in Mathematica SCRIPT_NAME[{x0,x1}]
| (where NUM_VARS = 2, SCRIPT_NAME = "test" and 
test is
| test[y_List] := y[[2]]; )
|
| except I get :
| Error detected by MathLink: MLGet out of
| sequence.
|
| are you saying the function in Mathematica needs
| to know the length of the list a priori? that 
doesn't
| seem right
|
| Reese
|
|
|
|
| Jens-Peer Kuska wrote:
|
| >Hi,
| >
| >because
| >
| >MLPutFunction(link, SCRIPT_NAME, 1);
| >MLPutRealList(link,x,NUM_VARS);
| >
| >call in Mathematica SCRIPT_NAME[{x0,x1}]
| >
| >and
| >
| >MLPutFunction(link, SCRIPT_NAME, NUM_VARS);
| >for ( i=0; i<NUM_VARS; i++ ) { 
MLPutDouble(link,
| >x[i]); }
| >
| >call in Mathematica
| >
| >SCRIPT_NAME[x0,x1]
| >
| >Regards
| >  Jens
| >
| >"Reese Jones" <rjones at sandia.gov> schrieb im
| >Newsbeitrag news:djq618$jb5$1 at smc.vnet.net...
| >| Hi
| >|   I am a new subscriber to the list and I 
have a
| >seemingly
| >| simple (read: stupid) question: why does this
| >code work
| >| when I send a sequence of reals and not work
| >when I send
| >| a list?
| >|
| >| <SNIP>
| >|        /* Now initialize and call Mathematica 
*/
| >|        env = MLInitialize(NULL);
| >|        if (env == NULL) return 1;
| >|
| >|        link = MLOpen(num_strings, Mparams);
| >|        if (link == NULL) return 1;
| >|
| >|        MLActivate(link);
| >|
| >|        /* Load the compare function 
definition
| >into Mathematica */
| >|        MLPutFunction(link, "EnterTextPacket",
| >1);
| >|        MLPutString(link, "<<" SCRIPT_NAME 
".m");
| >|        MLEndPacket(link);
| >|
| >|        /* call the compare function with 
x[1],
| >x[2]*/
| >|        MLPutFunction(link, "EvaluatePacket", 
1);
| >| #if REAL_LIST
| >|        MLPutFunction(link, SCRIPT_NAME, 1);
| >|        MLPutRealList(link,x,NUM_VARS);
| >| #else
| >|        MLPutFunction(link, SCRIPT_NAME,
| >NUM_VARS);
| >|        for ( i=0; i<NUM_VARS; i++ ) {
| >MLPutDouble(link, x[i]); }
| >| #endif
| >|        MLEndPacket(link);
| >|
| >|        /* skip any packets before the first
| >ReturnPacket
| >|           and then get the result from the
| >calculation   */
| >|        int pkt;
| >|        while( (pkt = MLNextPacket(link), pkt) 
&&
| >pkt != RETURNPKT) {
| >|                MLNewPacket(link);
| >|                if (MLError(link)) {
| >|                        fprintf( stderr, "2 
Error
| >detected by MathLink:
| >| %s.\n",
| >| 
                       MLErrorMessage(link)); }
| >|        }
| >|
| >|        double fn_val=0.0;
| >|        MLGetDouble(link, &fn_val);
| >|        if (MLError(link)) {
| >|                fprintf( stderr, "3 Error
| >detected by MathLink: %s.\n",
| >|                MLErrorMessage(link)); }
| >|        MLClose(link);
| >|        MLDeinitialize(env);
| >| <SNIP>
| >|
| >| this is the Mathematica script that is called
| >(it takes a list and
| >| returns a single value) :
| >|
| >| (* test[x_Real,x2_Real] := x; *)
| >| test[y_List] := y[[2]];
| >|
| >|
| >| this is the output:
| >|
| >| Error detected by MathLink: MLGet out of
| >sequence.
| >| test : { 0.616000, 29.000000} -> f: 0.000000
| >|
| >|
| >| thanks
| >| Reese
| >|
| >| -- 
| >|
| 
 >:::::::::::::::::::::::::::::::::::::::::::::::::::::
| >| Reese Jones
| >| Sandia National Laboratories, MS 9042, P.O. 
Box
| >0969
| >| Livermore, CA 94551
| >|
| >| phone: (925) 294-4744 or (800) 4SANDIA 
x4-4744
| >| fax:   (925) 294-1459
| >| e-mail: rjones at sandia.gov
| >|
| 
 >:::::::::::::::::::::::::::::::::::::::::::::::::::::
| >|
| >|
| >
| >
| >
| >
| >
| >
|
|
| -- 
| 
:::::::::::::::::::::::::::::::::::::::::::::::::::::
| Reese Jones
| Sandia National Laboratories, MS 9042, P.O. Box 
0969
| Livermore, CA 94551
|
| phone: (925) 294-4744 or (800) 4SANDIA x4-4744
| fax:   (925) 294-1459
| e-mail: rjones at sandia.gov
| 
:::::::::::::::::::::::::::::::::::::::::::::::::::::
|
| 



  • Prev by Date: Re: Re: Exporting notebooks to xml (cnxml)
  • Next by Date: Re: Re: Re: Re: aggregation of related elements in a list
  • Previous by thread: Re: issues with integrating Boole
  • Next by thread: Re: Re: Re: Re: aggregation of related elements in a list