|
[Date Index]
[Thread Index]
[Author Index]
Re: Mathlink: How do I pass arbitrary data from Mathematica to C?
- To: mathgroup at smc.vnet.net
- Subject: [mg86897] Re: Mathlink: How do I pass arbitrary data from Mathematica to C?
- From: Karen Bindash <KarenBindash at googlemail.com>
- Date: Wed, 26 Mar 2008 04:46:53 -0500 (EST)
- References: <fs4rmb$p3s$1@smc.vnet.net> <fs7ilu$gll$1@smc.vnet.net>
On 24 Mar, 06:45, Jens-Peer Kuska <ku... at informatik.uni-leipzig.de>
wrote:
> Hi,
>
> a) MathLink is a protocol, i.e., it *must* transmit data
Understood
> b) MathLink is always buffered, i.e., you will *never*
> get the true address of a pointer in the Mathematica kernel
Understood
> c) only the kernel developer know how a data structure is organized
> in the kernel, i.e., a array of integers *may* be a memory block
> of successive integers but it can be also an array of pointers
> to integers
OK, I can see I cant make such assumptions.
> d) for a general expression you have to build your own tree like
> structure of the Mathematica expression by setting the argument
> type to Manual
Do you have an example of this, where the format of the data is not
known in advance? It *must* be considered just a collection of bytes
of data. The data can be any length from one byte to about a MB. It
might be binary data, but will probably be text.
The data will be passed to some hardware. The format of the data
depends on the hardware. Hence I just want to pass what is a
collection of bytes. I cant assume they will be integers (they might
be), I cant assume they will be floating point values (they might
be).
>
> Regards
> Jens
>
> Karen Bindash wrote:
> > I am trying to write some code to interface Mathematica to a closed-
> > source library written in C. I'm using Mathlink for this, which is
> > typically used to interface Mathematica to external functions - see
> > for example
>
> >http://reference.wolfram.com/mathematica/tutorial/SettingUpExternalFu...
>
> > For example, if the library has a function 'f' with the following
> > prototype:
>
> > int f(int x, int y);
>
> > the following in a Mathlink template (.tm file) will allow me to call
> > this function from Mathematica by the name Foo, if I link to the
> > library., create an
> > executable, then install that executable in Mathematica with
> > Install[].
>
> > :Begin:
> > :Function: f
> > :Pattern: Foo[x_Integer, y_Integer]
> > :Arguments: {x, y}
> > :ArgumentTypes: {Integer, Integer}
> > :ReturnType: Integer
> > :End:
>
> > (There is no need for me to write the function "f", as that has been
> > done. I just need to link to the library containing the function f, in
> > much the same way you use the 'pow' function in C without writing it -
> > you would just link to the maths library.).
>
> > I have no problem with the above - it all works as expected.
>
> > The problem occurs with a function 'g', which instead of having only
> > integer arguments, takes a pointer to some data. The format of the
> > data is not specified - the C function just needs to know where in
> > memory the data is, and how many bytes there are. The C prototype is
>
> > int g(const void *data, long nbytes);
>
> > Does anyone know how I can write a Mathematica template so when I link
> > with the function 'g', I can pass the data properly? Note, that since
> > the library is closed-source, I am not able to change the calling
> > method in any way. But I expect it should be possible to write an
> > interface in C, such that data is passed from Mathematica in a form
> > compatible with Mathematica, and then converts it to a from the C
> > library accepts. But I am stuck as how to do this.
>
> > If its not possible to do this with a template, can it be done by
> > writing it all in C? If so, how?
>
> > I don't want Mathematica to try to interpret the data in any way -
> > just to pass an address of where the data is in memory, and also the
> > number of bytes of data. Than the library function g will return an
> > integer, which I want to pass back to Mathematica.
>
> > Someone suggested that I might look at the C code generated by mcc to
> > work out how to do this, (perhaps making use of MLPutInteger), but I
> > can't work out how to do this.
>
> > Does that make sense? Any ideas how to pass arbitrary data to a C
> > program?
>
> > I have a similar issue in trying to get arbitrary data from C to
> > Mathematica, but that is another story.
Prev by Date:
Re: Saving Packages
Next by Date:
Re: Mathlink: How do I pass arbitrary data from Mathematica to C?
Previous by thread:
Re: Mathlink: How do I pass arbitrary data from Mathematica to C?
Next by thread:
Re: Mathlink: How do I pass arbitrary data from Mathematica to C?
|