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
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Octave: Structures in Oct-Files</title>
<meta name="description" content="GNU Octave: Structures in Oct-Files">
<meta name="keywords" content="GNU Octave: Structures in Oct-Files">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Oct_002dFiles.html#Oct_002dFiles" rel="up" title="Oct-Files">
<link href="Sparse-Matrices-in-Oct_002dFiles.html#Sparse-Matrices-in-Oct_002dFiles" rel="next" title="Sparse Matrices in Oct-Files">
<link href="Cell-Arrays-in-Oct_002dFiles.html#Cell-Arrays-in-Oct_002dFiles" rel="prev" title="Cell Arrays in Oct-Files">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Structures-in-Oct_002dFiles"></a>
<div class="header">
<p>
Next: <a href="Sparse-Matrices-in-Oct_002dFiles.html#Sparse-Matrices-in-Oct_002dFiles" accesskey="n" rel="next">Sparse Matrices in Oct-Files</a>, Previous: <a href="Cell-Arrays-in-Oct_002dFiles.html#Cell-Arrays-in-Oct_002dFiles" accesskey="p" rel="prev">Cell Arrays in Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Structures-in-Oct_002dFiles-1"></a>
<h4 class="subsection">A.1.5 Structures in Oct-Files</h4>
<p>A structure in Octave is a map between a number of fields represented and
their values. The Standard Template Library <code>map</code> class is used,
with the pair consisting of a <code>std::string</code> and an Octave
<code>Cell</code> variable.
</p>
<p>A simple example demonstrating the use of structures within oct-files is
</p>
<div class="example">
<pre class="verbatim">#include <octave/oct.h>
#include <octave/ov-struct.h>
DEFUN_DLD (structdemo, args, , "Struct Demo")
{
octave_value retval;
int nargin = args.length ();
if (args.length () == 2)
{
octave_scalar_map arg0 = args(0).scalar_map_value ();
//octave_map arg0 = args(0).map_value ();
if (! error_state)
{
std::string arg1 = args(1).string_value ();
if (! error_state)
{
octave_value tmp = arg0.contents (arg1);
//octave_value tmp = arg0.contents (arg1)(0);
if (tmp.is_defined ())
{
octave_scalar_map st;
st.assign ("selected", tmp);
retval = octave_value (st);
}
else
error ("structdemo: struct does not have a field named '%s'\n",
arg1.c_str ());
}
else
error ("structdemo: ARG2 must be a character string");
}
else
error ("structdemo: ARG1 must be a struct");
}
else
print_usage ();
return retval;
}
</pre><pre class="example">
</pre></div>
<p>An example of its use is
</p>
<div class="example">
<pre class="example">x.a = 1; x.b = "test"; x.c = [1, 2];
structdemo (x, "b")
⇒ selected = test
</pre></div>
<p>The example above specifically uses the <code>octave_scalar_map</code> class which
is for representing a single struct. For structure arrays the
<code>octave_map</code> class is used instead. The commented code shows how the
demo could be modified to handle a structure array. In that case the
<code>contents</code> method returns a <code>Cell</code> which may have more than one
element. Therefore, to obtain the underlying <code>octave_value</code> in
this single-struct example we write
</p>
<div class="example">
<pre class="example">octave_value tmp = arg0.contents (arg1)(0);
</pre></div>
<p>where the trailing (0) is the () operator on the <code>Cell</code> object. If
this were a true structure array with multiple elements we could iterate
over the elements using the () operator.
</p>
<p>Structures are a relatively complex data container and there are more
functions available in <samp>oct-map.h</samp> which make coding with them easier
than relying on just <code>contents</code>.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Sparse-Matrices-in-Oct_002dFiles.html#Sparse-Matrices-in-Oct_002dFiles" accesskey="n" rel="next">Sparse Matrices in Oct-Files</a>, Previous: <a href="Cell-Arrays-in-Oct_002dFiles.html#Cell-Arrays-in-Oct_002dFiles" accesskey="p" rel="prev">Cell Arrays in Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|