swig/Examples/tcl/variables/index.html
Dave Beazley 12999f703a New example
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@727 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2000-08-30 16:26:58 +00:00

88 lines
No EOL
2.8 KiB
HTML

<html>
<head>
<title>SWIG:Examples:tcl:variables</title>
</head>
<body bgcolor="#ffffff">
<tt>SWIG/Examples/tcl/variables/</tt>
<hr>
<H2>Wrapping C Global Variables</H2>
<tt>$Header$</tt><br>
<p>
When a C global variable appears in an interface file, SWIG tries to wrap it using a technique
known as "variable linking." The idea is pretty simple---we try to create a Tcl
variable that works exactly like you would expect in a Tcl script, but which magically
retrieves or updates the value of the underlying C variable.
Click <a href="example.i">here</a> to see a SWIG interface with some variable declarations in it.
<h2>Manipulating Variables from Tcl</h2>
Click <a href="example.tcl">here</a> to see a script that updates and prints out the values of
the variables defined in the above file. Notice how the C global variables work just
like normal Tcl variables.
<h2>Key points</h2>
<ul>
<li>The <tt>set</tt> statement changes the value of the corresponding C global variable.
<li>Whenever you access the value of a variable such as <tt>$ivar</tt>, the value
of the C global variable is read.
<li>If a C program changes a global variable independently of Tcl, this change is
automatically reflected in the Tcl variable (i.e., reads will always return the
most up to date value of the variable).
<li>When a global variable has the type "<tt>char *</tt>", SWIG manages it as a character
string. However, whenever the value of such a variable is set from Tcl, the old
value is destroyed using <tt>free()</tt> or <tt>delete</tt> (the choice of which depends
on whether or not SWIG was run with the -c++ option).
<li><tt>signed char</tt> and <tt>unsigned char</tt> are handled as small 8-bit integers.
<li>Array variables such as '<tt>char name[256]</tt>' are read-only variables because
SWIG doesn't really know how to change the "value" of an array. You can work
around this by writing some kind of helper function in the SWIG interface.
For example:
<blockquote>
<pre>
%inline %{
void set_name(char *newname) {
strncpy(name,newname,256);
}
%}
</pre>
</blockquote>
</ul>
<h2>Creating read-only variables</h2>
The <tt>%readonly</tt> and <tt>%readwrite</tt> directives can be used to
specify a collection of read-only variables. For example:
<blockquote>
<pre>
%readonly
int status;
double blah;
...
%readwrite
</pre>
</blockquote>
The <tt>%readonly</tt> directive remains in effect until it is explicitly disabled
using the <tt>%readwrite</tt> directive.
<h2>Comments</h2>
<ul>
<li>Management of global variables is one of the most problematic aspects
of C/C++ wrapping because the scripting interface and resulting memory management
is much trickier than simply creating a wrapper function.
<p>
<li>You may be better off hiding global variables behind a function based
interface.
</ul>
</body>
</html>
<hr>