1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!--Converted with LaTeX2HTML 2002-2-1 (1.70)
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Mapping for classes, interfaces, arrays and r-arrays</TITLE>
<META NAME="description" CONTENT="Mapping for classes, interfaces, arrays and r-arrays">
<META NAME="keywords" CONTENT="users_guide">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="LaTeX2HTML v2002-2-1">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<LINK REL="STYLESHEET" HREF="users_guide.css">
<LINK REL="next" HREF="node115.html">
<LINK REL="previous" HREF="node113.html">
<LINK REL="up" HREF="node110.html">
<LINK REL="next" HREF="node115.html">
</HEAD>
<BODY >
<DIV CLASS="navigation"><!--Navigation Panel-->
<A NAME="tex2html2421"
HREF="node115.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html2415"
HREF="node110.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html2409"
HREF="node113.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html2417"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html2419"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html2422"
HREF="node115.html">Calling SIDL methods from</A>
<B> Up:</B> <A NAME="tex2html2416"
HREF="node110.html">C Bindings</A>
<B> Previous:</B> <A NAME="tex2html2410"
HREF="node113.html">Header files</A>
<B> <A NAME="tex2html2418"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html2420"
HREF="node317.html">Index</A></B>
<BR>
<BR></DIV>
<!--End of Navigation Panel-->
<H1><A NAME="SECTION03140000000000000000"></A>
<A NAME="s:C_arrays"></A><A NAME="5668"></A><A NAME="5669"></A><A NAME="5670"></A>
<BR>
Mapping for classes, interfaces, arrays and r-arrays
</H1>
Because C doesn't have built in mechanisms for protecting the global
namespace, the C mapping attempts to avoid namespace collisions by
using struct and method names that incorporate all the naming
information from the package, class and method names. For a type <TT>Z</TT> in
package <TT>X.Y</TT>, the name of the type that C clients use for an
object reference is <TT>X_Y_Z</TT>. <TT>X_Y_Z</TT> is defined as
follows in the <TT>X_Y_Z.h</TT> header file:
<P>
<BR>
<PRE CLASS="verbatim">struct X_Y_Z__object;
struct X_Y_Z__array;
typedef struct X_Y_Z__object* X_Y_Z;
</PRE></td></tr></table></blockquote>
<P>
This code fragment also shows that <TT>struct X_Y_Z__array</TT> is
used for a multi-dimensional array of <TT>X.Y.Z</TT> objects. Here are
some additional concrete examples of the object and interface
reference types derived by the C mapping:
<P>
<BR>
<PRE CLASS="verbatim">/**
* Symbol "sidl.BaseClass" (version 0.5.1)
*
* Every class implicitly inherits from <code>BaseClass</code>. This
* class implements the methods in <code>BaseInterface</code>.
*/
struct sidl_BaseClass__object;
struct sidl_BaseClass__array;
typedef struct sidl_BaseClass__object* sidl_BaseClass;
/**
* Symbol "sidl.BaseInterface" (version 0.5.1)
*
* Every interface in <code>SIDL</code> implicitly inherits
* from <code>BaseInterface</code>, and it is implemented
* by <code>BaseClass</code> below.
*/
struct sidl_BaseInterface__object;
struct sidl_BaseInterface__array;
typedef struct sidl_BaseInterface__object* sidl_BaseInterface;
</PRE></td></tr></table></blockquote>
<P>
Here is an example of the C client-side binding for an r-array. This
example is for the <TT>solve</TT> example from
Section <A HREF="node60.html#ss:r-arrays">5.4</A>. Here, I assume that the package name is
<TT>num</TT>, and the class name is <TT>Linsol</TT>. The data for each
array is passed as a <TT>double</TT> pointer, and the index parameters
are normal <TT>in</TT> ints.
<P>
<BR>
<PRE CLASS="verbatim">/** C client-side API for solve method */
void num_Linsol_solve(/*in*/ num_Linsol self,
/*in*/ double* A,
/*inout*/ double* x,
/*in*/ double* b,
/*in*/ int32_t m,
/*in*/ int32_t n);
</PRE></td></tr></table></blockquote>
<P>
The one catch for C programmers is that
<TT>A</TT> is in column-major order -- not the typical row-major
ordering used in C. To access the element in row <TT>i</TT> and column
<TT>j</TT>, you can use the
<TT>RarrayElem2(A,i,j,m)</TT>. <TT>RarrayElem2</TT> is a convenience macro
for C and C++ programmers to access r-arrays in column-major order. To
access memory by stride one make <TT>i</TT> your inner loop.
<P>
Passing <TT>NULL</TT> for <TT>A</TT>, <TT>x</TT>, or <TT>b</TT> is not
allowed. You must always pass a valid pointer.
<P>
<DIV CLASS="navigation"><HR>
<!--Navigation Panel-->
<A NAME="tex2html2421"
HREF="node115.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html2415"
HREF="node110.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html2409"
HREF="node113.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html2417"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html2419"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html2422"
HREF="node115.html">Calling SIDL methods from</A>
<B> Up:</B> <A NAME="tex2html2416"
HREF="node110.html">C Bindings</A>
<B> Previous:</B> <A NAME="tex2html2410"
HREF="node113.html">Header files</A>
<B> <A NAME="tex2html2418"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html2420"
HREF="node317.html">Index</A></B> </DIV>
<!--End of Navigation Panel-->
<ADDRESS>
<br><br>babel-0.10.2<br>users_guide Last Modified 2005-03-23<br><br><a href="http://www.llnl.gov/CASC/components">http://www.llnl.gov/CASC/components</a><br><a href="mailto:components@llnl.gov">components@llnl.gov</a>
</ADDRESS>
</BODY>
</HTML>
|