<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki-ext.aps.anl.gov/epics/index.php?action=history&amp;feed=atom&amp;title=V4_Data_Interface</id>
	<title>V4 Data Interface - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-ext.aps.anl.gov/epics/index.php?action=history&amp;feed=atom&amp;title=V4_Data_Interface"/>
	<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;action=history"/>
	<updated>2026-06-12T01:36:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=2759&amp;oldid=prev</id>
		<title>KayKasemir: DA code example</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=2759&amp;oldid=prev"/>
		<updated>2005-09-02T20:21:08Z</updated>

		<summary type="html">&lt;p&gt;DA code example&lt;/p&gt;
&lt;a href=&quot;https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;amp;diff=2759&amp;amp;oldid=503&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>KayKasemir</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=503&amp;oldid=prev</id>
		<title>KayKasemir: Class Layout Image</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=503&amp;oldid=prev"/>
		<updated>2005-08-09T13:05:08Z</updated>

		<summary type="html">&lt;p&gt;Class Layout Image&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:05, 9 August 2005&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot;&gt;Line 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Would it work, but performance would be unacceptable?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Would it work, but performance would be unacceptable?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Image:V4DataInter.jpg]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Data Interface Classes ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Data Interface Classes ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>KayKasemir</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=453&amp;oldid=prev</id>
		<title>KayKasemir: added structure handling to example</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=453&amp;oldid=prev"/>
		<updated>2005-08-04T20:21:13Z</updated>

		<summary type="html">&lt;p&gt;added structure handling to example&lt;/p&gt;
&lt;a href=&quot;https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;amp;diff=453&amp;amp;oldid=452&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>KayKasemir</name></author>
	</entry>
	<entry>
		<id>https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=452&amp;oldid=prev</id>
		<title>KayKasemir at 22:23, 27 July 2005</title>
		<link rel="alternate" type="text/html" href="https://wiki-ext.aps.anl.gov/epics/index.php?title=V4_Data_Interface&amp;diff=452&amp;oldid=prev"/>
		<updated>2005-07-27T22:23:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Issue ==&lt;br /&gt;
I think the following data interface is easier to understand&lt;br /&gt;
than the data access approach.&lt;br /&gt;
&lt;br /&gt;
Am I wrong, because Data Access is really much easier?&lt;br /&gt;
&lt;br /&gt;
Am I right, but the approach shown here will never work?&lt;br /&gt;
&lt;br /&gt;
Would it work, but performance would be unacceptable?&lt;br /&gt;
&lt;br /&gt;
=== Data Interface Classes ===&lt;br /&gt;
 &lt;br /&gt;
 // Description of basic data character&lt;br /&gt;
 enum EpicsDataCharacter&lt;br /&gt;
 {&lt;br /&gt;
     Octet,     // Raw bits,known to a server/client pair, but no one else&lt;br /&gt;
     Bool,&lt;br /&gt;
     Integer,   // Discrete&lt;br /&gt;
     Real,      // Floating-point&lt;br /&gt;
     String,    // UTF-8&lt;br /&gt;
     Enum,      // &amp;gt;=0 Integer with state names&lt;br /&gt;
     Struct,&lt;br /&gt;
     TimeStamp  // For efficiency?&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // Full description of the data&lt;br /&gt;
 class EpicsDataDescriptor&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
     virtual EpicsDataCharacter getType() = 0;&lt;br /&gt;
     virtual int  getNumDims() = 0;      // Scalar, vector: 1, matrix: &amp;gt;1&lt;br /&gt;
     virtual int  getSize(int dim) = 0;  // Scalar: 1&lt;br /&gt;
     virtual int  getBitsize() = 0;      // bits of integer or real&lt;br /&gt;
     virtual bool isSigned() = 0;        // Integer might be unsigned&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // Access to the data. Two options:&lt;br /&gt;
 // 1) Via basic types of the language, contents will differ for Java, C++.&lt;br /&gt;
 //    (shown here)&lt;br /&gt;
 // 2) Locked types:&lt;br /&gt;
 //    C++ will probably define the full set&lt;br /&gt;
 //      int_8_t, int16_t, ...&lt;br /&gt;
 //    and Java can only handle a sub-set.&lt;br /&gt;
 class EpicsDataReader : public EpicsDataDescriptor&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
     // Get data as type XX as best as possible.&lt;br /&gt;
     // Example: getDouble returns true for Bool (d=0.0, 1.0), Integer, Real, Enum.&lt;br /&gt;
     virtual bool getDouble(double &amp;amp;d) = 0;&lt;br /&gt;
     virtual bool getArrayDouble(int element, double &amp;amp;d) = 0;&lt;br /&gt;
     virtual bool getMatrixDouble(int dim, int element, double &amp;amp;d) = 0;&lt;br /&gt;
     virtual bool getInt(int &amp;amp;d) = 0;&lt;br /&gt;
     virtual bool getString(char *buf, int buf_len) = 0;&lt;br /&gt;
     virtual bool getCstring(const char *&amp;amp;c_ptr) = 0;&lt;br /&gt;
     /// many more, at least one for each supported type.&lt;br /&gt;
     /// For arrays, it could include per-element access&lt;br /&gt;
     /// as well as accessors that copy pieces into client buffers.&lt;br /&gt;
 };      &lt;br /&gt;
 &lt;br /&gt;
 // &amp;quot;Property&amp;quot; has a name and data reader interface&lt;br /&gt;
 class EpicsProperty : public EpicsDataReader&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
     virtual const char *getName() = 0;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // A catalog of properties&lt;br /&gt;
 class EpicsPropertyCatalog&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
     virtual int getNumProperties() = 0;&lt;br /&gt;
     virtual EpicsProperty *findProperty(const char *name) = 0;&lt;br /&gt;
     virtual EpicsProperty *getProperty(int index) = 0;&lt;br /&gt;
     /// Could also support name &amp;lt;-&amp;gt; ID conversions and&lt;br /&gt;
     /// access via numeric ID.&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
=== C++ Implementation ===&lt;br /&gt;
 // On the first read, skip to the 'Usage Example' below.&lt;br /&gt;
 // This code isn't the greatest, it simply here to get&lt;br /&gt;
 // example code that actually compiles &amp;amp; runs.&lt;br /&gt;
 #include &amp;lt;string&amp;gt;&lt;br /&gt;
 using std::string;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 class EpicsPropertyBase : public EpicsProperty&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
     EpicsPropertyBase(const char *name)&lt;br /&gt;
     {   this-&amp;gt;name = name; }&lt;br /&gt;
     // DataReader&lt;br /&gt;
     bool getDouble(double &amp;amp;d)&lt;br /&gt;
     {&lt;br /&gt;
         int i;&lt;br /&gt;
         if (getInt(i))&lt;br /&gt;
         {&lt;br /&gt;
             d = i;&lt;br /&gt;
             return true;&lt;br /&gt;
         }&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     bool getArrayDouble(int element, double &amp;amp;d)&lt;br /&gt;
     {   return (element == 0) ? getDouble(d) : false; }&lt;br /&gt;
     bool getMatrixDouble(int dim, int element, double &amp;amp;d)&lt;br /&gt;
     {   return (dim == 0) ? getArrayDouble(element, d) : false; }&lt;br /&gt;
     bool getInt(int &amp;amp;i)&lt;br /&gt;
     {&lt;br /&gt;
         double d;&lt;br /&gt;
         if (getDouble(d))&lt;br /&gt;
         {&lt;br /&gt;
             i = (int)d;&lt;br /&gt;
             return true;&lt;br /&gt;
         }&lt;br /&gt;
         return false;&lt;br /&gt;
     }    &lt;br /&gt;
     bool getString(char *buf, int buf_len)&lt;br /&gt;
     {&lt;br /&gt;
         const char *ptr;&lt;br /&gt;
         if (getCstring(ptr))&lt;br /&gt;
         {&lt;br /&gt;
             strncpy(buf, ptr, buf_len-1);&lt;br /&gt;
             return true;&lt;br /&gt;
         }&lt;br /&gt;
         return false;&lt;br /&gt;
     }    &lt;br /&gt;
     bool getCstring(const char *&amp;amp;c_ptr)&lt;br /&gt;
     {&lt;br /&gt;
         return false;&lt;br /&gt;
     }    &lt;br /&gt;
     // EpicsProperty&lt;br /&gt;
        const char *getName()&lt;br /&gt;
        {   return name.c_str(); }&lt;br /&gt;
 private:&lt;br /&gt;
        string name;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class EpicsDoubleProperty : public EpicsPropertyBase&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
        EpicsDoubleProperty(const char *name, const double *p)&lt;br /&gt;
             : EpicsPropertyBase(name)&lt;br /&gt;
     {   this-&amp;gt;p = p; }&lt;br /&gt;
        // EpicsDataDescriptor&lt;br /&gt;
        EpicsDataCharacter getType()&lt;br /&gt;
        {   return Real; }&lt;br /&gt;
     int getNumDims()&lt;br /&gt;
     {   return 1; }&lt;br /&gt;
     int getSize(int dim)&lt;br /&gt;
     {   return dim==1 ? 1 : 0; }&lt;br /&gt;
     int getBitsize()&lt;br /&gt;
     {   return sizeof(double)*8; }&lt;br /&gt;
     bool isSigned()&lt;br /&gt;
     {   return true; }&lt;br /&gt;
     // EpicsDataReader&lt;br /&gt;
     bool getDouble(double &amp;amp;d)&lt;br /&gt;
     {   d = *p; }&lt;br /&gt;
 private:&lt;br /&gt;
        const double *p;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class EpicsStringProperty : public EpicsPropertyBase&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
        EpicsStringProperty(const char *name, const string *p)&lt;br /&gt;
             : EpicsPropertyBase(name)&lt;br /&gt;
     {   this-&amp;gt;p = p; }&lt;br /&gt;
        // EpicsDataDescriptor&lt;br /&gt;
        EpicsDataCharacter getType()&lt;br /&gt;
        {   return String; }&lt;br /&gt;
     int getNumDims()&lt;br /&gt;
     {   return 1; }&lt;br /&gt;
     int getSize(int dim)&lt;br /&gt;
     {   return dim==1 ? p-&amp;gt;length() : 0; }&lt;br /&gt;
     int getBitsize()&lt;br /&gt;
     {   return p-&amp;gt;length()*8; }&lt;br /&gt;
     bool isSigned()&lt;br /&gt;
     {   return false; }&lt;br /&gt;
     // EpicsDataReader&lt;br /&gt;
     virtual bool getCstring(const char *&amp;amp;c_ptr)&lt;br /&gt;
     {&lt;br /&gt;
         c_ptr = p-&amp;gt;c_str();&lt;br /&gt;
         return true;&lt;br /&gt;
     }&lt;br /&gt;
 private:&lt;br /&gt;
     const string *p;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
=== Example for data known at compile-time ===&lt;br /&gt;
 // This is the code that provides a property catalog.&lt;br /&gt;
 // Again skip on the first read.&lt;br /&gt;
 //&lt;br /&gt;
 // All of this could be generated from DBD&lt;br /&gt;
 class AiRecord : public EpicsPropertyCatalog&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
     AiRecord();&lt;br /&gt;
     // Unsure if database code with pointer to the record&lt;br /&gt;
     // should still directly access the data,&lt;br /&gt;
     // or if the data should be protected/private.&lt;br /&gt;
     double value;&lt;br /&gt;
     string units;&lt;br /&gt;
     // EpicsPropertyCatalog&lt;br /&gt;
     int getNumProperties();&lt;br /&gt;
     EpicsProperty *findProperty(const char *name);    &lt;br /&gt;
     EpicsProperty *getProperty(int index);&lt;br /&gt;
 private:&lt;br /&gt;
     EpicsProperty *property[2];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 AiRecord::AiRecord()&lt;br /&gt;
 {&lt;br /&gt;
     property[0] = new EpicsDoubleProperty(&amp;quot;value&amp;quot;, &amp;amp;this-&amp;gt;value);&lt;br /&gt;
     property[1] = new EpicsStringProperty(&amp;quot;units&amp;quot;, &amp;amp;this-&amp;gt;units);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int AiRecord::getNumProperties()&lt;br /&gt;
 {   return sizeof(property)/sizeof(EpicsProperty *); }&lt;br /&gt;
 &lt;br /&gt;
 EpicsProperty *AiRecord::findProperty(const char *name)&lt;br /&gt;
 {   // could support hashed numeric IDs instead of strings&lt;br /&gt;
     int i;&lt;br /&gt;
     for (i=0; i&amp;lt;getNumProperties(); ++i)&lt;br /&gt;
         if (!strcmp(property[i]-&amp;gt;getName(), name))&lt;br /&gt;
             return property[i];&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 EpicsProperty *AiRecord::getProperty(int index)&lt;br /&gt;
 {&lt;br /&gt;
     return (index &amp;gt;=0  &amp;amp;&amp;amp;  index &amp;lt;sizeof(property)/sizeof(EpicsProperty *)) ?&lt;br /&gt;
         property[index] : 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
=== Usage Example ===&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     AiRecord fred;&lt;br /&gt;
     // Record/device support might have direct access to the fields:&lt;br /&gt;
     fred.value = 42.3;&lt;br /&gt;
     fred.units = &amp;quot;a.u.&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
     // Other code uses PropertyCatalog&lt;br /&gt;
     EpicsPropertyCatalog *pc = &amp;amp;fred;&lt;br /&gt;
 &lt;br /&gt;
     // It can access known properties in chosen order&lt;br /&gt;
     EpicsProperty *vp = pc-&amp;gt;findProperty(&amp;quot;value&amp;quot;);&lt;br /&gt;
     double d;&lt;br /&gt;
     if (vp &amp;amp;&amp;amp; vp-&amp;gt;getDouble(d))&lt;br /&gt;
         printf(&amp;quot;Value = %.2f\n&amp;quot;, d);&lt;br /&gt;
     else&lt;br /&gt;
         printf(&amp;quot;Cannot get value as double\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     // Or inspect unknown property catalogs&lt;br /&gt;
     int i;&lt;br /&gt;
     for (i=0; i&amp;lt;pc-&amp;gt;getNumProperties(); ++i)&lt;br /&gt;
     {&lt;br /&gt;
         printf(&amp;quot;%-10s = &amp;quot;, pc-&amp;gt;getProperty(i)-&amp;gt;getName());&lt;br /&gt;
         switch (pc-&amp;gt;getProperty(i)-&amp;gt;getType())&lt;br /&gt;
         {&lt;br /&gt;
             case String:&lt;br /&gt;
                 const char *s;&lt;br /&gt;
                 if (pc-&amp;gt;getProperty(i)-&amp;gt;getCstring(s))&lt;br /&gt;
                     printf(&amp;quot;'%s'\n&amp;quot;, s);&lt;br /&gt;
                 else&lt;br /&gt;
                     printf(&amp;quot;&amp;lt;cannot get string&amp;gt;\n&amp;quot;);&lt;br /&gt;
                 break;&lt;br /&gt;
             case Bool:&lt;br /&gt;
             case Integer:&lt;br /&gt;
             case Real:&lt;br /&gt;
                 double d;&lt;br /&gt;
                 if (pc-&amp;gt;getProperty(i)-&amp;gt;getDouble(d))&lt;br /&gt;
                     printf(&amp;quot;%.2f\n&amp;quot;, d);&lt;br /&gt;
                 else&lt;br /&gt;
                     printf(&amp;quot;&amp;lt;cannot get double&amp;gt;\n&amp;quot;);&lt;br /&gt;
                 break;&lt;br /&gt;
             default:&lt;br /&gt;
                 printf(&amp;quot;&amp;lt;unhandled type&amp;gt;\n&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
        return 0;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>KayKasemir</name></author>
	</entry>
</feed>