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
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 6.8, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Structures in Oct-Files (GNU Octave (version 7.3.0))</title>
<meta name="description" content="Structures in Oct-Files (GNU Octave (version 7.3.0))">
<meta name="keywords" content="Structures in Oct-Files (GNU Octave (version 7.3.0))">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Oct_002dFiles.html" rel="up" title="Oct-Files">
<link href="Sparse-Matrices-in-Oct_002dFiles.html" rel="next" title="Sparse Matrices in Oct-Files">
<link href="Cell-Arrays-in-Oct_002dFiles.html" rel="prev" title="Cell Arrays in Oct-Files">
<style type="text/css">
<!--
a.copiable-anchor {visibility: hidden; text-decoration: none; line-height: 0em}
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
div.display {margin-left: 3.2em}
div.example {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}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
span:hover a.copiable-anchor {visibility: visible}
ul.no-bullet {list-style: none}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">
</head>
<body lang="en">
<div class="subsection" id="Structures-in-Oct_002dFiles">
<div class="header">
<p>
Next: <a href="Sparse-Matrices-in-Oct_002dFiles.html" accesskey="n" rel="next">Sparse Matrices in Oct-Files</a>, Previous: <a href="Cell-Arrays-in-Oct_002dFiles.html" accesskey="p" rel="prev">Cell Arrays in Oct-Files</a>, Up: <a href="Oct_002dFiles.html" 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" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<span id="Structures-in-Oct_002dFiles-1"></span><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")
{
if (args.length () != 2)
print_usage ();
if (! args(0).isstruct ())
error ("structdemo: ARG1 must be a struct");
octave_scalar_map arg0 = args(0).scalar_map_value ();
//octave_map arg0 = args(0).map_value ();
if (! args(1).is_string ())
error ("structdemo: ARG2 must be a character string");
std::string arg1 = args(1).string_value ();
octave_value tmp = arg0.contents (arg1);
//octave_value tmp = arg0.contents (arg1)(0);
if (! tmp.is_defined ())
error ("structdemo: struct does not have a field named '%s'\n",
arg1.c_str ());
octave_scalar_map st;
st.assign ("selected", tmp);
return octave_value (st);
}
</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 the single struct example we would write
</p>
<div class="example">
<pre class="example">octave_value tmp = arg0.contents (arg1)(0);
</pre></div>
<p>where the trailing <code>(0)</code> is the <code>()</code> 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 <code>()</code> 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>
</div>
<hr>
<div class="header">
<p>
Next: <a href="Sparse-Matrices-in-Oct_002dFiles.html">Sparse Matrices in Oct-Files</a>, Previous: <a href="Cell-Arrays-in-Oct_002dFiles.html">Cell Arrays in Oct-Files</a>, Up: <a href="Oct_002dFiles.html">Oct-Files</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|