<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://babel.isa.uma.es/babel2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jafma</id>
	<title>The BABEL Development Site - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://babel.isa.uma.es/babel2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jafma"/>
	<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Special:Contributions/Jafma"/>
	<updated>2026-11-09T19:28:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=720</id>
		<title>Documentation:People</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=720"/>
		<updated>2013-09-06T17:52:48Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Over the years, a diversity of people has used, tested or contributed in heterogeneous forms to the development of the BABEL tools. This below is the complete list in reverse chronological order. Since in BABEL, heterogeneity in developers is consider as important as any other kind of heterogenity, their academic level when they worked with the system is also annotated. &lt;br /&gt;
&lt;br /&gt;
If any one is missing, the guilt lays only with the [[ Documentation:Contact | responsible ]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;amp;Aacute;ngel Mart&amp;amp;iacute;nez Tenor (PhD student, Industrial Engineering).&lt;br /&gt;
*Ana Gago-Ben&amp;amp;iacute;tez (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Jos&amp;amp;eacute;-Luis Blanco-Claraco (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Francisco Moreno-Due&amp;amp;ntilde;as (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Luis-Miguel Molina-Alarc&amp;amp;oacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Amy Loufti (PhD Computer Science).&lt;br /&gt;
*Ana Cruz-Mart&amp;amp;iacute;n (PhD in Computer Science).&lt;br /&gt;
*Elena Cruz-Mart&amp;amp;iacute;n (Master thesis student, Telecommunication engineering).&lt;br /&gt;
*Vicente Ar&amp;amp;eacute;valo-Espejo (PhD student, Computer Science).&lt;br /&gt;
*Marcos Rodr&amp;amp;iacute;guez-Romero (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Jos&amp;amp;eacute;-Manuel &amp;amp;Aacute;lvarez-Mateos (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Miguel-&amp;amp;Aacute;ngel Olivares-M&amp;amp;eacute;ndez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Carlos P&amp;amp;eacute;rez-Sanjuan (Master thesis student, Computer Science).&lt;br /&gt;
*Juan-Ram&amp;amp;oacute;n Jim&amp;amp;eacute;nez-Gal&amp;amp;aacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*&amp;amp;Oacute;scar Moreno-G&amp;amp;oacute;mez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Cipriano Galindo-Andrades (PhD student, Computer Science).&lt;br /&gt;
*Rosa Mu&amp;amp;ntilde;oz-Mart&amp;amp;iacute;nez (Master thesis student, Computer Science).&lt;br /&gt;
*Salvador Pedraza-Moreno (PhD student, Industrial Engineering).&lt;br /&gt;
*Raquel Fern&amp;amp;aacute;ndez-Ramos (PhD student, Telecomunication Engineering).&lt;br /&gt;
*Javier Gonz&amp;amp;aacute;lez-Jim&amp;amp;eacute;nez (PhD in Industrial Engineering).&lt;br /&gt;
*Juan-Antonio Fern&amp;amp;aacute;ndez-Madrigal (PhD student, Computer Science).&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=719</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=719"/>
		<updated>2013-09-04T08:59:16Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Brief installation instructions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
*Many ice modules delivered in the examples folder use the [http://www.mrpt.org MRPT]. You will need to install a version &amp;gt;= 0.9.5 (and compile the Release libs), and also the [http://opencv.willowgarage.com/wiki/ OpenCV] and [http://www.wxwidgets.org/ wxWidgets] toolkits before compiling the code generated by BABEL for those modules (please refer to the respective web pages for more detailed information).&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip.gz Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://www.mrpt.org  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip.gz Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf.gz Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=718</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=718"/>
		<updated>2013-09-04T08:58:50Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Robot simulation kit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
*Many ice modules delivered in the examples folder use the [http://www.mrpt.org MRPT]. You will need to install a version &amp;gt;= 0.9.5 (and compile the Release libs), and also the [http://opencv.willowgarage.com/wiki/ OpenCV] and [http://www.wxwidgets.org/ wxWidgets] toolkits before compiling the code generated by BABEL for those modules (please refer to the respective web pages for more detailed information).&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip.gz Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://www.mrpt.org  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip.gz Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=717</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=717"/>
		<updated>2013-09-04T08:58:14Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.0 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
*Many ice modules delivered in the examples folder use the [http://www.mrpt.org MRPT]. You will need to install a version &amp;gt;= 0.9.5 (and compile the Release libs), and also the [http://opencv.willowgarage.com/wiki/ OpenCV] and [http://www.wxwidgets.org/ wxWidgets] toolkits before compiling the code generated by BABEL for those modules (please refer to the respective web pages for more detailed information).&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip.gz Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://www.mrpt.org  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=716</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=716"/>
		<updated>2013-09-04T08:57:20Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.38-free Hyperion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
*Many ice modules delivered in the examples folder use the [http://www.mrpt.org MRPT]. You will need to install a version &amp;gt;= 0.9.5 (and compile the Release libs), and also the [http://opencv.willowgarage.com/wiki/ OpenCV] and [http://www.wxwidgets.org/ wxWidgets] toolkits before compiling the code generated by BABEL for those modules (please refer to the respective web pages for more detailed information).&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://www.mrpt.org  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Publications&amp;diff=715</id>
		<title>Documentation:Publications</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Publications&amp;diff=715"/>
		<updated>2013-07-04T15:42:46Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;anyweb myheight=&amp;quot;2500&amp;quot;&amp;gt;http://mapir.isa.uma.es/mapirpubsite/jafmaexport.php?mode=bytopic&amp;amp;idparm=20&amp;amp;css=aigaion_pubs_for_joomlawrapper.css&amp;lt;/anyweb&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:ToDo&amp;diff=714</id>
		<title>Documentation:ToDo</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:ToDo&amp;diff=714"/>
		<updated>2011-10-18T09:25:05Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* ToDo (in spanish) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ToDo (in spanish) ==&lt;br /&gt;
&lt;br /&gt;
* Que el código del auxiliary pueda acceder al objeto del módulo, o sea, al internal status.&lt;br /&gt;
&lt;br /&gt;
* Añadir posibilidad de externals que no se empotren en el .ice.&lt;br /&gt;
&lt;br /&gt;
* Pensar en la posibilidad de servicios privados: cuando se necesita la concurrencia dentro del módulo sólo se debería hacer mediante servicios; el problema es que los parámetros de los mismos pueden ser objetos privados y, además, no interesa que esos servicios implementadores de concurrencia interna sean llamados desde fuera. &lt;br /&gt;
&lt;br /&gt;
* Añadir llamadas no bloqueantes a servicios.&lt;br /&gt;
&lt;br /&gt;
* IMPORTANTE: Posible &amp;quot;no thread-safe&amp;quot; al llamar a un servicio. En Debug peta al acceder a &amp;quot;threadsInfo&amp;quot; (o algo asi). TODO: Hacer crit. section en ese std::map ??&lt;br /&gt;
&lt;br /&gt;
* Parece que el diseñador de módulos tiene un límite de 32Kb a la longitud del código que puede editar. Ha sucedido con un auxiliary logic de más de 32Kb que ha provocado un error de VBasic al pulsar en el botón de Auxiliary logic (el módulo sí se carga bien). Así que es un error del interfaz gráfico y sus llamadas a BABEL_RetrieveGlobalCode (de hecho hay sólo una llamada y usa un maxlen==0, que es bastante sospechoso).&lt;br /&gt;
&lt;br /&gt;
* Pensarse si agregar un &amp;quot;Auxiliary data&amp;quot; para tipos globales internos / constantes globales internas. Pensarse también si mover el Auxiliary Logic como métodos private de la clase del ...i.cpp en los generadores para CORBA.&lt;br /&gt;
&lt;br /&gt;
* Editor de código del MD: mejorar y permitir ver el internal status en cualquier trozo de código sin salirse, así como mostrar la lista de argumentos de entrada y salida en la ventana de edición&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom para saber el nombre del módulo, y otra para saber el nombre del módulo llamante&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom para saltar hasta el final de un servicio (útil para los permanentes)&lt;br /&gt;
&lt;br /&gt;
* Corregir la versión del babel_core.h a &amp;quot;3.9.1&amp;quot;, que ahora está como &amp;quot;0.3.9.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* El MD muestra como plataforma de comunicaciones para Endymion la ACE 5.4 + TAO 1.4, lo cual no es cierto. Requiere cambiar la dll del core de babel, que seguramente estará utilizando un código erróneo para extraer la plataforma del .cps&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;¿Pensarse si es bueno que al indicar en el non-portable design una librería se hagan automáticamente sus includes? Quizás sería bueno que eso lo hiciera el usuario... Quizás no&amp;lt;/strike&amp;gt;. (JL: Ya está hecho desde hace un tiempo).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Un servicio de tipo event o notification handler no debe tener visibles las ventanas de input/output arguments en el MD&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;He cambiado &amp;quot;-ORBInitRef NameService=...&amp;quot; por &amp;quot;-ORBInitRef NamingService=...&amp;quot; en la máquina virtual de Ana Gago, en el EM, para lanzar al servidor de eventos (y por tanto a todos los módulos también, porque es la rutina &amp;quot;formaparametronaming&amp;quot;), y con eso a Ana le ha funcionado (no le funcionaba sin eso). Sin embargo hay que revisarlo, porque hasta ahora, según la documentacón, debía ser como estaba: &amp;quot;-ORBInitRef NameService=...&amp;quot;. Chequear libro de ACETAO a ver y o bien a) volver a NameService en esa rutina del EM o bien b) cambiar todo a NamingService, tanto en la cabecera del formsequencer como en el script que genera el main de los módulos, donde también aparece aún NameService&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[ESTADO DEL CAMBIO: nonportables y CMake]]&lt;br /&gt;
** &amp;lt;strike&amp;gt;Como sacar fuera mrpt opencv (Ya incluye: Añadir nombre IDL mientras compila )&lt;br /&gt;
** Hecho en parte. Queda ver metodo mas generico de incluir librerias aparte de OpenCV / MRPT.&amp;lt;/strike&amp;gt;&lt;br /&gt;
** &amp;lt;strike&amp;gt;Quitar las with* del generador Endymion y de la DLL del interfaz con el MD/EM.&amp;lt;/strike&amp;gt;&lt;br /&gt;
** &amp;lt;strike&amp;gt;Poner private los atributos (mapas) que JL ha añadido en el generador de Endymion.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Añadir flag a babel_generator.exe para saltarse el esperar tecla al final...&amp;lt;/strike&amp;gt;&lt;br /&gt;
** hecho con flag: &amp;quot;-nokeyatend&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[ESTADO DEL CAMBIO: Nuevos tipos de datos]]&lt;br /&gt;
** &amp;lt;strike&amp;gt;Meter en babel.idl algunos tipos de datos genéricos que puedan ser de utilidad, añadiendo su documentación a la wiki de BDL&amp;lt;/strike&amp;gt;. Hecho. Metidos todos menos timestamp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Comprobar posible error con eventos en Endymion/Hyperion: cuando se lanzan muchos eventos sin esperas con un número determinado de módulos (unos 15-20), llega un momento en que los nuevos módulos que arrancan les falla la llamada al -&amp;gt;for_suppliers. Parece que se reduce la probabilidad de error si se lanzan todos los módulos antes de que empiece la avalancha de eventos, aunque aún así hay aplicaciones en donde todos los módulos pasan bien el for_suppliers pero luego se pierden eventos...&lt;br /&gt;
** Probar una aplicación minimalista para descartar del todo que sea cosa de los módulos de la arquitectura ACHRIN, que es con quienes se ha probado siempre.&lt;br /&gt;
** JL (11-nov-09): Ya se probó app. minima y falló, pero debería repetirse ahora tras corregir tema de secciones críticas al mandar eventos, quizás ya esté el tema resuelto...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Tema: Bases de datos&lt;br /&gt;
** http://babel.isa.uma.es/babel2/wiki/index.php/Architecture:The_RPD_and_APP_databases&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* En EM / Modulos: que el -RemoteMandatory se pueda configurar dentro del modulo en si, o al menos que tenga un valor x defecto si no hay parametro en linea de comando. Parametros del modulo dentro de la &amp;quot;application&amp;quot;... formalizar en BABEL en sí???&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Programa Visual_RPD_Editor:&lt;br /&gt;
** Cambiar nombre,&lt;br /&gt;
** Hacer generico para RPDs y &amp;quot;apps-configs?&amp;quot;.&lt;br /&gt;
** Meter en BABEL/CMake y Execution Directory??&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Soporte para distintos compiladores con el mismo generador de código...&lt;br /&gt;
** Posible idea: Mostrar un nuevo combo en el BABEL_MD para elegir compilador a la vez q se elige generador.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Permitir definiciones de tipos en el lenguaje de programación escogido para tipos internos (un botón más parecido al auxiliary logic)&lt;br /&gt;
&lt;br /&gt;
* Permitir uso de tipos de otros módulos en los parámetros BDL de un servicio de un módulo dado&lt;br /&gt;
** El usuario lo introduciría como BABEL::&amp;lt;modulodefinitorio&amp;gt;::tipo&lt;br /&gt;
** Se metería como dependencia de módulo (sin servicio) en la lista de dependencias&lt;br /&gt;
** Cosas que faltan:&lt;br /&gt;
*** Incluir en Endymion, en el idl del cliente, después del include babel.idl, el idl del servidor de tipos. Usar los preceptivos #ifdef para evitar inclusiones múltiples &lt;br /&gt;
*** Tratar a las dependencias diferentemente si son de servicio que si son de módulo: si sólo son de módulo (y no hay ninguna que sea de un servicio de ese módulo), meterlas en el idl pero no crear objetos ni buscarlos en el servidor de nombres. En cualquier otro caso (lo cual incluye por ejemplo, las actuales dependencias de módulo que se necesitan para definir los manejadores de eventos), crear objetos remotos y buscarlos en el servidor de nombres.&lt;br /&gt;
**** En el MD, al añadir una Dep. pregunta si se quiere añadir solo un servicio o todo el modulo. Avisar de las consecuencias en ese aviso al usuario...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Terminar el intérprete de átomos de aracne sobre trozos de código para a) hacer un mejor uso de las dependencias y b) detectar cuándo no se envía eventos, en cuyo caso no hace falta generar el código para event_supplier en Hyperion/Endymion. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Montar un repositorio de módulos teniendo en cuenta sus dependencias y versiones&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Port a ACE+TAO-5.6]]&lt;br /&gt;
** Parece que esto solucionaría un bug del TAO 1.1 que hace perder eventos y otros errores al conectarse al servidor de eventos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Cambiar la gestión de cadenas de texto como tipo de datos mapeado de BDL a C++. Quizas, cambiar tb los sequences a std::vector&amp;lt;T&amp;gt; para que sea igual que en otros generadores futuros, ademas de evitar que el usuario tenga que hacer el &amp;quot;new Sequence&amp;quot; como ahora... &lt;br /&gt;
** Todos estos cambios tienen la mala parte de que en el gen. de ACETAO, podriamos apañar todos los tipos de datos complejos, pero cuando esten dentro de estructuras ya seria demasiado...&lt;br /&gt;
** De todas formas, ahora mismo YA hay que tratar los tipos de forma distinta si estan dentro de structs que cuando no lo estan, asi que quizas no es tan grave&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Sacar los ficheros de ayuda de la distribución y hacer referencia a esta wiki&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom que dé información (nombre) del módulo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Abordar genericidad (H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Abordar repetición de módulos (H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Generador para Player/Stage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Docs sobre componentes del babel system&lt;br /&gt;
&lt;br /&gt;
== Cosas extra de referencia ==&lt;br /&gt;
&lt;br /&gt;
* [http://babel.isa.uma.es/~jlblanco/ACE-5.1+TAO-1.1.zip ACE-5.1+TAO-1.1.zip]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=713</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=713"/>
		<updated>2011-10-17T19:43:16Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.1 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
*Many ice modules delivered in the examples folder use the [http://www.mrpt.org MRPT]. You will need to install a version &amp;gt;= 0.9.5 (and compile the Release libs), and also the [http://opencv.willowgarage.com/wiki/ OpenCV] and [http://www.wxwidgets.org/ wxWidgets] toolkits before compiling the code generated by BABEL for those modules (please refer to the respective web pages for more detailed information).&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=712</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=712"/>
		<updated>2011-10-17T19:41:17Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.1 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
*Many ice modules delivered in the examples folder use the [http://www.mrpt.org MRPT]. You will need a version &amp;gt;= 0.9.5.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=711</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=711"/>
		<updated>2011-10-17T19:38:57Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.1 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
*Many ice modules delivered in the examples folder use the MRPT. You will need a version &amp;gt;= 0.9.5.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:ToDo&amp;diff=710</id>
		<title>Documentation:ToDo</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:ToDo&amp;diff=710"/>
		<updated>2011-05-18T09:21:56Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* ToDo (in spanish) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ToDo (in spanish) ==&lt;br /&gt;
&lt;br /&gt;
* Añadir posibilidad de externals que no se empotren en el .ice.&lt;br /&gt;
&lt;br /&gt;
* Pensar en la posibilidad de servicios privados: cuando se necesita la concurrencia dentro del módulo sólo se debería hacer mediante servicios; el problema es que los parámetros de los mismos pueden ser objetos privados y, además, no interesa que esos servicios implementadores de concurrencia interna sean llamados desde fuera. &lt;br /&gt;
&lt;br /&gt;
* Añadir llamadas no bloqueantes a servicios.&lt;br /&gt;
&lt;br /&gt;
* IMPORTANTE: Posible &amp;quot;no thread-safe&amp;quot; al llamar a un servicio. En Debug peta al acceder a &amp;quot;threadsInfo&amp;quot; (o algo asi). TODO: Hacer crit. section en ese std::map ??&lt;br /&gt;
&lt;br /&gt;
* Parece que el diseñador de módulos tiene un límite de 32Kb a la longitud del código que puede editar. Ha sucedido con un auxiliary logic de más de 32Kb que ha provocado un error de VBasic al pulsar en el botón de Auxiliary logic (el módulo sí se carga bien). Así que es un error del interfaz gráfico y sus llamadas a BABEL_RetrieveGlobalCode (de hecho hay sólo una llamada y usa un maxlen==0, que es bastante sospechoso).&lt;br /&gt;
&lt;br /&gt;
* Pensarse si agregar un &amp;quot;Auxiliary data&amp;quot; para tipos globales internos / constantes globales internas. Pensarse también si mover el Auxiliary Logic como métodos private de la clase del ...i.cpp en los generadores para CORBA.&lt;br /&gt;
&lt;br /&gt;
* Editor de código del MD: mejorar y permitir ver el internal status en cualquier trozo de código sin salirse, así como mostrar la lista de argumentos de entrada y salida en la ventana de edición&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom para saber el nombre del módulo, y otra para saber el nombre del módulo llamante&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom para saltar hasta el final de un servicio (útil para los permanentes)&lt;br /&gt;
&lt;br /&gt;
* Corregir la versión del babel_core.h a &amp;quot;3.9.1&amp;quot;, que ahora está como &amp;quot;0.3.9.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* El MD muestra como plataforma de comunicaciones para Endymion la ACE 5.4 + TAO 1.4, lo cual no es cierto. Requiere cambiar la dll del core de babel, que seguramente estará utilizando un código erróneo para extraer la plataforma del .cps&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;¿Pensarse si es bueno que al indicar en el non-portable design una librería se hagan automáticamente sus includes? Quizás sería bueno que eso lo hiciera el usuario... Quizás no&amp;lt;/strike&amp;gt;. (JL: Ya está hecho desde hace un tiempo).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Un servicio de tipo event o notification handler no debe tener visibles las ventanas de input/output arguments en el MD&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;He cambiado &amp;quot;-ORBInitRef NameService=...&amp;quot; por &amp;quot;-ORBInitRef NamingService=...&amp;quot; en la máquina virtual de Ana Gago, en el EM, para lanzar al servidor de eventos (y por tanto a todos los módulos también, porque es la rutina &amp;quot;formaparametronaming&amp;quot;), y con eso a Ana le ha funcionado (no le funcionaba sin eso). Sin embargo hay que revisarlo, porque hasta ahora, según la documentacón, debía ser como estaba: &amp;quot;-ORBInitRef NameService=...&amp;quot;. Chequear libro de ACETAO a ver y o bien a) volver a NameService en esa rutina del EM o bien b) cambiar todo a NamingService, tanto en la cabecera del formsequencer como en el script que genera el main de los módulos, donde también aparece aún NameService&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[ESTADO DEL CAMBIO: nonportables y CMake]]&lt;br /&gt;
** &amp;lt;strike&amp;gt;Como sacar fuera mrpt opencv (Ya incluye: Añadir nombre IDL mientras compila )&lt;br /&gt;
** Hecho en parte. Queda ver metodo mas generico de incluir librerias aparte de OpenCV / MRPT.&amp;lt;/strike&amp;gt;&lt;br /&gt;
** &amp;lt;strike&amp;gt;Quitar las with* del generador Endymion y de la DLL del interfaz con el MD/EM.&amp;lt;/strike&amp;gt;&lt;br /&gt;
** &amp;lt;strike&amp;gt;Poner private los atributos (mapas) que JL ha añadido en el generador de Endymion.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Añadir flag a babel_generator.exe para saltarse el esperar tecla al final...&amp;lt;/strike&amp;gt;&lt;br /&gt;
** hecho con flag: &amp;quot;-nokeyatend&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[ESTADO DEL CAMBIO: Nuevos tipos de datos]]&lt;br /&gt;
** &amp;lt;strike&amp;gt;Meter en babel.idl algunos tipos de datos genéricos que puedan ser de utilidad, añadiendo su documentación a la wiki de BDL&amp;lt;/strike&amp;gt;. Hecho. Metidos todos menos timestamp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Comprobar posible error con eventos en Endymion/Hyperion: cuando se lanzan muchos eventos sin esperas con un número determinado de módulos (unos 15-20), llega un momento en que los nuevos módulos que arrancan les falla la llamada al -&amp;gt;for_suppliers. Parece que se reduce la probabilidad de error si se lanzan todos los módulos antes de que empiece la avalancha de eventos, aunque aún así hay aplicaciones en donde todos los módulos pasan bien el for_suppliers pero luego se pierden eventos...&lt;br /&gt;
** Probar una aplicación minimalista para descartar del todo que sea cosa de los módulos de la arquitectura ACHRIN, que es con quienes se ha probado siempre.&lt;br /&gt;
** JL (11-nov-09): Ya se probó app. minima y falló, pero debería repetirse ahora tras corregir tema de secciones críticas al mandar eventos, quizás ya esté el tema resuelto...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Tema: Bases de datos&lt;br /&gt;
** http://babel.isa.uma.es/babel2/wiki/index.php/Architecture:The_RPD_and_APP_databases&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* En EM / Modulos: que el -RemoteMandatory se pueda configurar dentro del modulo en si, o al menos que tenga un valor x defecto si no hay parametro en linea de comando. Parametros del modulo dentro de la &amp;quot;application&amp;quot;... formalizar en BABEL en sí???&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Programa Visual_RPD_Editor:&lt;br /&gt;
** Cambiar nombre,&lt;br /&gt;
** Hacer generico para RPDs y &amp;quot;apps-configs?&amp;quot;.&lt;br /&gt;
** Meter en BABEL/CMake y Execution Directory??&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Soporte para distintos compiladores con el mismo generador de código...&lt;br /&gt;
** Posible idea: Mostrar un nuevo combo en el BABEL_MD para elegir compilador a la vez q se elige generador.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Permitir definiciones de tipos en el lenguaje de programación escogido para tipos internos (un botón más parecido al auxiliary logic)&lt;br /&gt;
&lt;br /&gt;
* Permitir uso de tipos de otros módulos en los parámetros BDL de un servicio de un módulo dado&lt;br /&gt;
** El usuario lo introduciría como BABEL::&amp;lt;modulodefinitorio&amp;gt;::tipo&lt;br /&gt;
** Se metería como dependencia de módulo (sin servicio) en la lista de dependencias&lt;br /&gt;
** Cosas que faltan:&lt;br /&gt;
*** Incluir en Endymion, en el idl del cliente, después del include babel.idl, el idl del servidor de tipos. Usar los preceptivos #ifdef para evitar inclusiones múltiples &lt;br /&gt;
*** Tratar a las dependencias diferentemente si son de servicio que si son de módulo: si sólo son de módulo (y no hay ninguna que sea de un servicio de ese módulo), meterlas en el idl pero no crear objetos ni buscarlos en el servidor de nombres. En cualquier otro caso (lo cual incluye por ejemplo, las actuales dependencias de módulo que se necesitan para definir los manejadores de eventos), crear objetos remotos y buscarlos en el servidor de nombres.&lt;br /&gt;
**** En el MD, al añadir una Dep. pregunta si se quiere añadir solo un servicio o todo el modulo. Avisar de las consecuencias en ese aviso al usuario...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Terminar el intérprete de átomos de aracne sobre trozos de código para a) hacer un mejor uso de las dependencias y b) detectar cuándo no se envía eventos, en cuyo caso no hace falta generar el código para event_supplier en Hyperion/Endymion. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Montar un repositorio de módulos teniendo en cuenta sus dependencias y versiones&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Port a ACE+TAO-5.6]]&lt;br /&gt;
** Parece que esto solucionaría un bug del TAO 1.1 que hace perder eventos y otros errores al conectarse al servidor de eventos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Cambiar la gestión de cadenas de texto como tipo de datos mapeado de BDL a C++. Quizas, cambiar tb los sequences a std::vector&amp;lt;T&amp;gt; para que sea igual que en otros generadores futuros, ademas de evitar que el usuario tenga que hacer el &amp;quot;new Sequence&amp;quot; como ahora... &lt;br /&gt;
** Todos estos cambios tienen la mala parte de que en el gen. de ACETAO, podriamos apañar todos los tipos de datos complejos, pero cuando esten dentro de estructuras ya seria demasiado...&lt;br /&gt;
** De todas formas, ahora mismo YA hay que tratar los tipos de forma distinta si estan dentro de structs que cuando no lo estan, asi que quizas no es tan grave&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Sacar los ficheros de ayuda de la distribución y hacer referencia a esta wiki&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom que dé información (nombre) del módulo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Abordar genericidad (H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Abordar repetición de módulos (H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Generador para Player/Stage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Docs sobre componentes del babel system&lt;br /&gt;
&lt;br /&gt;
== Cosas extra de referencia ==&lt;br /&gt;
&lt;br /&gt;
* [http://babel.isa.uma.es/~jlblanco/ACE-5.1+TAO-1.1.zip ACE-5.1+TAO-1.1.zip]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:ToDo&amp;diff=709</id>
		<title>Documentation:ToDo</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:ToDo&amp;diff=709"/>
		<updated>2011-05-17T09:26:16Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* ToDo (in spanish) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ToDo (in spanish) ==&lt;br /&gt;
&lt;br /&gt;
* Añadir posibilidad de externals que no se empotren en el .ice.&lt;br /&gt;
&lt;br /&gt;
* Pensar en la posibilidad de servicios privados: cuando se necesita la concurrencia dentro del módulo sólo se debería hacer mediante servicios; el problema es que los parámetros de los mismos pueden ser objetos privados y, además, no interesa que esos servicios implementadores de concurrencia interna sean llamados desde fuera.&lt;br /&gt;
&lt;br /&gt;
* IMPORTANTE: Posible &amp;quot;no thread-safe&amp;quot; al llamar a un servicio. En Debug peta al acceder a &amp;quot;threadsInfo&amp;quot; (o algo asi). TODO: Hacer crit. section en ese std::map ??&lt;br /&gt;
&lt;br /&gt;
* Parece que el diseñador de módulos tiene un límite de 32Kb a la longitud del código que puede editar. Ha sucedido con un auxiliary logic de más de 32Kb que ha provocado un error de VBasic al pulsar en el botón de Auxiliary logic (el módulo sí se carga bien). Así que es un error del interfaz gráfico y sus llamadas a BABEL_RetrieveGlobalCode (de hecho hay sólo una llamada y usa un maxlen==0, que es bastante sospechoso).&lt;br /&gt;
&lt;br /&gt;
* Pensarse si agregar un &amp;quot;Auxiliary data&amp;quot; para tipos globales internos / constantes globales internas. Pensarse también si mover el Auxiliary Logic como métodos private de la clase del ...i.cpp en los generadores para CORBA.&lt;br /&gt;
&lt;br /&gt;
* Editor de código del MD: mejorar y permitir ver el internal status en cualquier trozo de código sin salirse, así como mostrar la lista de argumentos de entrada y salida en la ventana de edición&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom para saber el nombre del módulo, y otra para saber el nombre del módulo llamante&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom para saltar hasta el final de un servicio (útil para los permanentes)&lt;br /&gt;
&lt;br /&gt;
* Corregir la versión del babel_core.h a &amp;quot;3.9.1&amp;quot;, que ahora está como &amp;quot;0.3.9.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* El MD muestra como plataforma de comunicaciones para Endymion la ACE 5.4 + TAO 1.4, lo cual no es cierto. Requiere cambiar la dll del core de babel, que seguramente estará utilizando un código erróneo para extraer la plataforma del .cps&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;¿Pensarse si es bueno que al indicar en el non-portable design una librería se hagan automáticamente sus includes? Quizás sería bueno que eso lo hiciera el usuario... Quizás no&amp;lt;/strike&amp;gt;. (JL: Ya está hecho desde hace un tiempo).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Un servicio de tipo event o notification handler no debe tener visibles las ventanas de input/output arguments en el MD&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;He cambiado &amp;quot;-ORBInitRef NameService=...&amp;quot; por &amp;quot;-ORBInitRef NamingService=...&amp;quot; en la máquina virtual de Ana Gago, en el EM, para lanzar al servidor de eventos (y por tanto a todos los módulos también, porque es la rutina &amp;quot;formaparametronaming&amp;quot;), y con eso a Ana le ha funcionado (no le funcionaba sin eso). Sin embargo hay que revisarlo, porque hasta ahora, según la documentacón, debía ser como estaba: &amp;quot;-ORBInitRef NameService=...&amp;quot;. Chequear libro de ACETAO a ver y o bien a) volver a NameService en esa rutina del EM o bien b) cambiar todo a NamingService, tanto en la cabecera del formsequencer como en el script que genera el main de los módulos, donde también aparece aún NameService&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[ESTADO DEL CAMBIO: nonportables y CMake]]&lt;br /&gt;
** &amp;lt;strike&amp;gt;Como sacar fuera mrpt opencv (Ya incluye: Añadir nombre IDL mientras compila )&lt;br /&gt;
** Hecho en parte. Queda ver metodo mas generico de incluir librerias aparte de OpenCV / MRPT.&amp;lt;/strike&amp;gt;&lt;br /&gt;
** &amp;lt;strike&amp;gt;Quitar las with* del generador Endymion y de la DLL del interfaz con el MD/EM.&amp;lt;/strike&amp;gt;&lt;br /&gt;
** &amp;lt;strike&amp;gt;Poner private los atributos (mapas) que JL ha añadido en el generador de Endymion.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Añadir flag a babel_generator.exe para saltarse el esperar tecla al final...&amp;lt;/strike&amp;gt;&lt;br /&gt;
** hecho con flag: &amp;quot;-nokeyatend&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[ESTADO DEL CAMBIO: Nuevos tipos de datos]]&lt;br /&gt;
** &amp;lt;strike&amp;gt;Meter en babel.idl algunos tipos de datos genéricos que puedan ser de utilidad, añadiendo su documentación a la wiki de BDL&amp;lt;/strike&amp;gt;. Hecho. Metidos todos menos timestamp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Comprobar posible error con eventos en Endymion/Hyperion: cuando se lanzan muchos eventos sin esperas con un número determinado de módulos (unos 15-20), llega un momento en que los nuevos módulos que arrancan les falla la llamada al -&amp;gt;for_suppliers. Parece que se reduce la probabilidad de error si se lanzan todos los módulos antes de que empiece la avalancha de eventos, aunque aún así hay aplicaciones en donde todos los módulos pasan bien el for_suppliers pero luego se pierden eventos...&lt;br /&gt;
** Probar una aplicación minimalista para descartar del todo que sea cosa de los módulos de la arquitectura ACHRIN, que es con quienes se ha probado siempre.&lt;br /&gt;
** JL (11-nov-09): Ya se probó app. minima y falló, pero debería repetirse ahora tras corregir tema de secciones críticas al mandar eventos, quizás ya esté el tema resuelto...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Tema: Bases de datos&lt;br /&gt;
** http://babel.isa.uma.es/babel2/wiki/index.php/Architecture:The_RPD_and_APP_databases&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* En EM / Modulos: que el -RemoteMandatory se pueda configurar dentro del modulo en si, o al menos que tenga un valor x defecto si no hay parametro en linea de comando. Parametros del modulo dentro de la &amp;quot;application&amp;quot;... formalizar en BABEL en sí???&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Programa Visual_RPD_Editor:&lt;br /&gt;
** Cambiar nombre,&lt;br /&gt;
** Hacer generico para RPDs y &amp;quot;apps-configs?&amp;quot;.&lt;br /&gt;
** Meter en BABEL/CMake y Execution Directory??&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Soporte para distintos compiladores con el mismo generador de código...&lt;br /&gt;
** Posible idea: Mostrar un nuevo combo en el BABEL_MD para elegir compilador a la vez q se elige generador.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Permitir definiciones de tipos en el lenguaje de programación escogido para tipos internos (un botón más parecido al auxiliary logic)&lt;br /&gt;
&lt;br /&gt;
* Permitir uso de tipos de otros módulos en los parámetros BDL de un servicio de un módulo dado&lt;br /&gt;
** El usuario lo introduciría como BABEL::&amp;lt;modulodefinitorio&amp;gt;::tipo&lt;br /&gt;
** Se metería como dependencia de módulo (sin servicio) en la lista de dependencias&lt;br /&gt;
** Cosas que faltan:&lt;br /&gt;
*** Incluir en Endymion, en el idl del cliente, después del include babel.idl, el idl del servidor de tipos. Usar los preceptivos #ifdef para evitar inclusiones múltiples &lt;br /&gt;
*** Tratar a las dependencias diferentemente si son de servicio que si son de módulo: si sólo son de módulo (y no hay ninguna que sea de un servicio de ese módulo), meterlas en el idl pero no crear objetos ni buscarlos en el servidor de nombres. En cualquier otro caso (lo cual incluye por ejemplo, las actuales dependencias de módulo que se necesitan para definir los manejadores de eventos), crear objetos remotos y buscarlos en el servidor de nombres.&lt;br /&gt;
**** En el MD, al añadir una Dep. pregunta si se quiere añadir solo un servicio o todo el modulo. Avisar de las consecuencias en ese aviso al usuario...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Terminar el intérprete de átomos de aracne sobre trozos de código para a) hacer un mejor uso de las dependencias y b) detectar cuándo no se envía eventos, en cuyo caso no hace falta generar el código para event_supplier en Hyperion/Endymion. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Montar un repositorio de módulos teniendo en cuenta sus dependencias y versiones&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Port a ACE+TAO-5.6]]&lt;br /&gt;
** Parece que esto solucionaría un bug del TAO 1.1 que hace perder eventos y otros errores al conectarse al servidor de eventos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Cambiar la gestión de cadenas de texto como tipo de datos mapeado de BDL a C++. Quizas, cambiar tb los sequences a std::vector&amp;lt;T&amp;gt; para que sea igual que en otros generadores futuros, ademas de evitar que el usuario tenga que hacer el &amp;quot;new Sequence&amp;quot; como ahora... &lt;br /&gt;
** Todos estos cambios tienen la mala parte de que en el gen. de ACETAO, podriamos apañar todos los tipos de datos complejos, pero cuando esten dentro de estructuras ya seria demasiado...&lt;br /&gt;
** De todas formas, ahora mismo YA hay que tratar los tipos de forma distinta si estan dentro de structs que cuando no lo estan, asi que quizas no es tan grave&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;Sacar los ficheros de ayuda de la distribución y hacer referencia a esta wiki&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Añadir una aracne atom que dé información (nombre) del módulo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Abordar genericidad (H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Abordar repetición de módulos (H)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Generador para Player/Stage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Docs sobre componentes del babel system&lt;br /&gt;
&lt;br /&gt;
== Cosas extra de referencia ==&lt;br /&gt;
&lt;br /&gt;
* [http://babel.isa.uma.es/~jlblanco/ACE-5.1+TAO-1.1.zip ACE-5.1+TAO-1.1.zip]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=707</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=707"/>
		<updated>2011-03-08T11:42:49Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.1 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039;&lt;br /&gt;
*It has been tested in Windows 7 (32 bits). You must download or copy from the babelv0391_endymion directory to the C:\Windows\System32 folder the msvbvm50.dll, mswinsck.ocx, mscomctl.ocx, comdlg32.ocx and richtx32.ocx and register them as administrator in the system with the command line program regsvr32. If you find any other dll or ocx missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VS2008 Professional.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In Windows Vista you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same.&lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista. &lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=706</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=706"/>
		<updated>2011-03-08T11:42:03Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Welcome to the BABEL Development Site v3.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the BABEL Development Site v3.0 ==&lt;br /&gt;
&lt;br /&gt;
The BABEL Development System is a software development framework that is neutral with respect to the programming language and underlying operating system, intended for creating complex software applications with the focus in coping with heterogeneity (typically, very different program code produced by different people to manage diverse software and hardware devices). It was born in the robotics domain, where heterogeneity is of the uttermost importance, particularly in today&amp;#039;s large scale and long-term projects. &lt;br /&gt;
&lt;br /&gt;
This framework is being developed since 1996 at the System Engineering and Automation Department of the University of Málaga [http://www.isa.uma.es] and it&amp;#039;s aimed to cover several aspects of the robotic software lifecycle, such as the design, validation, debugging, implementation, testing, and manteinance phases.&lt;br /&gt;
&lt;br /&gt;
== Specifications and Tools ==&lt;br /&gt;
&lt;br /&gt;
The current components of BABEL are:&lt;br /&gt;
&lt;br /&gt;
* The &amp;#039;&amp;#039;&amp;#039;Aracne&amp;#039;&amp;#039;&amp;#039; specification, which covers the design stage of development. Currently it is being extended and transformed into the &amp;#039;&amp;#039;&amp;#039;H&amp;#039;&amp;#039;&amp;#039; specification language.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babel.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Module Designer&amp;#039;&amp;#039;&amp;#039;, a visual tool for designing the components (modules) of the application. It also covers the implementation by generating semi-automatically the source code of those components.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Console.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Generator&amp;#039;&amp;#039;&amp;#039;, a command-line tool for generating the implementations without visual aids.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Em.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Execution Manager&amp;#039;&amp;#039;&amp;#039;, a visual tool for managing all the components of an application in a possibly networked system from a centralized location. It is able to launch the programs and collect the logs produced by execution.&lt;br /&gt;
&lt;br /&gt;
* [[Image:D.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Debugger&amp;#039;&amp;#039;&amp;#039;, a visual tool for examining the time logs produced by the application and therefore detecting possible flaws and requirement unsatisfaction.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babelsite.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Development Site&amp;#039;&amp;#039;&amp;#039; [http://babel.isa.uma.es/babel2], a web site for maintainance of the system.&lt;br /&gt;
&lt;br /&gt;
* The [[ The Robotic Development Subsystem | &amp;#039;&amp;#039;&amp;#039;BABEL Robotic Development Subsystem&amp;#039;&amp;#039;&amp;#039; ]], a subsystem composed of its own tools, specifications and BABEL modules, specialized for creating robotic architectures.&lt;br /&gt;
&lt;br /&gt;
== Site navigation ==&lt;br /&gt;
&lt;br /&gt;
Within this site you can find all the tools and documentation produced for Babel. &lt;br /&gt;
&lt;br /&gt;
On your left you can see different sections:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The BABEL System&amp;#039;&amp;#039;&amp;#039;. It contains general descriptions of the components of the BABEL Development System. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Documentation &amp;amp; info&amp;#039;&amp;#039;&amp;#039;. All the documentation we currently have for our system, and contact info.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Donwloads&amp;#039;&amp;#039;&amp;#039;. A section where you can download BABEL and other files.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robotic Software Development&amp;#039;&amp;#039;&amp;#039;. In this under-construction section you will find general information about the development of robotic software.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma_personales&amp;amp;t=html&amp;amp;f=BABELwiki.gif This site is always under maintenance, so we apologize for not all the information being available at a given time.&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=694</id>
		<title>Documentation:BDL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=694"/>
		<updated>2011-02-16T14:02:37Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Repeated (sequence, array) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;BABEL Definition Language (BDL) &amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
v. 120606&lt;br /&gt;
&lt;br /&gt;
A data definition language for the BABEL development system.&lt;br /&gt;
&lt;br /&gt;
System Engineering and Automation Department.&lt;br /&gt;
&lt;br /&gt;
University of Málaga, Spain.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What is BDL?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
BDL (Babel Definition Language) is the medium for specifying, in a programming-language independent fashion, some data types that a BABEL module needs. BDL has been implemented as a restricted subset of one of the most extended definition languages: the OMG CORBA IDL (http://www.omg.org).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Where the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
It is used currently for defining input/output parameters of services and for providing public definitions (data types that the module provides to other modules and to itself). You can use BDL types both in the &amp;quot;Public Definitions&amp;quot; of the module and in the specification of the input/output parameters of the services. You can compose your own types (using &amp;quot;typedef&amp;quot;) based on BDL basic or composed types.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What the BDL types are used for?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You can use a variable of a BDL type in the following situations:&lt;br /&gt;
	A) Creating a local variable for the internal use of some logic of the module (auxiliary logic, service logic, start-up logic, etc.).&lt;br /&gt;
	B) Creating a global variable for the internal status of the module (accessible from any logic of the module).&lt;br /&gt;
	C) Using an already defined input/output parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How variables of the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You should remember that BDL is not a programming language (only a specification for data), and thus, you cannot use directly any BDL type in your codification logics. Rather, BABEL translates automatically for you the BDL types into types understandable by the codification language you have chosen for your module (see for example the Using BDL in the C++ codification language section).&lt;br /&gt;
&lt;br /&gt;
= BABEL Definition Language (BDL) =&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Numeric (octet, short, long, ...) === &lt;br /&gt;
&lt;br /&gt;
BDL includes the following basic numeric types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039; : 8-bit, unsigned (0...2^8-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; : 16-bit, signed (-2^15...2^15-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned short&amp;#039;&amp;#039;&amp;#039; : 16-bit, unsigned (0...2^16-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; : 32-bit, signed (-2^31...2^31-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long&amp;#039;&amp;#039;&amp;#039;	: 32-bit, unsigned (0...2^32-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long long&amp;#039;&amp;#039;&amp;#039; (*)	:  64-bit, signed (-2^63...2^63-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long long&amp;#039;&amp;#039;&amp;#039; (*) : 64-bit, unsigned (0...-2^64-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039; : IEEE single-precision floating point numbers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; : IEEE double-precision floating point numbers.&lt;br /&gt;
&lt;br /&gt;
(*): The 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way, so its use should be avoided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alphanumeric (char) === &lt;br /&gt;
&lt;br /&gt;
BDL has only one basic alphanumeric type:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; : One unsigned 8-bits character.&lt;br /&gt;
&lt;br /&gt;
There is also one composed alphanumeric type: string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others (boolean) ===&lt;br /&gt;
	&lt;br /&gt;
BDL includes one basic type for logical operations:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039; : Stores a boolean value (TRUE or FALSE)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed type that does not contain more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Structs&amp;#039;&amp;#039;&amp;#039;: They are analogous to C structs, and can contain both basic and composed types fields. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	short FieldOne;&lt;br /&gt;
	double FieldTwo;&lt;br /&gt;
	OtherStructName osn;&lt;br /&gt;
} MyVarStruct;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;union&amp;#039;&amp;#039;&amp;#039; data type is not supported currently in BDL.&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repeated (sequence, array) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed types that can hold more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sequences&amp;#039;&amp;#039;&amp;#039;: An ordered list of elements of the same type (maybe composed). A maximum limit of elements can be specified, or not. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct LimitedAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;&lt;br /&gt;
	sequence&amp;lt;Account&amp;gt; accounts; // No maximum length of sequence.&lt;br /&gt;
	sequence&amp;lt;Account,50&amp;gt; accountsBis; // 50 is the maximum length of sequence.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Do not use sequences of octects to communicate serialized objects from one module to another: that means that you are forcing any receiver to use the same objects definition and software as you, tying other people to your needs. Use only sequences of octects to pack together data that either has no structure or its structure is common knowledge -no additional libraries needed to handle it-.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Arrays&amp;#039;&amp;#039;&amp;#039;: Fixed-length indexed sets of elements of the same type (maybe composed). For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct SomeAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;  // string of length 10&lt;br /&gt;
	Account accounts[10][2];   // array of dimensions 10x2&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others (enum, string) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes these other composed types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Enumerated&amp;#039;&amp;#039;&amp;#039;: The enumeration of several constants. No numeric equivalence should be assumed. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
enum Currency {pound, dollar, yen, franc};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Strings&amp;#039;&amp;#039;&amp;#039;: Sequences of characters of 8 bits each. They can be given a fixed maximum length. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	string&amp;lt;10&amp;gt;  MyString;   // A string that can store no more than 10 characters&lt;br /&gt;
	string MyString2;   // A string without maximum length&lt;br /&gt;
} MyStructVar;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;typedef&amp;#039;&amp;#039;&amp;#039; keyword has been introduced to define array data types, but it also can be used to define alias for already defined data types.&lt;br /&gt;
&lt;br /&gt;
The syntax is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef &amp;lt; an already defined data type &amp;gt; &amp;lt; an alias for that type &amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long A;&lt;br /&gt;
	string B;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct MyStruct MyAliasForMyStruct;&lt;br /&gt;
typedef unsigned long MyAliasForUnsignedLong;&lt;br /&gt;
&lt;br /&gt;
typedef sequence&amp;lt;short, 50&amp;gt; ShortListType; &lt;br /&gt;
typedef sequence&amp;lt;long&amp;gt; LongListType; &lt;br /&gt;
&lt;br /&gt;
typedef short ShortArrayType[50][10]; &lt;br /&gt;
&lt;br /&gt;
typedef enum MyCurrency {pound, dollar, yen, franc} OtherCurrency;&lt;br /&gt;
&lt;br /&gt;
typedef string&amp;lt;10&amp;gt;  MyStringType;   &lt;br /&gt;
typedef string MyString;   &lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The way of defining constants in BDL is:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const &amp;lt;type&amp;gt; &amp;lt;const name&amp;gt; = &amp;lt;value&amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predefined types ==&lt;br /&gt;
&lt;br /&gt;
A few types are predefined so they can be readily used by any BABEL module. Their translation into the generated source code language follows the same rules as though they were defined by the user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	typedef sequence&amp;lt;string&amp;gt; SeqOfStrings;&lt;br /&gt;
	typedef sequence&amp;lt;octet&amp;gt; SeqOfBytes;&lt;br /&gt;
	typedef sequence&amp;lt;boolean&amp;gt; SeqOfBools;&lt;br /&gt;
	typedef sequence&amp;lt;float&amp;gt; SeqOfFloats;&lt;br /&gt;
	typedef sequence&amp;lt;double&amp;gt; SeqOfDoubles;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;short&amp;gt; SeqOfShorts;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned short&amp;gt; SeqOfUShorts;&lt;br /&gt;
	typedef sequence&amp;lt;long&amp;gt; SeqOfLongs;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned long&amp;gt; SeqOfULongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;unsigned long long&amp;gt; SeqOfULongLongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef double TMatrix22[2][2];&lt;br /&gt;
	typedef double TMatrix33[3][3];&lt;br /&gt;
	typedef double TMatrix44[4][4];&lt;br /&gt;
	typedef double TMatrix66[6][6];	&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=  Using BDL in C++ codification language =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed-length and variable-length data types ==&lt;br /&gt;
&lt;br /&gt;
The implementation and usage of the BDL data types can be different if the data type is fixed-length or variable-length.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed-length data types ===&lt;br /&gt;
&lt;br /&gt;
* octet&lt;br /&gt;
* short&lt;br /&gt;
* unsigned short&lt;br /&gt;
* long&lt;br /&gt;
* unsigned long&lt;br /&gt;
* long long&lt;br /&gt;
* unsigned long long&lt;br /&gt;
* float&lt;br /&gt;
* double&lt;br /&gt;
* char&lt;br /&gt;
* boolean&lt;br /&gt;
* enum&lt;br /&gt;
&lt;br /&gt;
=== Variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
* Bounded and unbounded string&lt;br /&gt;
* Bounded and unbounded sequence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data types that can be fixed-length or variable-length === &lt;br /&gt;
&lt;br /&gt;
* A struct is fixed-length if all its members are fixed-length. It is variable-length if one or more of its members are variable-length.&lt;br /&gt;
* An array is fixed-length if its base type is fixed-length. If its base type is variable-length, then the array is variable-length.&lt;br /&gt;
&lt;br /&gt;
Note: A variable-length array is not an array with a variable number of elements; it is an array with a variable-length element data type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== First consideration: fixed-length and variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
The first issue when BDL types are translated into C++ is that &amp;#039;&amp;#039;&amp;#039;service output parameters&amp;#039;&amp;#039;&amp;#039; are translated as reference (DataType &amp;amp;) for fixed-length data types, but as a reference to a pointer (DataType *&amp;amp;) for variable-length data types. For variable-length data types, there is also the need to manage the allocation and deallocation of its memory (BABEL does not provide code for that). For specific information, see the documentation for each data type under Usage of BDL in C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// All of this is BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct (float and long are fixed-length)&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct (the data member contains a string)&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef long FArrA[8][3]; // A fixed-length array (long is fixed-length)&lt;br /&gt;
typedef FStrA FArrB[8]; // A fixed-length array (FStrA is fixed-length)&lt;br /&gt;
typedef string&amp;lt;10&amp;gt; VArrC[7]; // A variable-length array (a bounded string is variable-length)&lt;br /&gt;
typedef VStrB VArrD[12]; // A variable-length array (VStrB is variable-length)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
All the basic types are mapped to types defined in the portable namespace &amp;quot;BABEL&amp;quot; (this is done indepently on the codification language chosen), with functionalities that are indistinguishable from native C++ types. However, &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; may be mapped to the same native C++ type, so any overloaded function that is overloaded solely on these types should be avoided. Also, the 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way.&lt;br /&gt;
&lt;br /&gt;
=== Translation of basic BDL data types to C++ ===&lt;br /&gt;
&lt;br /&gt;
Numeric:&lt;br /&gt;
&lt;br /&gt;
* octet: BABEL::Octet&lt;br /&gt;
* short: BABEL::Short&lt;br /&gt;
* unsigned short: BABEL::UShort&lt;br /&gt;
* long: BABEL::Long&lt;br /&gt;
* unsigned long: BABEL::ULong&lt;br /&gt;
* long long: BABEL::LongLong&lt;br /&gt;
* unsigned long long: BABEL::ULongLong&lt;br /&gt;
* float: BABEL::Float&lt;br /&gt;
* double: BABEL::Double&lt;br /&gt;
&lt;br /&gt;
Alphanumeric:&lt;br /&gt;
&lt;br /&gt;
* char: BABEL::Char&lt;br /&gt;
&lt;br /&gt;
Others:&lt;br /&gt;
&lt;br /&gt;
* boolean: BABEL::Boolean. &lt;br /&gt;
&lt;br /&gt;
There are two predefined boolean constants:&lt;br /&gt;
- BABEL::True&lt;br /&gt;
- BABEL::False&lt;br /&gt;
&lt;br /&gt;
One can use a BABEL::Boolean variable as a C++ bool type, but it can be defined as another type. You can compare a Boolean value with BABEL::False, but the comparison with BABEL::True should be avoided (use v!=BABEL::False or !v instead of v==BABEL::True).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using basic data types as service parameters === &lt;br /&gt;
&lt;br /&gt;
The basic data types are mapped as BABEL::datatype (as shown above) when used as input parameters in services, and as BABEL::datatype&amp;amp; when used as output. For example, a  service &amp;quot;MyOp&amp;quot; with the input parameters &amp;quot;char ch&amp;quot; and &amp;quot;long lg&amp;quot; and the output parameters &amp;quot;boolean bl&amp;quot; and &amp;quot;float fl&amp;quot; can be considered as though it was translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void &amp;lt;some class not interesting for the user&amp;gt;::MyOp(BABEL::Char ch, BABEL::Long lg, BABEL::Boolean&amp;amp; bl, BABEL::Float&amp;amp; fl);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the data type is passed by value, the caller can use for it a local variable, constant, or expression.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the data type, so the caller must use a variable (defined in the caller) of the corresponding translated data type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed Types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
The struct data type is mapped to a C++ struct with equivalent members.&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	BABEL::Float f;&lt;br /&gt;
	BABEL::Long c;&lt;br /&gt;
}; // Full name: BABEL::MyModule::FStrA&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct (because of the string member)&lt;br /&gt;
	/* string manager class */ name; // the class name is not defined and should not be used&lt;br /&gt;
	BABEL::UShort age;&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrB&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	BABEL::Long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrC&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct can be dynamically allocated and deallocated using C++ new and delete operators. If the struct contains any strings (directly or inside another contained data type) then, the strings will be initialized to &amp;quot;&amp;quot; instead of NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deep copy of struct variables&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	When you use the assignment operator (=), the struct is deep copied. Any allocated memory will be duplicated, so one can change a copied or original struct without changing the other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length struct data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct is variable-length if it contains strings or sequences (directly as a member or recursively). If it does not, the struct is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
	One must know if a struct is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The struct will be sent as const MyStructDataType&amp;amp;, so the caller needs a variable of that struct to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	Since the input struct is const MyStructDataType&amp;amp;, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp; so the caller needs a variable of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp;. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. The callee can set the parameter&amp;#039;s value assigning another struct of the same type or by setting all of its members. Please, see the documentation of the data type (string, sequence, others...) to know how to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned struct. The caller must free the memory when the struct is not needed (using the C++ delete operator). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The callee must allocate a new struct using the C++ operator new, change any member as needed, and store the pointer to the allocated struct in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous struct will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
=== Repeated: sequence ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;please read the note on sequences in their definition within the BDL language.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequences are mapped to C++ classes.&lt;br /&gt;
&lt;br /&gt;
Examples: See array operators and the get_buffer functions for examples of the sequence usage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To dynamically allocate and deallocate a sequence, one can use the new and delete C++ operators. The buffer used by the sequence is managed automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequence will be sent as const MySequenceDataType&amp;amp;, so the caller needs a variable of that sequence to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the sequence is const MySequenceDataType&amp;amp;, the callee cannot change it. Note that the sequence could be empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned sequence. The caller must free the memory when the array is not needed, using the C++ delete operator. The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The callee must allocate a new sequence using the C++ new operator. After the allocation, change the content as needed, and store the pointer to the allocated sequence in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous sequence will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
Warning: The callee can return a empty sequence, but not a NULL pointer (assigning a NULL pointer to the output parameter is not valid).&lt;br /&gt;
&lt;br /&gt;
Using the output parameter:&lt;br /&gt;
&lt;br /&gt;
	After assigning a pointer to the output parameter, the callee can use the pointed sequence as usual, but one must remember that the parameter is a pointer, not a sequence. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
out_seq = new BABEL::MyModule::MyStringSequenceDataType();&lt;br /&gt;
out_seq-&amp;gt;length(1); // use -&amp;gt; instead of .&lt;br /&gt;
(*out_seq)[0] = BABEL::string_dup(&amp;quot;my string&amp;quot;); // use (*out_seq)[index] instead of out_seq[index]&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Repeated: array ===&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef float MyLongA[8];&lt;br /&gt;
typedef string MyStrA[4][12];&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Float MyLongA[8];&lt;br /&gt;
typedef BABEL::Float MyLongA_slice;&lt;br /&gt;
typedef /* string manager class */ MyStrA[4][12];&lt;br /&gt;
typedef /* string manager class */ MyStrA_slice[12];&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::MyLongA)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; The T_slice data type &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The T_slice data type (e.g.: MyLongA_slice, MyStrA_slice) has the same element type and the same dimensions as the original except the first one. T_slice can be used to declare pointers to an array, since C++ declares array pointers as pointers to the first element of.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA a; // an array of MyLongA type&lt;br /&gt;
BABEL::MyModule::MyLongA_slice* ptr = a; // a pointer to an array of MyLongA type&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning:&lt;br /&gt;
	&lt;br /&gt;
The T_slice data type for arrays with different first dimension lengths is the same. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef long A[16][8][2];&lt;br /&gt;
typedef long B[4][8][2];&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Long A[16][8][2];&lt;br /&gt;
typedef BABEL::Long A_slice[8][2];&lt;br /&gt;
typedef BABEL::Long B[4][8][2];&lt;br /&gt;
typedef BABEL::Long B_slice[8][2]; // the same data type as A_slice&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::A)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That means that a pointer to A (A_slice*) is compatible with a pointer to B (B_slice*), and the user could use a pointer of one of them as if it were a pointer to the other. That is a grave error (usually leads to core dump), but the C++ compiler will compile the code without issuing a warning message.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Static allocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A statically allocated array can be created by using its data type name, as any C++ data type. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA v1;&lt;br /&gt;
BABEL::MyModule::MyStrA v2;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. When the variable goes out of scope (e.g.: the function that declares it ends) all used memory is freed (strings, sequences, arrays, ...).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Dynamic allocation and deallocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	To dynamically allocate and deallocate an array, one cannot use the new and delete operators or its array versions (new T[] and delete[] ptr). To allocate an array, use the T_alloc function (e.g.: BABEL::MyModule::MyLongA_alloc(), BABEL::MyModule::MyStrA_alloc()). If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. To deallocate an array, use T_free (e.g.: BABEL::MyModule::MyLongA_free(), BABEL::MyModule::MyStrA_free()).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_alloc()&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a T array and returns a pointer to it or NULL if there is not enough memory. Note that the user must free the array when it is not needed anymore. To free the array, use the T_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_free(T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a T array allocated by T_alloc() or T_dup() (see &amp;quot;Copy and duplication&amp;quot;). p is the array to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Copy and duplication &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_copy(T_slice* to, const T_slice* from)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copies the contents of the from array to the to array. If from or to or both are NULL, the function does nothing. The parameters can be statically or dynamically allocated (or one of each kind). An example of this function could be BABEL::MyModule::MyLongA_copy().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_dup(const T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a new array of the T type, copies the contents of the p array into it and then returns a pointer to it. The caller must free the array using T_free() described in &amp;quot;Dynamic allocation and deallocation&amp;quot;. If there is not enough memory or if p is NULL, the returned pointer will be NULL. An example of this function could be BABEL::MyModule::MyLongA_dup()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Array usage &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The BDL arrays can be used as C++ arrays except for:&lt;br /&gt;
&lt;br /&gt;
* Dynamic allocation and deallocation must be done using T_alloc() and T_free().&lt;br /&gt;
* The arrays can be copied or duplicated using T_copy() and T_dup().&lt;br /&gt;
* The usage of the elements stored in the array must follow the element data type usage.&lt;br /&gt;
* Any embedded string is initialized to &amp;quot;&amp;quot; (instead of NULL or no initialization at all).&lt;br /&gt;
&lt;br /&gt;
The [ ] operator can be used as usual with BDL arrays.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long value;&lt;br /&gt;
	string name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef MyStruct MyArray[8][2];&lt;br /&gt;
// MyArray is variable-length because of the string member &amp;quot;name&amp;quot; of its element data type&lt;br /&gt;
&lt;br /&gt;
// C++&lt;br /&gt;
int i;&lt;br /&gt;
BABEL::MyModule::MyArray a; // a statically allocated array&lt;br /&gt;
&lt;br /&gt;
a[2][1].name = BABEL::string_dup(&amp;quot;this member will not be an empty string&amp;quot;);&lt;br /&gt;
for(i=0; i&amp;lt;8; i++) a[i][0].value=a[i][1].value=i;&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_slice* b; // a dynamically allocated array&lt;br /&gt;
BABEL::MyModule::MyArray_slice* c; // another dynamically allocated array&lt;br /&gt;
&lt;br /&gt;
b = BABEL::MyModule::MyArray_alloc(); // dynamically allocates the array&lt;br /&gt;
BABEL::MyModule::MyArray_copy(b,a); // copy a into b (b=a)&lt;br /&gt;
c = BABEL::MyModule::MyArray_dup(b); // dynamically allocates an array and copies the contents of b&lt;br /&gt;
c[2][1].name = BABEL::string_dup(&amp;quot;c&amp;quot;); // a and b will not be changed&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_free(b); // dynamically frees the b array&lt;br /&gt;
BABEL::MyModule::MyArray_free(c); // dynamically frees the c array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length array data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
An array is variable-length if its element data type is variable-length (contains strings or sequences, directly or recursively). If it does not, the array is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
One must know if an array is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; An array as an input (in) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The array will be sent as const MyArrayDataType, so the caller needs a variable of that array to use it as an input parameter of a service. Note that for C++, the const MyArrayDataType is equivalent to const MyArrayDataType_slice*.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;An array as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the array is const MyArrayDataType, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The caller needs a (dynamically/statically) allocated array of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee, and the caller keeps the ownership (must free the array when not needed). Note that the fixed-length array is allocated by the caller, not by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A fixed-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. Please, see the documentation of the element data type (string, sequence, others...) to know how to do the assignment. Note that the array was allocated by the caller, and the callee cannot reallocate it (the callee does not have a reference to the array pointer).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned array. The caller must free the memory when the array is not needed, using T_free() (e.g.: MyArrayDataType_free()). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be a class that behaves as a MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The callee must allocate a new array using T_alloc() (e.g.: BABEL::MyModule::MyArrayDataType_alloc()). After the allocation, change the content as needed, and store the pointer to the allocated array in the output parameter. The initial value of the output parameter is undefined and must not be used or freed.&lt;br /&gt;
&lt;br /&gt;
Warning: The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous array will not be freed. If you do not assign any pointer to it (or if you assign the  NULL pointer), the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using T_free() and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Usage of the variable-length array output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After assigning a pointer to the output parameter, the callee can use the pointed array, but there are some rules. You can retrieve the stored pointer (a MyArrayDataType_slice*) using the method ptr() of the output parameter class. For example (the BABEL module is called &amp;quot;MyModule&amp;quot;, and the variable-length array output parameter is &amp;quot;arr_out&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// Allocate the array and assign it to the output parameter:&lt;br /&gt;
arr_out = BABEL::MyModule::arr_alloc(); &lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 1):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out.ptr(); // gets the pointer stored in arr_out&lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 2):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out; // gets the pointer without using ptr()  &lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Access to array elements:&lt;br /&gt;
arr_out.ptr()[4][8] = arr_out.ptr()[1][2] + arr_out.ptr()[3][7]; // Ok&lt;br /&gt;
&lt;br /&gt;
// This is not valid:&lt;br /&gt;
arr_out[4][8] = arr_out[1][2] + arr_out[3][7]; // Error: use ptr()&lt;br /&gt;
(*arr_out)[4][8] = (*arr_out)[1][2] + (*arr_out)[3][7]; // Error: use ptr()&lt;br /&gt;
	&lt;br /&gt;
// Recommended usage:&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = BABEL::MyModule::arr_alloc(); // allocates the array in a temporal variable.&lt;br /&gt;
// One can duplicate an array instead of allocating a default initialized one.&lt;br /&gt;
arr_out = arr_ptr; // arr_out and arr_ptr points to the same array (the one to be returned)&lt;br /&gt;
arr_ptr[1][2] = arr_ptr[3][3] + arr_ptr[4][4]; // use the temporal variable to do any changes to the array&lt;br /&gt;
// When the function ends, arr_ptr returns the array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others: enum ===&lt;br /&gt;
&lt;br /&gt;
The enum data type is mapped directly to a C++ enum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
enum MyEnum {one, two, three};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
enum MyEnum {one, two, three}; // the full name for using it will be: BABEL::MyModule::MyEnum&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using enum as service parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The enum data types are mapped as datatype (shown above) when used as input parameters in services, and as datatype&amp;amp; when used as output. For example, a service &amp;quot;MyOp&amp;quot; with an input and output parameters (a_in and b_out) of the enumerated &amp;quot;MyEnum&amp;quot; can be considered as though it is translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class uninteresting for the user&amp;gt;::MyOp(BABEL::MyModule::MyEnum a_in, BABEL::MyModule::MyEnum&amp;amp; b_out);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the enum is passed by value, the caller can use a variable or a constant enumerator (an enumerated value) of the same translated type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter as expected, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the enumerated type, so the caller must use a variable of the translated enumerated type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others: string ===&lt;br /&gt;
&lt;br /&gt;
Strings of BDL are translated into (possibly &amp;#039;&amp;#039;&amp;#039;const&amp;#039;&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;char *&amp;#039;&amp;#039;&amp;#039; of C++ if they appear directly as types of some input/output parameter of a service. They can be also defined as variables in the logic of some service in this way: &amp;#039;&amp;#039;&amp;#039;BABEL::String str;&amp;#039;&amp;#039;&amp;#039;. In both cases, the helper functions described below apply. &lt;br /&gt;
&lt;br /&gt;
However, when a BDL string type appears as the type of a field of a composed public type of a module, it is not translated into a &amp;#039;&amp;#039;&amp;#039;BABEL::String&amp;#039;&amp;#039;&amp;#039; type. In that case, it is translated into a special object that can use &amp;#039;&amp;#039;&amp;#039;BABEL::string_dup&amp;#039;&amp;#039;&amp;#039; for assignment, but it &amp;#039;&amp;#039;&amp;#039;cannot&amp;#039;&amp;#039;&amp;#039; use &amp;#039;&amp;#039;&amp;#039;BABEL::string_free&amp;#039;&amp;#039;&amp;#039; for deletion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Helper functions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_alloc(BABEL::ULong len)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allocates space for a string. The allocated size will be len+1 (so the allocated buffer has enough space for the trailing 0). Return: The allocated buffer or NULL if there is not enough memory. Note that the user must free the buffer when it is not needed anymore (or assigned to an object that do so). To free the buffer, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_dup(const char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Duplicates a string. c is the string to be duplicated. The return value is the duplicated string or NULL if there is not enough memory. If c is NULL, the return value will be NULL. The allocated size will be strlen(c)+1 using BABEL::string_alloc(strlen(c)). Note that the user must free the string when it is not needed anymore (or assigned to an object that do so). To free the string, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void BABEL::string_free(char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a string allocated by BABEL::string_alloc() or BABEL::string_dup(). c is the string to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use a const char* or a char*  (will be treated as a const char*) for passing a string (an embedded string is also valid). Passing a NULL pointer is not allowed and the outcome is undefined. The caller keeps the string ownership.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use the parameter as a const char* (it should not be NULL).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Use a char* variable as parameter (the parameter is a class that behaves as a char*&amp;amp;). The variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter. The returned value can be &amp;quot;&amp;quot; but never NULL. When you do not need the returned string anymore, you must delete it using BABEL::string_free() as described earlier (do not use delete/delete[] to free it). &lt;br /&gt;
&lt;br /&gt;
Also, you can pass as output parameter a string which is part of a composed type. In that case the current string will be automatically freed. For example, if you have a service &amp;quot;MyOp&amp;quot; with an output parameter &amp;quot;string s&amp;quot;, you can pass as that parameter the following: &amp;quot;MyStruct.stringfield&amp;quot;, provided that MyStruct is a variable of some struct type that contains a field (&amp;quot;stringfield&amp;quot;) of type string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter will be a class that behaves as a char*&amp;amp;. The callee must do the assignment to a string output parameter once and only once. If you do it more than once, the previous string will not be freed. If you do not assign any string to it, the parameter value will be undefined and that is an error. However, the following is valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class that is not interesting for the user&amp;gt;::MyOperation(/*out string parameter data type*/ str)&lt;br /&gt;
	{&lt;br /&gt;
		str = BABEL::string_dup(&amp;quot;Unknown&amp;quot;);&lt;br /&gt;
		if(/*...*/) {&lt;br /&gt;
			BABEL::string_free(str); // free the previous string&lt;br /&gt;
			str = BABEL::string_dup(&amp;quot;Ok&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: An output string parameter does not behaves as an embedded string. As stated before, each assignment overwrites the previous string without freeing it.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
When assigning a char* value to an output string parameter, the parameter will own that pointer without making a duplicate of the string, so that string should be created through BABEL::string_dup() or BABEL::string_alloc(), because it will be eventually freed using BABEL::string_free() (if it was created by new or anything else, a typecast to const char* is needed).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a const char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you assign a value using a const char*, the string will be duplicated with BABEL::string_dup(). Please, note that some compilers (non ANSI/ISO C++ compliant) treats literal strings as char*, not as const char*, so it is preferred to use str = (const char*)&amp;quot;literal string&amp;quot; or str = BABEL::string_dup(&amp;quot;literal string&amp;quot;) instead of str = &amp;quot;literal string&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning an embedded string:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The direct assignment of an embedded string to an output string parameter is not allowed. Please, use string_dup() to do the assignment. E.g: out_str_arg = BABEL::string_dup(my_struct.my_embedded_str).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using the output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After a string is assigned to the output parameter, you can use the parameter as a char*. The [ ] operator is available for read and write, but one sould take care not to use an index out of the string allocated buffer. The string can be modified and shortened but not enlarged. To enlarge a string you must allocate a larger buffer using BABEL::string_alloc(). If you assign a new buffer to the output parameter, remember to free the previous one using BABEL::string_free().&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// This service has an input string parameter, str_in, and an output string parameter, str_out.&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::Echo(const char* str_in, /* the string output class */ str_out) &lt;br /&gt;
{&lt;br /&gt;
	str_out = BABEL::string_dup(str_in); // duplicates str_in and returns the copy in str_out&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = str_in; // duplicates str_in and returns the copy in str_out (the same as above)&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = &amp;quot;str&amp;quot;; // duplicates &amp;quot;str&amp;quot; and returns the copy in str_out. However, str_out = (const char*)&amp;quot;str&amp;quot; is preferred.&lt;br /&gt;
&lt;br /&gt;
	//str_out = new char[1]; str_out[0]=0; // thar is an error: the string must be allocated using string_dup() or string_alloc().&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::GetName(const MyContactStruct&amp;amp; contact_in, /* the string output class */ name_out)&lt;br /&gt;
{&lt;br /&gt;
	name_out = BABEL::string_dup(contact_in.name); // copies contact_in.name and returns the copy in name_out&lt;br /&gt;
	//name_out = contact_in.name; // that is an error (*)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(*): contact_in.name is an embedded string. This assignment is not allowed. The user must use the prior line to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
An alias for a data type created by the BDL typedef keyword behaves as the original data type. For example, an alias for an array should be treated as if that alias was an original array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The BDL constants are mapped to equivalent C++ constants. To use a constant one must add BABEL::MyModule:: before the name of the constant (&amp;quot;MyModule&amp;quot; is the name of the BABEL module). Thus, the constant PI should be referenced in C++ as BABEL::MyModule::PI.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
static const BABEL::Float PI=3.14159265;&lt;br /&gt;
static const BABEL::Char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
static const char* LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=693</id>
		<title>Documentation:BDL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=693"/>
		<updated>2011-02-16T14:01:47Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Repeated: sequence */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;BABEL Definition Language (BDL) &amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
v. 120606&lt;br /&gt;
&lt;br /&gt;
A data definition language for the BABEL development system.&lt;br /&gt;
&lt;br /&gt;
System Engineering and Automation Department.&lt;br /&gt;
&lt;br /&gt;
University of Málaga, Spain.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What is BDL?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
BDL (Babel Definition Language) is the medium for specifying, in a programming-language independent fashion, some data types that a BABEL module needs. BDL has been implemented as a restricted subset of one of the most extended definition languages: the OMG CORBA IDL (http://www.omg.org).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Where the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
It is used currently for defining input/output parameters of services and for providing public definitions (data types that the module provides to other modules and to itself). You can use BDL types both in the &amp;quot;Public Definitions&amp;quot; of the module and in the specification of the input/output parameters of the services. You can compose your own types (using &amp;quot;typedef&amp;quot;) based on BDL basic or composed types.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What the BDL types are used for?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You can use a variable of a BDL type in the following situations:&lt;br /&gt;
	A) Creating a local variable for the internal use of some logic of the module (auxiliary logic, service logic, start-up logic, etc.).&lt;br /&gt;
	B) Creating a global variable for the internal status of the module (accessible from any logic of the module).&lt;br /&gt;
	C) Using an already defined input/output parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How variables of the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You should remember that BDL is not a programming language (only a specification for data), and thus, you cannot use directly any BDL type in your codification logics. Rather, BABEL translates automatically for you the BDL types into types understandable by the codification language you have chosen for your module (see for example the Using BDL in the C++ codification language section).&lt;br /&gt;
&lt;br /&gt;
= BABEL Definition Language (BDL) =&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Numeric (octet, short, long, ...) === &lt;br /&gt;
&lt;br /&gt;
BDL includes the following basic numeric types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039; : 8-bit, unsigned (0...2^8-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; : 16-bit, signed (-2^15...2^15-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned short&amp;#039;&amp;#039;&amp;#039; : 16-bit, unsigned (0...2^16-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; : 32-bit, signed (-2^31...2^31-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long&amp;#039;&amp;#039;&amp;#039;	: 32-bit, unsigned (0...2^32-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long long&amp;#039;&amp;#039;&amp;#039; (*)	:  64-bit, signed (-2^63...2^63-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long long&amp;#039;&amp;#039;&amp;#039; (*) : 64-bit, unsigned (0...-2^64-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039; : IEEE single-precision floating point numbers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; : IEEE double-precision floating point numbers.&lt;br /&gt;
&lt;br /&gt;
(*): The 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way, so its use should be avoided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alphanumeric (char) === &lt;br /&gt;
&lt;br /&gt;
BDL has only one basic alphanumeric type:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; : One unsigned 8-bits character.&lt;br /&gt;
&lt;br /&gt;
There is also one composed alphanumeric type: string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others (boolean) ===&lt;br /&gt;
	&lt;br /&gt;
BDL includes one basic type for logical operations:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039; : Stores a boolean value (TRUE or FALSE)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed type that does not contain more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Structs&amp;#039;&amp;#039;&amp;#039;: They are analogous to C structs, and can contain both basic and composed types fields. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	short FieldOne;&lt;br /&gt;
	double FieldTwo;&lt;br /&gt;
	OtherStructName osn;&lt;br /&gt;
} MyVarStruct;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;union&amp;#039;&amp;#039;&amp;#039; data type is not supported currently in BDL.&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repeated (sequence, array) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed types that can hold more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sequences&amp;#039;&amp;#039;&amp;#039;: An ordered list of elements of the same type (maybe composed). A maximum limit of elements can be specified, or not. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct LimitedAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;&lt;br /&gt;
	sequence&amp;lt;Account&amp;gt; accounts; // No maximum length of sequence.&lt;br /&gt;
	sequence&amp;lt;Account,50&amp;gt; accountsBis; // 50 is the maximum length of sequence.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Do not use sequences of octects to communicate serialized objects from one module to another: that means that you are forcing any receiver to use the same objects definition, tying them to your needs. Use only sequences of octects to pack together data that either has no structure or its structure is common knowledge -no additional libraries needed to handle it-.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Arrays&amp;#039;&amp;#039;&amp;#039;: Fixed-length indexed sets of elements of the same type (maybe composed). For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct SomeAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;  // string of length 10&lt;br /&gt;
	Account accounts[10][2];   // array of dimensions 10x2&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others (enum, string) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes these other composed types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Enumerated&amp;#039;&amp;#039;&amp;#039;: The enumeration of several constants. No numeric equivalence should be assumed. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
enum Currency {pound, dollar, yen, franc};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Strings&amp;#039;&amp;#039;&amp;#039;: Sequences of characters of 8 bits each. They can be given a fixed maximum length. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	string&amp;lt;10&amp;gt;  MyString;   // A string that can store no more than 10 characters&lt;br /&gt;
	string MyString2;   // A string without maximum length&lt;br /&gt;
} MyStructVar;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;typedef&amp;#039;&amp;#039;&amp;#039; keyword has been introduced to define array data types, but it also can be used to define alias for already defined data types.&lt;br /&gt;
&lt;br /&gt;
The syntax is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef &amp;lt; an already defined data type &amp;gt; &amp;lt; an alias for that type &amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long A;&lt;br /&gt;
	string B;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct MyStruct MyAliasForMyStruct;&lt;br /&gt;
typedef unsigned long MyAliasForUnsignedLong;&lt;br /&gt;
&lt;br /&gt;
typedef sequence&amp;lt;short, 50&amp;gt; ShortListType; &lt;br /&gt;
typedef sequence&amp;lt;long&amp;gt; LongListType; &lt;br /&gt;
&lt;br /&gt;
typedef short ShortArrayType[50][10]; &lt;br /&gt;
&lt;br /&gt;
typedef enum MyCurrency {pound, dollar, yen, franc} OtherCurrency;&lt;br /&gt;
&lt;br /&gt;
typedef string&amp;lt;10&amp;gt;  MyStringType;   &lt;br /&gt;
typedef string MyString;   &lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The way of defining constants in BDL is:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const &amp;lt;type&amp;gt; &amp;lt;const name&amp;gt; = &amp;lt;value&amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predefined types ==&lt;br /&gt;
&lt;br /&gt;
A few types are predefined so they can be readily used by any BABEL module. Their translation into the generated source code language follows the same rules as though they were defined by the user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	typedef sequence&amp;lt;string&amp;gt; SeqOfStrings;&lt;br /&gt;
	typedef sequence&amp;lt;octet&amp;gt; SeqOfBytes;&lt;br /&gt;
	typedef sequence&amp;lt;boolean&amp;gt; SeqOfBools;&lt;br /&gt;
	typedef sequence&amp;lt;float&amp;gt; SeqOfFloats;&lt;br /&gt;
	typedef sequence&amp;lt;double&amp;gt; SeqOfDoubles;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;short&amp;gt; SeqOfShorts;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned short&amp;gt; SeqOfUShorts;&lt;br /&gt;
	typedef sequence&amp;lt;long&amp;gt; SeqOfLongs;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned long&amp;gt; SeqOfULongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;unsigned long long&amp;gt; SeqOfULongLongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef double TMatrix22[2][2];&lt;br /&gt;
	typedef double TMatrix33[3][3];&lt;br /&gt;
	typedef double TMatrix44[4][4];&lt;br /&gt;
	typedef double TMatrix66[6][6];	&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=  Using BDL in C++ codification language =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed-length and variable-length data types ==&lt;br /&gt;
&lt;br /&gt;
The implementation and usage of the BDL data types can be different if the data type is fixed-length or variable-length.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed-length data types ===&lt;br /&gt;
&lt;br /&gt;
* octet&lt;br /&gt;
* short&lt;br /&gt;
* unsigned short&lt;br /&gt;
* long&lt;br /&gt;
* unsigned long&lt;br /&gt;
* long long&lt;br /&gt;
* unsigned long long&lt;br /&gt;
* float&lt;br /&gt;
* double&lt;br /&gt;
* char&lt;br /&gt;
* boolean&lt;br /&gt;
* enum&lt;br /&gt;
&lt;br /&gt;
=== Variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
* Bounded and unbounded string&lt;br /&gt;
* Bounded and unbounded sequence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data types that can be fixed-length or variable-length === &lt;br /&gt;
&lt;br /&gt;
* A struct is fixed-length if all its members are fixed-length. It is variable-length if one or more of its members are variable-length.&lt;br /&gt;
* An array is fixed-length if its base type is fixed-length. If its base type is variable-length, then the array is variable-length.&lt;br /&gt;
&lt;br /&gt;
Note: A variable-length array is not an array with a variable number of elements; it is an array with a variable-length element data type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== First consideration: fixed-length and variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
The first issue when BDL types are translated into C++ is that &amp;#039;&amp;#039;&amp;#039;service output parameters&amp;#039;&amp;#039;&amp;#039; are translated as reference (DataType &amp;amp;) for fixed-length data types, but as a reference to a pointer (DataType *&amp;amp;) for variable-length data types. For variable-length data types, there is also the need to manage the allocation and deallocation of its memory (BABEL does not provide code for that). For specific information, see the documentation for each data type under Usage of BDL in C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// All of this is BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct (float and long are fixed-length)&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct (the data member contains a string)&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef long FArrA[8][3]; // A fixed-length array (long is fixed-length)&lt;br /&gt;
typedef FStrA FArrB[8]; // A fixed-length array (FStrA is fixed-length)&lt;br /&gt;
typedef string&amp;lt;10&amp;gt; VArrC[7]; // A variable-length array (a bounded string is variable-length)&lt;br /&gt;
typedef VStrB VArrD[12]; // A variable-length array (VStrB is variable-length)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
All the basic types are mapped to types defined in the portable namespace &amp;quot;BABEL&amp;quot; (this is done indepently on the codification language chosen), with functionalities that are indistinguishable from native C++ types. However, &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; may be mapped to the same native C++ type, so any overloaded function that is overloaded solely on these types should be avoided. Also, the 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way.&lt;br /&gt;
&lt;br /&gt;
=== Translation of basic BDL data types to C++ ===&lt;br /&gt;
&lt;br /&gt;
Numeric:&lt;br /&gt;
&lt;br /&gt;
* octet: BABEL::Octet&lt;br /&gt;
* short: BABEL::Short&lt;br /&gt;
* unsigned short: BABEL::UShort&lt;br /&gt;
* long: BABEL::Long&lt;br /&gt;
* unsigned long: BABEL::ULong&lt;br /&gt;
* long long: BABEL::LongLong&lt;br /&gt;
* unsigned long long: BABEL::ULongLong&lt;br /&gt;
* float: BABEL::Float&lt;br /&gt;
* double: BABEL::Double&lt;br /&gt;
&lt;br /&gt;
Alphanumeric:&lt;br /&gt;
&lt;br /&gt;
* char: BABEL::Char&lt;br /&gt;
&lt;br /&gt;
Others:&lt;br /&gt;
&lt;br /&gt;
* boolean: BABEL::Boolean. &lt;br /&gt;
&lt;br /&gt;
There are two predefined boolean constants:&lt;br /&gt;
- BABEL::True&lt;br /&gt;
- BABEL::False&lt;br /&gt;
&lt;br /&gt;
One can use a BABEL::Boolean variable as a C++ bool type, but it can be defined as another type. You can compare a Boolean value with BABEL::False, but the comparison with BABEL::True should be avoided (use v!=BABEL::False or !v instead of v==BABEL::True).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using basic data types as service parameters === &lt;br /&gt;
&lt;br /&gt;
The basic data types are mapped as BABEL::datatype (as shown above) when used as input parameters in services, and as BABEL::datatype&amp;amp; when used as output. For example, a  service &amp;quot;MyOp&amp;quot; with the input parameters &amp;quot;char ch&amp;quot; and &amp;quot;long lg&amp;quot; and the output parameters &amp;quot;boolean bl&amp;quot; and &amp;quot;float fl&amp;quot; can be considered as though it was translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void &amp;lt;some class not interesting for the user&amp;gt;::MyOp(BABEL::Char ch, BABEL::Long lg, BABEL::Boolean&amp;amp; bl, BABEL::Float&amp;amp; fl);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the data type is passed by value, the caller can use for it a local variable, constant, or expression.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the data type, so the caller must use a variable (defined in the caller) of the corresponding translated data type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed Types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
The struct data type is mapped to a C++ struct with equivalent members.&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	BABEL::Float f;&lt;br /&gt;
	BABEL::Long c;&lt;br /&gt;
}; // Full name: BABEL::MyModule::FStrA&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct (because of the string member)&lt;br /&gt;
	/* string manager class */ name; // the class name is not defined and should not be used&lt;br /&gt;
	BABEL::UShort age;&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrB&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	BABEL::Long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrC&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct can be dynamically allocated and deallocated using C++ new and delete operators. If the struct contains any strings (directly or inside another contained data type) then, the strings will be initialized to &amp;quot;&amp;quot; instead of NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deep copy of struct variables&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	When you use the assignment operator (=), the struct is deep copied. Any allocated memory will be duplicated, so one can change a copied or original struct without changing the other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length struct data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct is variable-length if it contains strings or sequences (directly as a member or recursively). If it does not, the struct is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
	One must know if a struct is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The struct will be sent as const MyStructDataType&amp;amp;, so the caller needs a variable of that struct to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	Since the input struct is const MyStructDataType&amp;amp;, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp; so the caller needs a variable of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp;. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. The callee can set the parameter&amp;#039;s value assigning another struct of the same type or by setting all of its members. Please, see the documentation of the data type (string, sequence, others...) to know how to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned struct. The caller must free the memory when the struct is not needed (using the C++ delete operator). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The callee must allocate a new struct using the C++ operator new, change any member as needed, and store the pointer to the allocated struct in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous struct will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
=== Repeated: sequence ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;please read the note on sequences in their definition within the BDL language.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequences are mapped to C++ classes.&lt;br /&gt;
&lt;br /&gt;
Examples: See array operators and the get_buffer functions for examples of the sequence usage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To dynamically allocate and deallocate a sequence, one can use the new and delete C++ operators. The buffer used by the sequence is managed automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequence will be sent as const MySequenceDataType&amp;amp;, so the caller needs a variable of that sequence to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the sequence is const MySequenceDataType&amp;amp;, the callee cannot change it. Note that the sequence could be empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned sequence. The caller must free the memory when the array is not needed, using the C++ delete operator. The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The callee must allocate a new sequence using the C++ new operator. After the allocation, change the content as needed, and store the pointer to the allocated sequence in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous sequence will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
Warning: The callee can return a empty sequence, but not a NULL pointer (assigning a NULL pointer to the output parameter is not valid).&lt;br /&gt;
&lt;br /&gt;
Using the output parameter:&lt;br /&gt;
&lt;br /&gt;
	After assigning a pointer to the output parameter, the callee can use the pointed sequence as usual, but one must remember that the parameter is a pointer, not a sequence. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
out_seq = new BABEL::MyModule::MyStringSequenceDataType();&lt;br /&gt;
out_seq-&amp;gt;length(1); // use -&amp;gt; instead of .&lt;br /&gt;
(*out_seq)[0] = BABEL::string_dup(&amp;quot;my string&amp;quot;); // use (*out_seq)[index] instead of out_seq[index]&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Repeated: array ===&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef float MyLongA[8];&lt;br /&gt;
typedef string MyStrA[4][12];&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Float MyLongA[8];&lt;br /&gt;
typedef BABEL::Float MyLongA_slice;&lt;br /&gt;
typedef /* string manager class */ MyStrA[4][12];&lt;br /&gt;
typedef /* string manager class */ MyStrA_slice[12];&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::MyLongA)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; The T_slice data type &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The T_slice data type (e.g.: MyLongA_slice, MyStrA_slice) has the same element type and the same dimensions as the original except the first one. T_slice can be used to declare pointers to an array, since C++ declares array pointers as pointers to the first element of.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA a; // an array of MyLongA type&lt;br /&gt;
BABEL::MyModule::MyLongA_slice* ptr = a; // a pointer to an array of MyLongA type&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning:&lt;br /&gt;
	&lt;br /&gt;
The T_slice data type for arrays with different first dimension lengths is the same. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef long A[16][8][2];&lt;br /&gt;
typedef long B[4][8][2];&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Long A[16][8][2];&lt;br /&gt;
typedef BABEL::Long A_slice[8][2];&lt;br /&gt;
typedef BABEL::Long B[4][8][2];&lt;br /&gt;
typedef BABEL::Long B_slice[8][2]; // the same data type as A_slice&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::A)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That means that a pointer to A (A_slice*) is compatible with a pointer to B (B_slice*), and the user could use a pointer of one of them as if it were a pointer to the other. That is a grave error (usually leads to core dump), but the C++ compiler will compile the code without issuing a warning message.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Static allocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A statically allocated array can be created by using its data type name, as any C++ data type. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA v1;&lt;br /&gt;
BABEL::MyModule::MyStrA v2;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. When the variable goes out of scope (e.g.: the function that declares it ends) all used memory is freed (strings, sequences, arrays, ...).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Dynamic allocation and deallocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	To dynamically allocate and deallocate an array, one cannot use the new and delete operators or its array versions (new T[] and delete[] ptr). To allocate an array, use the T_alloc function (e.g.: BABEL::MyModule::MyLongA_alloc(), BABEL::MyModule::MyStrA_alloc()). If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. To deallocate an array, use T_free (e.g.: BABEL::MyModule::MyLongA_free(), BABEL::MyModule::MyStrA_free()).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_alloc()&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a T array and returns a pointer to it or NULL if there is not enough memory. Note that the user must free the array when it is not needed anymore. To free the array, use the T_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_free(T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a T array allocated by T_alloc() or T_dup() (see &amp;quot;Copy and duplication&amp;quot;). p is the array to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Copy and duplication &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_copy(T_slice* to, const T_slice* from)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copies the contents of the from array to the to array. If from or to or both are NULL, the function does nothing. The parameters can be statically or dynamically allocated (or one of each kind). An example of this function could be BABEL::MyModule::MyLongA_copy().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_dup(const T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a new array of the T type, copies the contents of the p array into it and then returns a pointer to it. The caller must free the array using T_free() described in &amp;quot;Dynamic allocation and deallocation&amp;quot;. If there is not enough memory or if p is NULL, the returned pointer will be NULL. An example of this function could be BABEL::MyModule::MyLongA_dup()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Array usage &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The BDL arrays can be used as C++ arrays except for:&lt;br /&gt;
&lt;br /&gt;
* Dynamic allocation and deallocation must be done using T_alloc() and T_free().&lt;br /&gt;
* The arrays can be copied or duplicated using T_copy() and T_dup().&lt;br /&gt;
* The usage of the elements stored in the array must follow the element data type usage.&lt;br /&gt;
* Any embedded string is initialized to &amp;quot;&amp;quot; (instead of NULL or no initialization at all).&lt;br /&gt;
&lt;br /&gt;
The [ ] operator can be used as usual with BDL arrays.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long value;&lt;br /&gt;
	string name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef MyStruct MyArray[8][2];&lt;br /&gt;
// MyArray is variable-length because of the string member &amp;quot;name&amp;quot; of its element data type&lt;br /&gt;
&lt;br /&gt;
// C++&lt;br /&gt;
int i;&lt;br /&gt;
BABEL::MyModule::MyArray a; // a statically allocated array&lt;br /&gt;
&lt;br /&gt;
a[2][1].name = BABEL::string_dup(&amp;quot;this member will not be an empty string&amp;quot;);&lt;br /&gt;
for(i=0; i&amp;lt;8; i++) a[i][0].value=a[i][1].value=i;&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_slice* b; // a dynamically allocated array&lt;br /&gt;
BABEL::MyModule::MyArray_slice* c; // another dynamically allocated array&lt;br /&gt;
&lt;br /&gt;
b = BABEL::MyModule::MyArray_alloc(); // dynamically allocates the array&lt;br /&gt;
BABEL::MyModule::MyArray_copy(b,a); // copy a into b (b=a)&lt;br /&gt;
c = BABEL::MyModule::MyArray_dup(b); // dynamically allocates an array and copies the contents of b&lt;br /&gt;
c[2][1].name = BABEL::string_dup(&amp;quot;c&amp;quot;); // a and b will not be changed&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_free(b); // dynamically frees the b array&lt;br /&gt;
BABEL::MyModule::MyArray_free(c); // dynamically frees the c array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length array data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
An array is variable-length if its element data type is variable-length (contains strings or sequences, directly or recursively). If it does not, the array is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
One must know if an array is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; An array as an input (in) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The array will be sent as const MyArrayDataType, so the caller needs a variable of that array to use it as an input parameter of a service. Note that for C++, the const MyArrayDataType is equivalent to const MyArrayDataType_slice*.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;An array as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the array is const MyArrayDataType, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The caller needs a (dynamically/statically) allocated array of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee, and the caller keeps the ownership (must free the array when not needed). Note that the fixed-length array is allocated by the caller, not by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A fixed-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. Please, see the documentation of the element data type (string, sequence, others...) to know how to do the assignment. Note that the array was allocated by the caller, and the callee cannot reallocate it (the callee does not have a reference to the array pointer).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned array. The caller must free the memory when the array is not needed, using T_free() (e.g.: MyArrayDataType_free()). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be a class that behaves as a MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The callee must allocate a new array using T_alloc() (e.g.: BABEL::MyModule::MyArrayDataType_alloc()). After the allocation, change the content as needed, and store the pointer to the allocated array in the output parameter. The initial value of the output parameter is undefined and must not be used or freed.&lt;br /&gt;
&lt;br /&gt;
Warning: The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous array will not be freed. If you do not assign any pointer to it (or if you assign the  NULL pointer), the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using T_free() and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Usage of the variable-length array output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After assigning a pointer to the output parameter, the callee can use the pointed array, but there are some rules. You can retrieve the stored pointer (a MyArrayDataType_slice*) using the method ptr() of the output parameter class. For example (the BABEL module is called &amp;quot;MyModule&amp;quot;, and the variable-length array output parameter is &amp;quot;arr_out&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// Allocate the array and assign it to the output parameter:&lt;br /&gt;
arr_out = BABEL::MyModule::arr_alloc(); &lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 1):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out.ptr(); // gets the pointer stored in arr_out&lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 2):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out; // gets the pointer without using ptr()  &lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Access to array elements:&lt;br /&gt;
arr_out.ptr()[4][8] = arr_out.ptr()[1][2] + arr_out.ptr()[3][7]; // Ok&lt;br /&gt;
&lt;br /&gt;
// This is not valid:&lt;br /&gt;
arr_out[4][8] = arr_out[1][2] + arr_out[3][7]; // Error: use ptr()&lt;br /&gt;
(*arr_out)[4][8] = (*arr_out)[1][2] + (*arr_out)[3][7]; // Error: use ptr()&lt;br /&gt;
	&lt;br /&gt;
// Recommended usage:&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = BABEL::MyModule::arr_alloc(); // allocates the array in a temporal variable.&lt;br /&gt;
// One can duplicate an array instead of allocating a default initialized one.&lt;br /&gt;
arr_out = arr_ptr; // arr_out and arr_ptr points to the same array (the one to be returned)&lt;br /&gt;
arr_ptr[1][2] = arr_ptr[3][3] + arr_ptr[4][4]; // use the temporal variable to do any changes to the array&lt;br /&gt;
// When the function ends, arr_ptr returns the array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others: enum ===&lt;br /&gt;
&lt;br /&gt;
The enum data type is mapped directly to a C++ enum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
enum MyEnum {one, two, three};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
enum MyEnum {one, two, three}; // the full name for using it will be: BABEL::MyModule::MyEnum&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using enum as service parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The enum data types are mapped as datatype (shown above) when used as input parameters in services, and as datatype&amp;amp; when used as output. For example, a service &amp;quot;MyOp&amp;quot; with an input and output parameters (a_in and b_out) of the enumerated &amp;quot;MyEnum&amp;quot; can be considered as though it is translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class uninteresting for the user&amp;gt;::MyOp(BABEL::MyModule::MyEnum a_in, BABEL::MyModule::MyEnum&amp;amp; b_out);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the enum is passed by value, the caller can use a variable or a constant enumerator (an enumerated value) of the same translated type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter as expected, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the enumerated type, so the caller must use a variable of the translated enumerated type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others: string ===&lt;br /&gt;
&lt;br /&gt;
Strings of BDL are translated into (possibly &amp;#039;&amp;#039;&amp;#039;const&amp;#039;&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;char *&amp;#039;&amp;#039;&amp;#039; of C++ if they appear directly as types of some input/output parameter of a service. They can be also defined as variables in the logic of some service in this way: &amp;#039;&amp;#039;&amp;#039;BABEL::String str;&amp;#039;&amp;#039;&amp;#039;. In both cases, the helper functions described below apply. &lt;br /&gt;
&lt;br /&gt;
However, when a BDL string type appears as the type of a field of a composed public type of a module, it is not translated into a &amp;#039;&amp;#039;&amp;#039;BABEL::String&amp;#039;&amp;#039;&amp;#039; type. In that case, it is translated into a special object that can use &amp;#039;&amp;#039;&amp;#039;BABEL::string_dup&amp;#039;&amp;#039;&amp;#039; for assignment, but it &amp;#039;&amp;#039;&amp;#039;cannot&amp;#039;&amp;#039;&amp;#039; use &amp;#039;&amp;#039;&amp;#039;BABEL::string_free&amp;#039;&amp;#039;&amp;#039; for deletion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Helper functions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_alloc(BABEL::ULong len)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allocates space for a string. The allocated size will be len+1 (so the allocated buffer has enough space for the trailing 0). Return: The allocated buffer or NULL if there is not enough memory. Note that the user must free the buffer when it is not needed anymore (or assigned to an object that do so). To free the buffer, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_dup(const char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Duplicates a string. c is the string to be duplicated. The return value is the duplicated string or NULL if there is not enough memory. If c is NULL, the return value will be NULL. The allocated size will be strlen(c)+1 using BABEL::string_alloc(strlen(c)). Note that the user must free the string when it is not needed anymore (or assigned to an object that do so). To free the string, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void BABEL::string_free(char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a string allocated by BABEL::string_alloc() or BABEL::string_dup(). c is the string to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use a const char* or a char*  (will be treated as a const char*) for passing a string (an embedded string is also valid). Passing a NULL pointer is not allowed and the outcome is undefined. The caller keeps the string ownership.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use the parameter as a const char* (it should not be NULL).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Use a char* variable as parameter (the parameter is a class that behaves as a char*&amp;amp;). The variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter. The returned value can be &amp;quot;&amp;quot; but never NULL. When you do not need the returned string anymore, you must delete it using BABEL::string_free() as described earlier (do not use delete/delete[] to free it). &lt;br /&gt;
&lt;br /&gt;
Also, you can pass as output parameter a string which is part of a composed type. In that case the current string will be automatically freed. For example, if you have a service &amp;quot;MyOp&amp;quot; with an output parameter &amp;quot;string s&amp;quot;, you can pass as that parameter the following: &amp;quot;MyStruct.stringfield&amp;quot;, provided that MyStruct is a variable of some struct type that contains a field (&amp;quot;stringfield&amp;quot;) of type string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter will be a class that behaves as a char*&amp;amp;. The callee must do the assignment to a string output parameter once and only once. If you do it more than once, the previous string will not be freed. If you do not assign any string to it, the parameter value will be undefined and that is an error. However, the following is valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class that is not interesting for the user&amp;gt;::MyOperation(/*out string parameter data type*/ str)&lt;br /&gt;
	{&lt;br /&gt;
		str = BABEL::string_dup(&amp;quot;Unknown&amp;quot;);&lt;br /&gt;
		if(/*...*/) {&lt;br /&gt;
			BABEL::string_free(str); // free the previous string&lt;br /&gt;
			str = BABEL::string_dup(&amp;quot;Ok&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: An output string parameter does not behaves as an embedded string. As stated before, each assignment overwrites the previous string without freeing it.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
When assigning a char* value to an output string parameter, the parameter will own that pointer without making a duplicate of the string, so that string should be created through BABEL::string_dup() or BABEL::string_alloc(), because it will be eventually freed using BABEL::string_free() (if it was created by new or anything else, a typecast to const char* is needed).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a const char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you assign a value using a const char*, the string will be duplicated with BABEL::string_dup(). Please, note that some compilers (non ANSI/ISO C++ compliant) treats literal strings as char*, not as const char*, so it is preferred to use str = (const char*)&amp;quot;literal string&amp;quot; or str = BABEL::string_dup(&amp;quot;literal string&amp;quot;) instead of str = &amp;quot;literal string&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning an embedded string:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The direct assignment of an embedded string to an output string parameter is not allowed. Please, use string_dup() to do the assignment. E.g: out_str_arg = BABEL::string_dup(my_struct.my_embedded_str).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using the output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After a string is assigned to the output parameter, you can use the parameter as a char*. The [ ] operator is available for read and write, but one sould take care not to use an index out of the string allocated buffer. The string can be modified and shortened but not enlarged. To enlarge a string you must allocate a larger buffer using BABEL::string_alloc(). If you assign a new buffer to the output parameter, remember to free the previous one using BABEL::string_free().&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// This service has an input string parameter, str_in, and an output string parameter, str_out.&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::Echo(const char* str_in, /* the string output class */ str_out) &lt;br /&gt;
{&lt;br /&gt;
	str_out = BABEL::string_dup(str_in); // duplicates str_in and returns the copy in str_out&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = str_in; // duplicates str_in and returns the copy in str_out (the same as above)&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = &amp;quot;str&amp;quot;; // duplicates &amp;quot;str&amp;quot; and returns the copy in str_out. However, str_out = (const char*)&amp;quot;str&amp;quot; is preferred.&lt;br /&gt;
&lt;br /&gt;
	//str_out = new char[1]; str_out[0]=0; // thar is an error: the string must be allocated using string_dup() or string_alloc().&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::GetName(const MyContactStruct&amp;amp; contact_in, /* the string output class */ name_out)&lt;br /&gt;
{&lt;br /&gt;
	name_out = BABEL::string_dup(contact_in.name); // copies contact_in.name and returns the copy in name_out&lt;br /&gt;
	//name_out = contact_in.name; // that is an error (*)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(*): contact_in.name is an embedded string. This assignment is not allowed. The user must use the prior line to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
An alias for a data type created by the BDL typedef keyword behaves as the original data type. For example, an alias for an array should be treated as if that alias was an original array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The BDL constants are mapped to equivalent C++ constants. To use a constant one must add BABEL::MyModule:: before the name of the constant (&amp;quot;MyModule&amp;quot; is the name of the BABEL module). Thus, the constant PI should be referenced in C++ as BABEL::MyModule::PI.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
static const BABEL::Float PI=3.14159265;&lt;br /&gt;
static const BABEL::Char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
static const char* LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=692</id>
		<title>Documentation:BDL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=692"/>
		<updated>2011-02-16T14:01:32Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Repeated: sequence */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;BABEL Definition Language (BDL) &amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
v. 120606&lt;br /&gt;
&lt;br /&gt;
A data definition language for the BABEL development system.&lt;br /&gt;
&lt;br /&gt;
System Engineering and Automation Department.&lt;br /&gt;
&lt;br /&gt;
University of Málaga, Spain.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What is BDL?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
BDL (Babel Definition Language) is the medium for specifying, in a programming-language independent fashion, some data types that a BABEL module needs. BDL has been implemented as a restricted subset of one of the most extended definition languages: the OMG CORBA IDL (http://www.omg.org).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Where the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
It is used currently for defining input/output parameters of services and for providing public definitions (data types that the module provides to other modules and to itself). You can use BDL types both in the &amp;quot;Public Definitions&amp;quot; of the module and in the specification of the input/output parameters of the services. You can compose your own types (using &amp;quot;typedef&amp;quot;) based on BDL basic or composed types.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What the BDL types are used for?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You can use a variable of a BDL type in the following situations:&lt;br /&gt;
	A) Creating a local variable for the internal use of some logic of the module (auxiliary logic, service logic, start-up logic, etc.).&lt;br /&gt;
	B) Creating a global variable for the internal status of the module (accessible from any logic of the module).&lt;br /&gt;
	C) Using an already defined input/output parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How variables of the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You should remember that BDL is not a programming language (only a specification for data), and thus, you cannot use directly any BDL type in your codification logics. Rather, BABEL translates automatically for you the BDL types into types understandable by the codification language you have chosen for your module (see for example the Using BDL in the C++ codification language section).&lt;br /&gt;
&lt;br /&gt;
= BABEL Definition Language (BDL) =&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Numeric (octet, short, long, ...) === &lt;br /&gt;
&lt;br /&gt;
BDL includes the following basic numeric types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039; : 8-bit, unsigned (0...2^8-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; : 16-bit, signed (-2^15...2^15-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned short&amp;#039;&amp;#039;&amp;#039; : 16-bit, unsigned (0...2^16-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; : 32-bit, signed (-2^31...2^31-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long&amp;#039;&amp;#039;&amp;#039;	: 32-bit, unsigned (0...2^32-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long long&amp;#039;&amp;#039;&amp;#039; (*)	:  64-bit, signed (-2^63...2^63-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long long&amp;#039;&amp;#039;&amp;#039; (*) : 64-bit, unsigned (0...-2^64-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039; : IEEE single-precision floating point numbers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; : IEEE double-precision floating point numbers.&lt;br /&gt;
&lt;br /&gt;
(*): The 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way, so its use should be avoided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alphanumeric (char) === &lt;br /&gt;
&lt;br /&gt;
BDL has only one basic alphanumeric type:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; : One unsigned 8-bits character.&lt;br /&gt;
&lt;br /&gt;
There is also one composed alphanumeric type: string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others (boolean) ===&lt;br /&gt;
	&lt;br /&gt;
BDL includes one basic type for logical operations:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039; : Stores a boolean value (TRUE or FALSE)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed type that does not contain more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Structs&amp;#039;&amp;#039;&amp;#039;: They are analogous to C structs, and can contain both basic and composed types fields. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	short FieldOne;&lt;br /&gt;
	double FieldTwo;&lt;br /&gt;
	OtherStructName osn;&lt;br /&gt;
} MyVarStruct;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;union&amp;#039;&amp;#039;&amp;#039; data type is not supported currently in BDL.&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repeated (sequence, array) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed types that can hold more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sequences&amp;#039;&amp;#039;&amp;#039;: An ordered list of elements of the same type (maybe composed). A maximum limit of elements can be specified, or not. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct LimitedAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;&lt;br /&gt;
	sequence&amp;lt;Account&amp;gt; accounts; // No maximum length of sequence.&lt;br /&gt;
	sequence&amp;lt;Account,50&amp;gt; accountsBis; // 50 is the maximum length of sequence.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Do not use sequences of octects to communicate serialized objects from one module to another: that means that you are forcing any receiver to use the same objects definition, tying them to your needs. Use only sequences of octects to pack together data that either has no structure or its structure is common knowledge -no additional libraries needed to handle it-.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Arrays&amp;#039;&amp;#039;&amp;#039;: Fixed-length indexed sets of elements of the same type (maybe composed). For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct SomeAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;  // string of length 10&lt;br /&gt;
	Account accounts[10][2];   // array of dimensions 10x2&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others (enum, string) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes these other composed types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Enumerated&amp;#039;&amp;#039;&amp;#039;: The enumeration of several constants. No numeric equivalence should be assumed. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
enum Currency {pound, dollar, yen, franc};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Strings&amp;#039;&amp;#039;&amp;#039;: Sequences of characters of 8 bits each. They can be given a fixed maximum length. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	string&amp;lt;10&amp;gt;  MyString;   // A string that can store no more than 10 characters&lt;br /&gt;
	string MyString2;   // A string without maximum length&lt;br /&gt;
} MyStructVar;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;typedef&amp;#039;&amp;#039;&amp;#039; keyword has been introduced to define array data types, but it also can be used to define alias for already defined data types.&lt;br /&gt;
&lt;br /&gt;
The syntax is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef &amp;lt; an already defined data type &amp;gt; &amp;lt; an alias for that type &amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long A;&lt;br /&gt;
	string B;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct MyStruct MyAliasForMyStruct;&lt;br /&gt;
typedef unsigned long MyAliasForUnsignedLong;&lt;br /&gt;
&lt;br /&gt;
typedef sequence&amp;lt;short, 50&amp;gt; ShortListType; &lt;br /&gt;
typedef sequence&amp;lt;long&amp;gt; LongListType; &lt;br /&gt;
&lt;br /&gt;
typedef short ShortArrayType[50][10]; &lt;br /&gt;
&lt;br /&gt;
typedef enum MyCurrency {pound, dollar, yen, franc} OtherCurrency;&lt;br /&gt;
&lt;br /&gt;
typedef string&amp;lt;10&amp;gt;  MyStringType;   &lt;br /&gt;
typedef string MyString;   &lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The way of defining constants in BDL is:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const &amp;lt;type&amp;gt; &amp;lt;const name&amp;gt; = &amp;lt;value&amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predefined types ==&lt;br /&gt;
&lt;br /&gt;
A few types are predefined so they can be readily used by any BABEL module. Their translation into the generated source code language follows the same rules as though they were defined by the user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	typedef sequence&amp;lt;string&amp;gt; SeqOfStrings;&lt;br /&gt;
	typedef sequence&amp;lt;octet&amp;gt; SeqOfBytes;&lt;br /&gt;
	typedef sequence&amp;lt;boolean&amp;gt; SeqOfBools;&lt;br /&gt;
	typedef sequence&amp;lt;float&amp;gt; SeqOfFloats;&lt;br /&gt;
	typedef sequence&amp;lt;double&amp;gt; SeqOfDoubles;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;short&amp;gt; SeqOfShorts;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned short&amp;gt; SeqOfUShorts;&lt;br /&gt;
	typedef sequence&amp;lt;long&amp;gt; SeqOfLongs;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned long&amp;gt; SeqOfULongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;unsigned long long&amp;gt; SeqOfULongLongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef double TMatrix22[2][2];&lt;br /&gt;
	typedef double TMatrix33[3][3];&lt;br /&gt;
	typedef double TMatrix44[4][4];&lt;br /&gt;
	typedef double TMatrix66[6][6];	&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=  Using BDL in C++ codification language =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed-length and variable-length data types ==&lt;br /&gt;
&lt;br /&gt;
The implementation and usage of the BDL data types can be different if the data type is fixed-length or variable-length.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed-length data types ===&lt;br /&gt;
&lt;br /&gt;
* octet&lt;br /&gt;
* short&lt;br /&gt;
* unsigned short&lt;br /&gt;
* long&lt;br /&gt;
* unsigned long&lt;br /&gt;
* long long&lt;br /&gt;
* unsigned long long&lt;br /&gt;
* float&lt;br /&gt;
* double&lt;br /&gt;
* char&lt;br /&gt;
* boolean&lt;br /&gt;
* enum&lt;br /&gt;
&lt;br /&gt;
=== Variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
* Bounded and unbounded string&lt;br /&gt;
* Bounded and unbounded sequence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data types that can be fixed-length or variable-length === &lt;br /&gt;
&lt;br /&gt;
* A struct is fixed-length if all its members are fixed-length. It is variable-length if one or more of its members are variable-length.&lt;br /&gt;
* An array is fixed-length if its base type is fixed-length. If its base type is variable-length, then the array is variable-length.&lt;br /&gt;
&lt;br /&gt;
Note: A variable-length array is not an array with a variable number of elements; it is an array with a variable-length element data type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== First consideration: fixed-length and variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
The first issue when BDL types are translated into C++ is that &amp;#039;&amp;#039;&amp;#039;service output parameters&amp;#039;&amp;#039;&amp;#039; are translated as reference (DataType &amp;amp;) for fixed-length data types, but as a reference to a pointer (DataType *&amp;amp;) for variable-length data types. For variable-length data types, there is also the need to manage the allocation and deallocation of its memory (BABEL does not provide code for that). For specific information, see the documentation for each data type under Usage of BDL in C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// All of this is BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct (float and long are fixed-length)&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct (the data member contains a string)&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef long FArrA[8][3]; // A fixed-length array (long is fixed-length)&lt;br /&gt;
typedef FStrA FArrB[8]; // A fixed-length array (FStrA is fixed-length)&lt;br /&gt;
typedef string&amp;lt;10&amp;gt; VArrC[7]; // A variable-length array (a bounded string is variable-length)&lt;br /&gt;
typedef VStrB VArrD[12]; // A variable-length array (VStrB is variable-length)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
All the basic types are mapped to types defined in the portable namespace &amp;quot;BABEL&amp;quot; (this is done indepently on the codification language chosen), with functionalities that are indistinguishable from native C++ types. However, &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; may be mapped to the same native C++ type, so any overloaded function that is overloaded solely on these types should be avoided. Also, the 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way.&lt;br /&gt;
&lt;br /&gt;
=== Translation of basic BDL data types to C++ ===&lt;br /&gt;
&lt;br /&gt;
Numeric:&lt;br /&gt;
&lt;br /&gt;
* octet: BABEL::Octet&lt;br /&gt;
* short: BABEL::Short&lt;br /&gt;
* unsigned short: BABEL::UShort&lt;br /&gt;
* long: BABEL::Long&lt;br /&gt;
* unsigned long: BABEL::ULong&lt;br /&gt;
* long long: BABEL::LongLong&lt;br /&gt;
* unsigned long long: BABEL::ULongLong&lt;br /&gt;
* float: BABEL::Float&lt;br /&gt;
* double: BABEL::Double&lt;br /&gt;
&lt;br /&gt;
Alphanumeric:&lt;br /&gt;
&lt;br /&gt;
* char: BABEL::Char&lt;br /&gt;
&lt;br /&gt;
Others:&lt;br /&gt;
&lt;br /&gt;
* boolean: BABEL::Boolean. &lt;br /&gt;
&lt;br /&gt;
There are two predefined boolean constants:&lt;br /&gt;
- BABEL::True&lt;br /&gt;
- BABEL::False&lt;br /&gt;
&lt;br /&gt;
One can use a BABEL::Boolean variable as a C++ bool type, but it can be defined as another type. You can compare a Boolean value with BABEL::False, but the comparison with BABEL::True should be avoided (use v!=BABEL::False or !v instead of v==BABEL::True).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using basic data types as service parameters === &lt;br /&gt;
&lt;br /&gt;
The basic data types are mapped as BABEL::datatype (as shown above) when used as input parameters in services, and as BABEL::datatype&amp;amp; when used as output. For example, a  service &amp;quot;MyOp&amp;quot; with the input parameters &amp;quot;char ch&amp;quot; and &amp;quot;long lg&amp;quot; and the output parameters &amp;quot;boolean bl&amp;quot; and &amp;quot;float fl&amp;quot; can be considered as though it was translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void &amp;lt;some class not interesting for the user&amp;gt;::MyOp(BABEL::Char ch, BABEL::Long lg, BABEL::Boolean&amp;amp; bl, BABEL::Float&amp;amp; fl);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the data type is passed by value, the caller can use for it a local variable, constant, or expression.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the data type, so the caller must use a variable (defined in the caller) of the corresponding translated data type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed Types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
The struct data type is mapped to a C++ struct with equivalent members.&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	BABEL::Float f;&lt;br /&gt;
	BABEL::Long c;&lt;br /&gt;
}; // Full name: BABEL::MyModule::FStrA&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct (because of the string member)&lt;br /&gt;
	/* string manager class */ name; // the class name is not defined and should not be used&lt;br /&gt;
	BABEL::UShort age;&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrB&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	BABEL::Long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrC&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct can be dynamically allocated and deallocated using C++ new and delete operators. If the struct contains any strings (directly or inside another contained data type) then, the strings will be initialized to &amp;quot;&amp;quot; instead of NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deep copy of struct variables&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	When you use the assignment operator (=), the struct is deep copied. Any allocated memory will be duplicated, so one can change a copied or original struct without changing the other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length struct data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct is variable-length if it contains strings or sequences (directly as a member or recursively). If it does not, the struct is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
	One must know if a struct is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The struct will be sent as const MyStructDataType&amp;amp;, so the caller needs a variable of that struct to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	Since the input struct is const MyStructDataType&amp;amp;, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp; so the caller needs a variable of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp;. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. The callee can set the parameter&amp;#039;s value assigning another struct of the same type or by setting all of its members. Please, see the documentation of the data type (string, sequence, others...) to know how to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned struct. The caller must free the memory when the struct is not needed (using the C++ delete operator). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The callee must allocate a new struct using the C++ operator new, change any member as needed, and store the pointer to the allocated struct in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous struct will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
=== Repeated: sequence ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&amp;#039;please read the note on sequences in their definition within the BDL language.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequences are mapped to C++ classes.&lt;br /&gt;
&lt;br /&gt;
Examples: See array operators and the get_buffer functions for examples of the sequence usage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To dynamically allocate and deallocate a sequence, one can use the new and delete C++ operators. The buffer used by the sequence is managed automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequence will be sent as const MySequenceDataType&amp;amp;, so the caller needs a variable of that sequence to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the sequence is const MySequenceDataType&amp;amp;, the callee cannot change it. Note that the sequence could be empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned sequence. The caller must free the memory when the array is not needed, using the C++ delete operator. The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The callee must allocate a new sequence using the C++ new operator. After the allocation, change the content as needed, and store the pointer to the allocated sequence in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous sequence will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
Warning: The callee can return a empty sequence, but not a NULL pointer (assigning a NULL pointer to the output parameter is not valid).&lt;br /&gt;
&lt;br /&gt;
Using the output parameter:&lt;br /&gt;
&lt;br /&gt;
	After assigning a pointer to the output parameter, the callee can use the pointed sequence as usual, but one must remember that the parameter is a pointer, not a sequence. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
out_seq = new BABEL::MyModule::MyStringSequenceDataType();&lt;br /&gt;
out_seq-&amp;gt;length(1); // use -&amp;gt; instead of .&lt;br /&gt;
(*out_seq)[0] = BABEL::string_dup(&amp;quot;my string&amp;quot;); // use (*out_seq)[index] instead of out_seq[index]&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Repeated: array ===&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef float MyLongA[8];&lt;br /&gt;
typedef string MyStrA[4][12];&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Float MyLongA[8];&lt;br /&gt;
typedef BABEL::Float MyLongA_slice;&lt;br /&gt;
typedef /* string manager class */ MyStrA[4][12];&lt;br /&gt;
typedef /* string manager class */ MyStrA_slice[12];&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::MyLongA)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; The T_slice data type &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The T_slice data type (e.g.: MyLongA_slice, MyStrA_slice) has the same element type and the same dimensions as the original except the first one. T_slice can be used to declare pointers to an array, since C++ declares array pointers as pointers to the first element of.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA a; // an array of MyLongA type&lt;br /&gt;
BABEL::MyModule::MyLongA_slice* ptr = a; // a pointer to an array of MyLongA type&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning:&lt;br /&gt;
	&lt;br /&gt;
The T_slice data type for arrays with different first dimension lengths is the same. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef long A[16][8][2];&lt;br /&gt;
typedef long B[4][8][2];&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Long A[16][8][2];&lt;br /&gt;
typedef BABEL::Long A_slice[8][2];&lt;br /&gt;
typedef BABEL::Long B[4][8][2];&lt;br /&gt;
typedef BABEL::Long B_slice[8][2]; // the same data type as A_slice&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::A)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That means that a pointer to A (A_slice*) is compatible with a pointer to B (B_slice*), and the user could use a pointer of one of them as if it were a pointer to the other. That is a grave error (usually leads to core dump), but the C++ compiler will compile the code without issuing a warning message.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Static allocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A statically allocated array can be created by using its data type name, as any C++ data type. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA v1;&lt;br /&gt;
BABEL::MyModule::MyStrA v2;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. When the variable goes out of scope (e.g.: the function that declares it ends) all used memory is freed (strings, sequences, arrays, ...).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Dynamic allocation and deallocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	To dynamically allocate and deallocate an array, one cannot use the new and delete operators or its array versions (new T[] and delete[] ptr). To allocate an array, use the T_alloc function (e.g.: BABEL::MyModule::MyLongA_alloc(), BABEL::MyModule::MyStrA_alloc()). If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. To deallocate an array, use T_free (e.g.: BABEL::MyModule::MyLongA_free(), BABEL::MyModule::MyStrA_free()).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_alloc()&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a T array and returns a pointer to it or NULL if there is not enough memory. Note that the user must free the array when it is not needed anymore. To free the array, use the T_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_free(T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a T array allocated by T_alloc() or T_dup() (see &amp;quot;Copy and duplication&amp;quot;). p is the array to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Copy and duplication &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_copy(T_slice* to, const T_slice* from)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copies the contents of the from array to the to array. If from or to or both are NULL, the function does nothing. The parameters can be statically or dynamically allocated (or one of each kind). An example of this function could be BABEL::MyModule::MyLongA_copy().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_dup(const T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a new array of the T type, copies the contents of the p array into it and then returns a pointer to it. The caller must free the array using T_free() described in &amp;quot;Dynamic allocation and deallocation&amp;quot;. If there is not enough memory or if p is NULL, the returned pointer will be NULL. An example of this function could be BABEL::MyModule::MyLongA_dup()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Array usage &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The BDL arrays can be used as C++ arrays except for:&lt;br /&gt;
&lt;br /&gt;
* Dynamic allocation and deallocation must be done using T_alloc() and T_free().&lt;br /&gt;
* The arrays can be copied or duplicated using T_copy() and T_dup().&lt;br /&gt;
* The usage of the elements stored in the array must follow the element data type usage.&lt;br /&gt;
* Any embedded string is initialized to &amp;quot;&amp;quot; (instead of NULL or no initialization at all).&lt;br /&gt;
&lt;br /&gt;
The [ ] operator can be used as usual with BDL arrays.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long value;&lt;br /&gt;
	string name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef MyStruct MyArray[8][2];&lt;br /&gt;
// MyArray is variable-length because of the string member &amp;quot;name&amp;quot; of its element data type&lt;br /&gt;
&lt;br /&gt;
// C++&lt;br /&gt;
int i;&lt;br /&gt;
BABEL::MyModule::MyArray a; // a statically allocated array&lt;br /&gt;
&lt;br /&gt;
a[2][1].name = BABEL::string_dup(&amp;quot;this member will not be an empty string&amp;quot;);&lt;br /&gt;
for(i=0; i&amp;lt;8; i++) a[i][0].value=a[i][1].value=i;&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_slice* b; // a dynamically allocated array&lt;br /&gt;
BABEL::MyModule::MyArray_slice* c; // another dynamically allocated array&lt;br /&gt;
&lt;br /&gt;
b = BABEL::MyModule::MyArray_alloc(); // dynamically allocates the array&lt;br /&gt;
BABEL::MyModule::MyArray_copy(b,a); // copy a into b (b=a)&lt;br /&gt;
c = BABEL::MyModule::MyArray_dup(b); // dynamically allocates an array and copies the contents of b&lt;br /&gt;
c[2][1].name = BABEL::string_dup(&amp;quot;c&amp;quot;); // a and b will not be changed&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_free(b); // dynamically frees the b array&lt;br /&gt;
BABEL::MyModule::MyArray_free(c); // dynamically frees the c array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length array data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
An array is variable-length if its element data type is variable-length (contains strings or sequences, directly or recursively). If it does not, the array is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
One must know if an array is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; An array as an input (in) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The array will be sent as const MyArrayDataType, so the caller needs a variable of that array to use it as an input parameter of a service. Note that for C++, the const MyArrayDataType is equivalent to const MyArrayDataType_slice*.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;An array as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the array is const MyArrayDataType, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The caller needs a (dynamically/statically) allocated array of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee, and the caller keeps the ownership (must free the array when not needed). Note that the fixed-length array is allocated by the caller, not by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A fixed-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. Please, see the documentation of the element data type (string, sequence, others...) to know how to do the assignment. Note that the array was allocated by the caller, and the callee cannot reallocate it (the callee does not have a reference to the array pointer).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned array. The caller must free the memory when the array is not needed, using T_free() (e.g.: MyArrayDataType_free()). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be a class that behaves as a MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The callee must allocate a new array using T_alloc() (e.g.: BABEL::MyModule::MyArrayDataType_alloc()). After the allocation, change the content as needed, and store the pointer to the allocated array in the output parameter. The initial value of the output parameter is undefined and must not be used or freed.&lt;br /&gt;
&lt;br /&gt;
Warning: The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous array will not be freed. If you do not assign any pointer to it (or if you assign the  NULL pointer), the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using T_free() and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Usage of the variable-length array output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After assigning a pointer to the output parameter, the callee can use the pointed array, but there are some rules. You can retrieve the stored pointer (a MyArrayDataType_slice*) using the method ptr() of the output parameter class. For example (the BABEL module is called &amp;quot;MyModule&amp;quot;, and the variable-length array output parameter is &amp;quot;arr_out&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// Allocate the array and assign it to the output parameter:&lt;br /&gt;
arr_out = BABEL::MyModule::arr_alloc(); &lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 1):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out.ptr(); // gets the pointer stored in arr_out&lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 2):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out; // gets the pointer without using ptr()  &lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Access to array elements:&lt;br /&gt;
arr_out.ptr()[4][8] = arr_out.ptr()[1][2] + arr_out.ptr()[3][7]; // Ok&lt;br /&gt;
&lt;br /&gt;
// This is not valid:&lt;br /&gt;
arr_out[4][8] = arr_out[1][2] + arr_out[3][7]; // Error: use ptr()&lt;br /&gt;
(*arr_out)[4][8] = (*arr_out)[1][2] + (*arr_out)[3][7]; // Error: use ptr()&lt;br /&gt;
	&lt;br /&gt;
// Recommended usage:&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = BABEL::MyModule::arr_alloc(); // allocates the array in a temporal variable.&lt;br /&gt;
// One can duplicate an array instead of allocating a default initialized one.&lt;br /&gt;
arr_out = arr_ptr; // arr_out and arr_ptr points to the same array (the one to be returned)&lt;br /&gt;
arr_ptr[1][2] = arr_ptr[3][3] + arr_ptr[4][4]; // use the temporal variable to do any changes to the array&lt;br /&gt;
// When the function ends, arr_ptr returns the array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others: enum ===&lt;br /&gt;
&lt;br /&gt;
The enum data type is mapped directly to a C++ enum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
enum MyEnum {one, two, three};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
enum MyEnum {one, two, three}; // the full name for using it will be: BABEL::MyModule::MyEnum&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using enum as service parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The enum data types are mapped as datatype (shown above) when used as input parameters in services, and as datatype&amp;amp; when used as output. For example, a service &amp;quot;MyOp&amp;quot; with an input and output parameters (a_in and b_out) of the enumerated &amp;quot;MyEnum&amp;quot; can be considered as though it is translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class uninteresting for the user&amp;gt;::MyOp(BABEL::MyModule::MyEnum a_in, BABEL::MyModule::MyEnum&amp;amp; b_out);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the enum is passed by value, the caller can use a variable or a constant enumerator (an enumerated value) of the same translated type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter as expected, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the enumerated type, so the caller must use a variable of the translated enumerated type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others: string ===&lt;br /&gt;
&lt;br /&gt;
Strings of BDL are translated into (possibly &amp;#039;&amp;#039;&amp;#039;const&amp;#039;&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;char *&amp;#039;&amp;#039;&amp;#039; of C++ if they appear directly as types of some input/output parameter of a service. They can be also defined as variables in the logic of some service in this way: &amp;#039;&amp;#039;&amp;#039;BABEL::String str;&amp;#039;&amp;#039;&amp;#039;. In both cases, the helper functions described below apply. &lt;br /&gt;
&lt;br /&gt;
However, when a BDL string type appears as the type of a field of a composed public type of a module, it is not translated into a &amp;#039;&amp;#039;&amp;#039;BABEL::String&amp;#039;&amp;#039;&amp;#039; type. In that case, it is translated into a special object that can use &amp;#039;&amp;#039;&amp;#039;BABEL::string_dup&amp;#039;&amp;#039;&amp;#039; for assignment, but it &amp;#039;&amp;#039;&amp;#039;cannot&amp;#039;&amp;#039;&amp;#039; use &amp;#039;&amp;#039;&amp;#039;BABEL::string_free&amp;#039;&amp;#039;&amp;#039; for deletion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Helper functions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_alloc(BABEL::ULong len)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allocates space for a string. The allocated size will be len+1 (so the allocated buffer has enough space for the trailing 0). Return: The allocated buffer or NULL if there is not enough memory. Note that the user must free the buffer when it is not needed anymore (or assigned to an object that do so). To free the buffer, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_dup(const char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Duplicates a string. c is the string to be duplicated. The return value is the duplicated string or NULL if there is not enough memory. If c is NULL, the return value will be NULL. The allocated size will be strlen(c)+1 using BABEL::string_alloc(strlen(c)). Note that the user must free the string when it is not needed anymore (or assigned to an object that do so). To free the string, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void BABEL::string_free(char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a string allocated by BABEL::string_alloc() or BABEL::string_dup(). c is the string to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use a const char* or a char*  (will be treated as a const char*) for passing a string (an embedded string is also valid). Passing a NULL pointer is not allowed and the outcome is undefined. The caller keeps the string ownership.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use the parameter as a const char* (it should not be NULL).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Use a char* variable as parameter (the parameter is a class that behaves as a char*&amp;amp;). The variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter. The returned value can be &amp;quot;&amp;quot; but never NULL. When you do not need the returned string anymore, you must delete it using BABEL::string_free() as described earlier (do not use delete/delete[] to free it). &lt;br /&gt;
&lt;br /&gt;
Also, you can pass as output parameter a string which is part of a composed type. In that case the current string will be automatically freed. For example, if you have a service &amp;quot;MyOp&amp;quot; with an output parameter &amp;quot;string s&amp;quot;, you can pass as that parameter the following: &amp;quot;MyStruct.stringfield&amp;quot;, provided that MyStruct is a variable of some struct type that contains a field (&amp;quot;stringfield&amp;quot;) of type string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter will be a class that behaves as a char*&amp;amp;. The callee must do the assignment to a string output parameter once and only once. If you do it more than once, the previous string will not be freed. If you do not assign any string to it, the parameter value will be undefined and that is an error. However, the following is valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class that is not interesting for the user&amp;gt;::MyOperation(/*out string parameter data type*/ str)&lt;br /&gt;
	{&lt;br /&gt;
		str = BABEL::string_dup(&amp;quot;Unknown&amp;quot;);&lt;br /&gt;
		if(/*...*/) {&lt;br /&gt;
			BABEL::string_free(str); // free the previous string&lt;br /&gt;
			str = BABEL::string_dup(&amp;quot;Ok&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: An output string parameter does not behaves as an embedded string. As stated before, each assignment overwrites the previous string without freeing it.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
When assigning a char* value to an output string parameter, the parameter will own that pointer without making a duplicate of the string, so that string should be created through BABEL::string_dup() or BABEL::string_alloc(), because it will be eventually freed using BABEL::string_free() (if it was created by new or anything else, a typecast to const char* is needed).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a const char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you assign a value using a const char*, the string will be duplicated with BABEL::string_dup(). Please, note that some compilers (non ANSI/ISO C++ compliant) treats literal strings as char*, not as const char*, so it is preferred to use str = (const char*)&amp;quot;literal string&amp;quot; or str = BABEL::string_dup(&amp;quot;literal string&amp;quot;) instead of str = &amp;quot;literal string&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning an embedded string:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The direct assignment of an embedded string to an output string parameter is not allowed. Please, use string_dup() to do the assignment. E.g: out_str_arg = BABEL::string_dup(my_struct.my_embedded_str).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using the output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After a string is assigned to the output parameter, you can use the parameter as a char*. The [ ] operator is available for read and write, but one sould take care not to use an index out of the string allocated buffer. The string can be modified and shortened but not enlarged. To enlarge a string you must allocate a larger buffer using BABEL::string_alloc(). If you assign a new buffer to the output parameter, remember to free the previous one using BABEL::string_free().&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// This service has an input string parameter, str_in, and an output string parameter, str_out.&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::Echo(const char* str_in, /* the string output class */ str_out) &lt;br /&gt;
{&lt;br /&gt;
	str_out = BABEL::string_dup(str_in); // duplicates str_in and returns the copy in str_out&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = str_in; // duplicates str_in and returns the copy in str_out (the same as above)&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = &amp;quot;str&amp;quot;; // duplicates &amp;quot;str&amp;quot; and returns the copy in str_out. However, str_out = (const char*)&amp;quot;str&amp;quot; is preferred.&lt;br /&gt;
&lt;br /&gt;
	//str_out = new char[1]; str_out[0]=0; // thar is an error: the string must be allocated using string_dup() or string_alloc().&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::GetName(const MyContactStruct&amp;amp; contact_in, /* the string output class */ name_out)&lt;br /&gt;
{&lt;br /&gt;
	name_out = BABEL::string_dup(contact_in.name); // copies contact_in.name and returns the copy in name_out&lt;br /&gt;
	//name_out = contact_in.name; // that is an error (*)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(*): contact_in.name is an embedded string. This assignment is not allowed. The user must use the prior line to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
An alias for a data type created by the BDL typedef keyword behaves as the original data type. For example, an alias for an array should be treated as if that alias was an original array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The BDL constants are mapped to equivalent C++ constants. To use a constant one must add BABEL::MyModule:: before the name of the constant (&amp;quot;MyModule&amp;quot; is the name of the BABEL module). Thus, the constant PI should be referenced in C++ as BABEL::MyModule::PI.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
static const BABEL::Float PI=3.14159265;&lt;br /&gt;
static const BABEL::Char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
static const char* LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=691</id>
		<title>Documentation:BDL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=691"/>
		<updated>2011-02-16T14:00:20Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Repeated (sequence, array) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;BABEL Definition Language (BDL) &amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
v. 120606&lt;br /&gt;
&lt;br /&gt;
A data definition language for the BABEL development system.&lt;br /&gt;
&lt;br /&gt;
System Engineering and Automation Department.&lt;br /&gt;
&lt;br /&gt;
University of Málaga, Spain.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What is BDL?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
BDL (Babel Definition Language) is the medium for specifying, in a programming-language independent fashion, some data types that a BABEL module needs. BDL has been implemented as a restricted subset of one of the most extended definition languages: the OMG CORBA IDL (http://www.omg.org).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Where the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
It is used currently for defining input/output parameters of services and for providing public definitions (data types that the module provides to other modules and to itself). You can use BDL types both in the &amp;quot;Public Definitions&amp;quot; of the module and in the specification of the input/output parameters of the services. You can compose your own types (using &amp;quot;typedef&amp;quot;) based on BDL basic or composed types.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What the BDL types are used for?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You can use a variable of a BDL type in the following situations:&lt;br /&gt;
	A) Creating a local variable for the internal use of some logic of the module (auxiliary logic, service logic, start-up logic, etc.).&lt;br /&gt;
	B) Creating a global variable for the internal status of the module (accessible from any logic of the module).&lt;br /&gt;
	C) Using an already defined input/output parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How variables of the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You should remember that BDL is not a programming language (only a specification for data), and thus, you cannot use directly any BDL type in your codification logics. Rather, BABEL translates automatically for you the BDL types into types understandable by the codification language you have chosen for your module (see for example the Using BDL in the C++ codification language section).&lt;br /&gt;
&lt;br /&gt;
= BABEL Definition Language (BDL) =&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Numeric (octet, short, long, ...) === &lt;br /&gt;
&lt;br /&gt;
BDL includes the following basic numeric types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039; : 8-bit, unsigned (0...2^8-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; : 16-bit, signed (-2^15...2^15-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned short&amp;#039;&amp;#039;&amp;#039; : 16-bit, unsigned (0...2^16-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; : 32-bit, signed (-2^31...2^31-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long&amp;#039;&amp;#039;&amp;#039;	: 32-bit, unsigned (0...2^32-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long long&amp;#039;&amp;#039;&amp;#039; (*)	:  64-bit, signed (-2^63...2^63-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long long&amp;#039;&amp;#039;&amp;#039; (*) : 64-bit, unsigned (0...-2^64-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039; : IEEE single-precision floating point numbers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; : IEEE double-precision floating point numbers.&lt;br /&gt;
&lt;br /&gt;
(*): The 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way, so its use should be avoided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alphanumeric (char) === &lt;br /&gt;
&lt;br /&gt;
BDL has only one basic alphanumeric type:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; : One unsigned 8-bits character.&lt;br /&gt;
&lt;br /&gt;
There is also one composed alphanumeric type: string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others (boolean) ===&lt;br /&gt;
	&lt;br /&gt;
BDL includes one basic type for logical operations:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039; : Stores a boolean value (TRUE or FALSE)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed type that does not contain more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Structs&amp;#039;&amp;#039;&amp;#039;: They are analogous to C structs, and can contain both basic and composed types fields. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	short FieldOne;&lt;br /&gt;
	double FieldTwo;&lt;br /&gt;
	OtherStructName osn;&lt;br /&gt;
} MyVarStruct;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;union&amp;#039;&amp;#039;&amp;#039; data type is not supported currently in BDL.&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repeated (sequence, array) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed types that can hold more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sequences&amp;#039;&amp;#039;&amp;#039;: An ordered list of elements of the same type (maybe composed). A maximum limit of elements can be specified, or not. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct LimitedAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;&lt;br /&gt;
	sequence&amp;lt;Account&amp;gt; accounts; // No maximum length of sequence.&lt;br /&gt;
	sequence&amp;lt;Account,50&amp;gt; accountsBis; // 50 is the maximum length of sequence.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;Do not use sequences of octects to communicate serialized objects from one module to another: that means that you are forcing any receiver to use the same objects definition, tying them to your needs. Use only sequences of octects to pack together data that either has no structure or its structure is common knowledge -no additional libraries needed to handle it-.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Arrays&amp;#039;&amp;#039;&amp;#039;: Fixed-length indexed sets of elements of the same type (maybe composed). For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct SomeAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;  // string of length 10&lt;br /&gt;
	Account accounts[10][2];   // array of dimensions 10x2&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others (enum, string) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes these other composed types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Enumerated&amp;#039;&amp;#039;&amp;#039;: The enumeration of several constants. No numeric equivalence should be assumed. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
enum Currency {pound, dollar, yen, franc};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Strings&amp;#039;&amp;#039;&amp;#039;: Sequences of characters of 8 bits each. They can be given a fixed maximum length. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	string&amp;lt;10&amp;gt;  MyString;   // A string that can store no more than 10 characters&lt;br /&gt;
	string MyString2;   // A string without maximum length&lt;br /&gt;
} MyStructVar;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;typedef&amp;#039;&amp;#039;&amp;#039; keyword has been introduced to define array data types, but it also can be used to define alias for already defined data types.&lt;br /&gt;
&lt;br /&gt;
The syntax is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef &amp;lt; an already defined data type &amp;gt; &amp;lt; an alias for that type &amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long A;&lt;br /&gt;
	string B;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct MyStruct MyAliasForMyStruct;&lt;br /&gt;
typedef unsigned long MyAliasForUnsignedLong;&lt;br /&gt;
&lt;br /&gt;
typedef sequence&amp;lt;short, 50&amp;gt; ShortListType; &lt;br /&gt;
typedef sequence&amp;lt;long&amp;gt; LongListType; &lt;br /&gt;
&lt;br /&gt;
typedef short ShortArrayType[50][10]; &lt;br /&gt;
&lt;br /&gt;
typedef enum MyCurrency {pound, dollar, yen, franc} OtherCurrency;&lt;br /&gt;
&lt;br /&gt;
typedef string&amp;lt;10&amp;gt;  MyStringType;   &lt;br /&gt;
typedef string MyString;   &lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The way of defining constants in BDL is:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const &amp;lt;type&amp;gt; &amp;lt;const name&amp;gt; = &amp;lt;value&amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predefined types ==&lt;br /&gt;
&lt;br /&gt;
A few types are predefined so they can be readily used by any BABEL module. Their translation into the generated source code language follows the same rules as though they were defined by the user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	typedef sequence&amp;lt;string&amp;gt; SeqOfStrings;&lt;br /&gt;
	typedef sequence&amp;lt;octet&amp;gt; SeqOfBytes;&lt;br /&gt;
	typedef sequence&amp;lt;boolean&amp;gt; SeqOfBools;&lt;br /&gt;
	typedef sequence&amp;lt;float&amp;gt; SeqOfFloats;&lt;br /&gt;
	typedef sequence&amp;lt;double&amp;gt; SeqOfDoubles;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;short&amp;gt; SeqOfShorts;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned short&amp;gt; SeqOfUShorts;&lt;br /&gt;
	typedef sequence&amp;lt;long&amp;gt; SeqOfLongs;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned long&amp;gt; SeqOfULongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;unsigned long long&amp;gt; SeqOfULongLongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef double TMatrix22[2][2];&lt;br /&gt;
	typedef double TMatrix33[3][3];&lt;br /&gt;
	typedef double TMatrix44[4][4];&lt;br /&gt;
	typedef double TMatrix66[6][6];	&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=  Using BDL in C++ codification language =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed-length and variable-length data types ==&lt;br /&gt;
&lt;br /&gt;
The implementation and usage of the BDL data types can be different if the data type is fixed-length or variable-length.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed-length data types ===&lt;br /&gt;
&lt;br /&gt;
* octet&lt;br /&gt;
* short&lt;br /&gt;
* unsigned short&lt;br /&gt;
* long&lt;br /&gt;
* unsigned long&lt;br /&gt;
* long long&lt;br /&gt;
* unsigned long long&lt;br /&gt;
* float&lt;br /&gt;
* double&lt;br /&gt;
* char&lt;br /&gt;
* boolean&lt;br /&gt;
* enum&lt;br /&gt;
&lt;br /&gt;
=== Variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
* Bounded and unbounded string&lt;br /&gt;
* Bounded and unbounded sequence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data types that can be fixed-length or variable-length === &lt;br /&gt;
&lt;br /&gt;
* A struct is fixed-length if all its members are fixed-length. It is variable-length if one or more of its members are variable-length.&lt;br /&gt;
* An array is fixed-length if its base type is fixed-length. If its base type is variable-length, then the array is variable-length.&lt;br /&gt;
&lt;br /&gt;
Note: A variable-length array is not an array with a variable number of elements; it is an array with a variable-length element data type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== First consideration: fixed-length and variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
The first issue when BDL types are translated into C++ is that &amp;#039;&amp;#039;&amp;#039;service output parameters&amp;#039;&amp;#039;&amp;#039; are translated as reference (DataType &amp;amp;) for fixed-length data types, but as a reference to a pointer (DataType *&amp;amp;) for variable-length data types. For variable-length data types, there is also the need to manage the allocation and deallocation of its memory (BABEL does not provide code for that). For specific information, see the documentation for each data type under Usage of BDL in C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// All of this is BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct (float and long are fixed-length)&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct (the data member contains a string)&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef long FArrA[8][3]; // A fixed-length array (long is fixed-length)&lt;br /&gt;
typedef FStrA FArrB[8]; // A fixed-length array (FStrA is fixed-length)&lt;br /&gt;
typedef string&amp;lt;10&amp;gt; VArrC[7]; // A variable-length array (a bounded string is variable-length)&lt;br /&gt;
typedef VStrB VArrD[12]; // A variable-length array (VStrB is variable-length)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
All the basic types are mapped to types defined in the portable namespace &amp;quot;BABEL&amp;quot; (this is done indepently on the codification language chosen), with functionalities that are indistinguishable from native C++ types. However, &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; may be mapped to the same native C++ type, so any overloaded function that is overloaded solely on these types should be avoided. Also, the 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way.&lt;br /&gt;
&lt;br /&gt;
=== Translation of basic BDL data types to C++ ===&lt;br /&gt;
&lt;br /&gt;
Numeric:&lt;br /&gt;
&lt;br /&gt;
* octet: BABEL::Octet&lt;br /&gt;
* short: BABEL::Short&lt;br /&gt;
* unsigned short: BABEL::UShort&lt;br /&gt;
* long: BABEL::Long&lt;br /&gt;
* unsigned long: BABEL::ULong&lt;br /&gt;
* long long: BABEL::LongLong&lt;br /&gt;
* unsigned long long: BABEL::ULongLong&lt;br /&gt;
* float: BABEL::Float&lt;br /&gt;
* double: BABEL::Double&lt;br /&gt;
&lt;br /&gt;
Alphanumeric:&lt;br /&gt;
&lt;br /&gt;
* char: BABEL::Char&lt;br /&gt;
&lt;br /&gt;
Others:&lt;br /&gt;
&lt;br /&gt;
* boolean: BABEL::Boolean. &lt;br /&gt;
&lt;br /&gt;
There are two predefined boolean constants:&lt;br /&gt;
- BABEL::True&lt;br /&gt;
- BABEL::False&lt;br /&gt;
&lt;br /&gt;
One can use a BABEL::Boolean variable as a C++ bool type, but it can be defined as another type. You can compare a Boolean value with BABEL::False, but the comparison with BABEL::True should be avoided (use v!=BABEL::False or !v instead of v==BABEL::True).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using basic data types as service parameters === &lt;br /&gt;
&lt;br /&gt;
The basic data types are mapped as BABEL::datatype (as shown above) when used as input parameters in services, and as BABEL::datatype&amp;amp; when used as output. For example, a  service &amp;quot;MyOp&amp;quot; with the input parameters &amp;quot;char ch&amp;quot; and &amp;quot;long lg&amp;quot; and the output parameters &amp;quot;boolean bl&amp;quot; and &amp;quot;float fl&amp;quot; can be considered as though it was translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void &amp;lt;some class not interesting for the user&amp;gt;::MyOp(BABEL::Char ch, BABEL::Long lg, BABEL::Boolean&amp;amp; bl, BABEL::Float&amp;amp; fl);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the data type is passed by value, the caller can use for it a local variable, constant, or expression.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the data type, so the caller must use a variable (defined in the caller) of the corresponding translated data type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed Types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
The struct data type is mapped to a C++ struct with equivalent members.&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	BABEL::Float f;&lt;br /&gt;
	BABEL::Long c;&lt;br /&gt;
}; // Full name: BABEL::MyModule::FStrA&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct (because of the string member)&lt;br /&gt;
	/* string manager class */ name; // the class name is not defined and should not be used&lt;br /&gt;
	BABEL::UShort age;&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrB&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	BABEL::Long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrC&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct can be dynamically allocated and deallocated using C++ new and delete operators. If the struct contains any strings (directly or inside another contained data type) then, the strings will be initialized to &amp;quot;&amp;quot; instead of NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deep copy of struct variables&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	When you use the assignment operator (=), the struct is deep copied. Any allocated memory will be duplicated, so one can change a copied or original struct without changing the other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length struct data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct is variable-length if it contains strings or sequences (directly as a member or recursively). If it does not, the struct is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
	One must know if a struct is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The struct will be sent as const MyStructDataType&amp;amp;, so the caller needs a variable of that struct to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	Since the input struct is const MyStructDataType&amp;amp;, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp; so the caller needs a variable of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp;. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. The callee can set the parameter&amp;#039;s value assigning another struct of the same type or by setting all of its members. Please, see the documentation of the data type (string, sequence, others...) to know how to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned struct. The caller must free the memory when the struct is not needed (using the C++ delete operator). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The callee must allocate a new struct using the C++ operator new, change any member as needed, and store the pointer to the allocated struct in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous struct will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
=== Repeated: sequence ===&lt;br /&gt;
&lt;br /&gt;
The sequences are mapped to C++ classes.&lt;br /&gt;
&lt;br /&gt;
Examples: See array operators and the get_buffer functions for examples of the sequence usage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To dynamically allocate and deallocate a sequence, one can use the new and delete C++ operators. The buffer used by the sequence is managed automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequence will be sent as const MySequenceDataType&amp;amp;, so the caller needs a variable of that sequence to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the sequence is const MySequenceDataType&amp;amp;, the callee cannot change it. Note that the sequence could be empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned sequence. The caller must free the memory when the array is not needed, using the C++ delete operator. The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The callee must allocate a new sequence using the C++ new operator. After the allocation, change the content as needed, and store the pointer to the allocated sequence in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous sequence will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
Warning: The callee can return a empty sequence, but not a NULL pointer (assigning a NULL pointer to the output parameter is not valid).&lt;br /&gt;
&lt;br /&gt;
Using the output parameter:&lt;br /&gt;
&lt;br /&gt;
	After assigning a pointer to the output parameter, the callee can use the pointed sequence as usual, but one must remember that the parameter is a pointer, not a sequence. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
out_seq = new BABEL::MyModule::MyStringSequenceDataType();&lt;br /&gt;
out_seq-&amp;gt;length(1); // use -&amp;gt; instead of .&lt;br /&gt;
(*out_seq)[0] = BABEL::string_dup(&amp;quot;my string&amp;quot;); // use (*out_seq)[index] instead of out_seq[index]&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repeated: array ===&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef float MyLongA[8];&lt;br /&gt;
typedef string MyStrA[4][12];&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Float MyLongA[8];&lt;br /&gt;
typedef BABEL::Float MyLongA_slice;&lt;br /&gt;
typedef /* string manager class */ MyStrA[4][12];&lt;br /&gt;
typedef /* string manager class */ MyStrA_slice[12];&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::MyLongA)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; The T_slice data type &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The T_slice data type (e.g.: MyLongA_slice, MyStrA_slice) has the same element type and the same dimensions as the original except the first one. T_slice can be used to declare pointers to an array, since C++ declares array pointers as pointers to the first element of.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA a; // an array of MyLongA type&lt;br /&gt;
BABEL::MyModule::MyLongA_slice* ptr = a; // a pointer to an array of MyLongA type&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning:&lt;br /&gt;
	&lt;br /&gt;
The T_slice data type for arrays with different first dimension lengths is the same. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef long A[16][8][2];&lt;br /&gt;
typedef long B[4][8][2];&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Long A[16][8][2];&lt;br /&gt;
typedef BABEL::Long A_slice[8][2];&lt;br /&gt;
typedef BABEL::Long B[4][8][2];&lt;br /&gt;
typedef BABEL::Long B_slice[8][2]; // the same data type as A_slice&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::A)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That means that a pointer to A (A_slice*) is compatible with a pointer to B (B_slice*), and the user could use a pointer of one of them as if it were a pointer to the other. That is a grave error (usually leads to core dump), but the C++ compiler will compile the code without issuing a warning message.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Static allocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A statically allocated array can be created by using its data type name, as any C++ data type. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA v1;&lt;br /&gt;
BABEL::MyModule::MyStrA v2;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. When the variable goes out of scope (e.g.: the function that declares it ends) all used memory is freed (strings, sequences, arrays, ...).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Dynamic allocation and deallocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	To dynamically allocate and deallocate an array, one cannot use the new and delete operators or its array versions (new T[] and delete[] ptr). To allocate an array, use the T_alloc function (e.g.: BABEL::MyModule::MyLongA_alloc(), BABEL::MyModule::MyStrA_alloc()). If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. To deallocate an array, use T_free (e.g.: BABEL::MyModule::MyLongA_free(), BABEL::MyModule::MyStrA_free()).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_alloc()&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a T array and returns a pointer to it or NULL if there is not enough memory. Note that the user must free the array when it is not needed anymore. To free the array, use the T_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_free(T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a T array allocated by T_alloc() or T_dup() (see &amp;quot;Copy and duplication&amp;quot;). p is the array to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Copy and duplication &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_copy(T_slice* to, const T_slice* from)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copies the contents of the from array to the to array. If from or to or both are NULL, the function does nothing. The parameters can be statically or dynamically allocated (or one of each kind). An example of this function could be BABEL::MyModule::MyLongA_copy().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_dup(const T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a new array of the T type, copies the contents of the p array into it and then returns a pointer to it. The caller must free the array using T_free() described in &amp;quot;Dynamic allocation and deallocation&amp;quot;. If there is not enough memory or if p is NULL, the returned pointer will be NULL. An example of this function could be BABEL::MyModule::MyLongA_dup()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Array usage &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The BDL arrays can be used as C++ arrays except for:&lt;br /&gt;
&lt;br /&gt;
* Dynamic allocation and deallocation must be done using T_alloc() and T_free().&lt;br /&gt;
* The arrays can be copied or duplicated using T_copy() and T_dup().&lt;br /&gt;
* The usage of the elements stored in the array must follow the element data type usage.&lt;br /&gt;
* Any embedded string is initialized to &amp;quot;&amp;quot; (instead of NULL or no initialization at all).&lt;br /&gt;
&lt;br /&gt;
The [ ] operator can be used as usual with BDL arrays.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long value;&lt;br /&gt;
	string name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef MyStruct MyArray[8][2];&lt;br /&gt;
// MyArray is variable-length because of the string member &amp;quot;name&amp;quot; of its element data type&lt;br /&gt;
&lt;br /&gt;
// C++&lt;br /&gt;
int i;&lt;br /&gt;
BABEL::MyModule::MyArray a; // a statically allocated array&lt;br /&gt;
&lt;br /&gt;
a[2][1].name = BABEL::string_dup(&amp;quot;this member will not be an empty string&amp;quot;);&lt;br /&gt;
for(i=0; i&amp;lt;8; i++) a[i][0].value=a[i][1].value=i;&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_slice* b; // a dynamically allocated array&lt;br /&gt;
BABEL::MyModule::MyArray_slice* c; // another dynamically allocated array&lt;br /&gt;
&lt;br /&gt;
b = BABEL::MyModule::MyArray_alloc(); // dynamically allocates the array&lt;br /&gt;
BABEL::MyModule::MyArray_copy(b,a); // copy a into b (b=a)&lt;br /&gt;
c = BABEL::MyModule::MyArray_dup(b); // dynamically allocates an array and copies the contents of b&lt;br /&gt;
c[2][1].name = BABEL::string_dup(&amp;quot;c&amp;quot;); // a and b will not be changed&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_free(b); // dynamically frees the b array&lt;br /&gt;
BABEL::MyModule::MyArray_free(c); // dynamically frees the c array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length array data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
An array is variable-length if its element data type is variable-length (contains strings or sequences, directly or recursively). If it does not, the array is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
One must know if an array is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; An array as an input (in) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The array will be sent as const MyArrayDataType, so the caller needs a variable of that array to use it as an input parameter of a service. Note that for C++, the const MyArrayDataType is equivalent to const MyArrayDataType_slice*.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;An array as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the array is const MyArrayDataType, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The caller needs a (dynamically/statically) allocated array of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee, and the caller keeps the ownership (must free the array when not needed). Note that the fixed-length array is allocated by the caller, not by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A fixed-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. Please, see the documentation of the element data type (string, sequence, others...) to know how to do the assignment. Note that the array was allocated by the caller, and the callee cannot reallocate it (the callee does not have a reference to the array pointer).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned array. The caller must free the memory when the array is not needed, using T_free() (e.g.: MyArrayDataType_free()). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be a class that behaves as a MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The callee must allocate a new array using T_alloc() (e.g.: BABEL::MyModule::MyArrayDataType_alloc()). After the allocation, change the content as needed, and store the pointer to the allocated array in the output parameter. The initial value of the output parameter is undefined and must not be used or freed.&lt;br /&gt;
&lt;br /&gt;
Warning: The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous array will not be freed. If you do not assign any pointer to it (or if you assign the  NULL pointer), the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using T_free() and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Usage of the variable-length array output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After assigning a pointer to the output parameter, the callee can use the pointed array, but there are some rules. You can retrieve the stored pointer (a MyArrayDataType_slice*) using the method ptr() of the output parameter class. For example (the BABEL module is called &amp;quot;MyModule&amp;quot;, and the variable-length array output parameter is &amp;quot;arr_out&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// Allocate the array and assign it to the output parameter:&lt;br /&gt;
arr_out = BABEL::MyModule::arr_alloc(); &lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 1):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out.ptr(); // gets the pointer stored in arr_out&lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 2):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out; // gets the pointer without using ptr()  &lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Access to array elements:&lt;br /&gt;
arr_out.ptr()[4][8] = arr_out.ptr()[1][2] + arr_out.ptr()[3][7]; // Ok&lt;br /&gt;
&lt;br /&gt;
// This is not valid:&lt;br /&gt;
arr_out[4][8] = arr_out[1][2] + arr_out[3][7]; // Error: use ptr()&lt;br /&gt;
(*arr_out)[4][8] = (*arr_out)[1][2] + (*arr_out)[3][7]; // Error: use ptr()&lt;br /&gt;
	&lt;br /&gt;
// Recommended usage:&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = BABEL::MyModule::arr_alloc(); // allocates the array in a temporal variable.&lt;br /&gt;
// One can duplicate an array instead of allocating a default initialized one.&lt;br /&gt;
arr_out = arr_ptr; // arr_out and arr_ptr points to the same array (the one to be returned)&lt;br /&gt;
arr_ptr[1][2] = arr_ptr[3][3] + arr_ptr[4][4]; // use the temporal variable to do any changes to the array&lt;br /&gt;
// When the function ends, arr_ptr returns the array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others: enum ===&lt;br /&gt;
&lt;br /&gt;
The enum data type is mapped directly to a C++ enum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
enum MyEnum {one, two, three};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
enum MyEnum {one, two, three}; // the full name for using it will be: BABEL::MyModule::MyEnum&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using enum as service parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The enum data types are mapped as datatype (shown above) when used as input parameters in services, and as datatype&amp;amp; when used as output. For example, a service &amp;quot;MyOp&amp;quot; with an input and output parameters (a_in and b_out) of the enumerated &amp;quot;MyEnum&amp;quot; can be considered as though it is translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class uninteresting for the user&amp;gt;::MyOp(BABEL::MyModule::MyEnum a_in, BABEL::MyModule::MyEnum&amp;amp; b_out);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the enum is passed by value, the caller can use a variable or a constant enumerator (an enumerated value) of the same translated type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter as expected, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the enumerated type, so the caller must use a variable of the translated enumerated type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others: string ===&lt;br /&gt;
&lt;br /&gt;
Strings of BDL are translated into (possibly &amp;#039;&amp;#039;&amp;#039;const&amp;#039;&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;char *&amp;#039;&amp;#039;&amp;#039; of C++ if they appear directly as types of some input/output parameter of a service. They can be also defined as variables in the logic of some service in this way: &amp;#039;&amp;#039;&amp;#039;BABEL::String str;&amp;#039;&amp;#039;&amp;#039;. In both cases, the helper functions described below apply. &lt;br /&gt;
&lt;br /&gt;
However, when a BDL string type appears as the type of a field of a composed public type of a module, it is not translated into a &amp;#039;&amp;#039;&amp;#039;BABEL::String&amp;#039;&amp;#039;&amp;#039; type. In that case, it is translated into a special object that can use &amp;#039;&amp;#039;&amp;#039;BABEL::string_dup&amp;#039;&amp;#039;&amp;#039; for assignment, but it &amp;#039;&amp;#039;&amp;#039;cannot&amp;#039;&amp;#039;&amp;#039; use &amp;#039;&amp;#039;&amp;#039;BABEL::string_free&amp;#039;&amp;#039;&amp;#039; for deletion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Helper functions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_alloc(BABEL::ULong len)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allocates space for a string. The allocated size will be len+1 (so the allocated buffer has enough space for the trailing 0). Return: The allocated buffer or NULL if there is not enough memory. Note that the user must free the buffer when it is not needed anymore (or assigned to an object that do so). To free the buffer, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_dup(const char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Duplicates a string. c is the string to be duplicated. The return value is the duplicated string or NULL if there is not enough memory. If c is NULL, the return value will be NULL. The allocated size will be strlen(c)+1 using BABEL::string_alloc(strlen(c)). Note that the user must free the string when it is not needed anymore (or assigned to an object that do so). To free the string, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void BABEL::string_free(char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a string allocated by BABEL::string_alloc() or BABEL::string_dup(). c is the string to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use a const char* or a char*  (will be treated as a const char*) for passing a string (an embedded string is also valid). Passing a NULL pointer is not allowed and the outcome is undefined. The caller keeps the string ownership.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use the parameter as a const char* (it should not be NULL).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Use a char* variable as parameter (the parameter is a class that behaves as a char*&amp;amp;). The variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter. The returned value can be &amp;quot;&amp;quot; but never NULL. When you do not need the returned string anymore, you must delete it using BABEL::string_free() as described earlier (do not use delete/delete[] to free it). &lt;br /&gt;
&lt;br /&gt;
Also, you can pass as output parameter a string which is part of a composed type. In that case the current string will be automatically freed. For example, if you have a service &amp;quot;MyOp&amp;quot; with an output parameter &amp;quot;string s&amp;quot;, you can pass as that parameter the following: &amp;quot;MyStruct.stringfield&amp;quot;, provided that MyStruct is a variable of some struct type that contains a field (&amp;quot;stringfield&amp;quot;) of type string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter will be a class that behaves as a char*&amp;amp;. The callee must do the assignment to a string output parameter once and only once. If you do it more than once, the previous string will not be freed. If you do not assign any string to it, the parameter value will be undefined and that is an error. However, the following is valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class that is not interesting for the user&amp;gt;::MyOperation(/*out string parameter data type*/ str)&lt;br /&gt;
	{&lt;br /&gt;
		str = BABEL::string_dup(&amp;quot;Unknown&amp;quot;);&lt;br /&gt;
		if(/*...*/) {&lt;br /&gt;
			BABEL::string_free(str); // free the previous string&lt;br /&gt;
			str = BABEL::string_dup(&amp;quot;Ok&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: An output string parameter does not behaves as an embedded string. As stated before, each assignment overwrites the previous string without freeing it.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
When assigning a char* value to an output string parameter, the parameter will own that pointer without making a duplicate of the string, so that string should be created through BABEL::string_dup() or BABEL::string_alloc(), because it will be eventually freed using BABEL::string_free() (if it was created by new or anything else, a typecast to const char* is needed).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a const char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you assign a value using a const char*, the string will be duplicated with BABEL::string_dup(). Please, note that some compilers (non ANSI/ISO C++ compliant) treats literal strings as char*, not as const char*, so it is preferred to use str = (const char*)&amp;quot;literal string&amp;quot; or str = BABEL::string_dup(&amp;quot;literal string&amp;quot;) instead of str = &amp;quot;literal string&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning an embedded string:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The direct assignment of an embedded string to an output string parameter is not allowed. Please, use string_dup() to do the assignment. E.g: out_str_arg = BABEL::string_dup(my_struct.my_embedded_str).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using the output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After a string is assigned to the output parameter, you can use the parameter as a char*. The [ ] operator is available for read and write, but one sould take care not to use an index out of the string allocated buffer. The string can be modified and shortened but not enlarged. To enlarge a string you must allocate a larger buffer using BABEL::string_alloc(). If you assign a new buffer to the output parameter, remember to free the previous one using BABEL::string_free().&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// This service has an input string parameter, str_in, and an output string parameter, str_out.&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::Echo(const char* str_in, /* the string output class */ str_out) &lt;br /&gt;
{&lt;br /&gt;
	str_out = BABEL::string_dup(str_in); // duplicates str_in and returns the copy in str_out&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = str_in; // duplicates str_in and returns the copy in str_out (the same as above)&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = &amp;quot;str&amp;quot;; // duplicates &amp;quot;str&amp;quot; and returns the copy in str_out. However, str_out = (const char*)&amp;quot;str&amp;quot; is preferred.&lt;br /&gt;
&lt;br /&gt;
	//str_out = new char[1]; str_out[0]=0; // thar is an error: the string must be allocated using string_dup() or string_alloc().&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::GetName(const MyContactStruct&amp;amp; contact_in, /* the string output class */ name_out)&lt;br /&gt;
{&lt;br /&gt;
	name_out = BABEL::string_dup(contact_in.name); // copies contact_in.name and returns the copy in name_out&lt;br /&gt;
	//name_out = contact_in.name; // that is an error (*)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(*): contact_in.name is an embedded string. This assignment is not allowed. The user must use the prior line to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
An alias for a data type created by the BDL typedef keyword behaves as the original data type. For example, an alias for an array should be treated as if that alias was an original array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The BDL constants are mapped to equivalent C++ constants. To use a constant one must add BABEL::MyModule:: before the name of the constant (&amp;quot;MyModule&amp;quot; is the name of the BABEL module). Thus, the constant PI should be referenced in C++ as BABEL::MyModule::PI.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
static const BABEL::Float PI=3.14159265;&lt;br /&gt;
static const BABEL::Char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
static const char* LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=690</id>
		<title>Documentation:BDL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:BDL&amp;diff=690"/>
		<updated>2011-02-16T13:59:38Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Repeated (sequence, array) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;BABEL Definition Language (BDL) &amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
v. 120606&lt;br /&gt;
&lt;br /&gt;
A data definition language for the BABEL development system.&lt;br /&gt;
&lt;br /&gt;
System Engineering and Automation Department.&lt;br /&gt;
&lt;br /&gt;
University of Málaga, Spain.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What is BDL?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
BDL (Babel Definition Language) is the medium for specifying, in a programming-language independent fashion, some data types that a BABEL module needs. BDL has been implemented as a restricted subset of one of the most extended definition languages: the OMG CORBA IDL (http://www.omg.org).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Where the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
It is used currently for defining input/output parameters of services and for providing public definitions (data types that the module provides to other modules and to itself). You can use BDL types both in the &amp;quot;Public Definitions&amp;quot; of the module and in the specification of the input/output parameters of the services. You can compose your own types (using &amp;quot;typedef&amp;quot;) based on BDL basic or composed types.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;What the BDL types are used for?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You can use a variable of a BDL type in the following situations:&lt;br /&gt;
	A) Creating a local variable for the internal use of some logic of the module (auxiliary logic, service logic, start-up logic, etc.).&lt;br /&gt;
	B) Creating a global variable for the internal status of the module (accessible from any logic of the module).&lt;br /&gt;
	C) Using an already defined input/output parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How variables of the BDL types are used?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You should remember that BDL is not a programming language (only a specification for data), and thus, you cannot use directly any BDL type in your codification logics. Rather, BABEL translates automatically for you the BDL types into types understandable by the codification language you have chosen for your module (see for example the Using BDL in the C++ codification language section).&lt;br /&gt;
&lt;br /&gt;
= BABEL Definition Language (BDL) =&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Numeric (octet, short, long, ...) === &lt;br /&gt;
&lt;br /&gt;
BDL includes the following basic numeric types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039; : 8-bit, unsigned (0...2^8-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;short&amp;#039;&amp;#039;&amp;#039; : 16-bit, signed (-2^15...2^15-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned short&amp;#039;&amp;#039;&amp;#039; : 16-bit, unsigned (0...2^16-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long&amp;#039;&amp;#039;&amp;#039; : 32-bit, signed (-2^31...2^31-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long&amp;#039;&amp;#039;&amp;#039;	: 32-bit, unsigned (0...2^32-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;long long&amp;#039;&amp;#039;&amp;#039; (*)	:  64-bit, signed (-2^63...2^63-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;unsigned long long&amp;#039;&amp;#039;&amp;#039; (*) : 64-bit, unsigned (0...-2^64-1)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;float&amp;#039;&amp;#039;&amp;#039; : IEEE single-precision floating point numbers.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;double&amp;#039;&amp;#039;&amp;#039; : IEEE double-precision floating point numbers.&lt;br /&gt;
&lt;br /&gt;
(*): The 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way, so its use should be avoided.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alphanumeric (char) === &lt;br /&gt;
&lt;br /&gt;
BDL has only one basic alphanumeric type:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; : One unsigned 8-bits character.&lt;br /&gt;
&lt;br /&gt;
There is also one composed alphanumeric type: string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others (boolean) ===&lt;br /&gt;
	&lt;br /&gt;
BDL includes one basic type for logical operations:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039; : Stores a boolean value (TRUE or FALSE)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed type that does not contain more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Structs&amp;#039;&amp;#039;&amp;#039;: They are analogous to C structs, and can contain both basic and composed types fields. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	short FieldOne;&lt;br /&gt;
	double FieldTwo;&lt;br /&gt;
	OtherStructName osn;&lt;br /&gt;
} MyVarStruct;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;union&amp;#039;&amp;#039;&amp;#039; data type is not supported currently in BDL.&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repeated (sequence, array) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes the following composed types that can hold more than one occurrence of an object:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sequences&amp;#039;&amp;#039;&amp;#039;: An ordered list of elements of the same type (maybe composed). A maximum limit of elements can be specified, or not. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct LimitedAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;&lt;br /&gt;
	sequence&amp;lt;Account&amp;gt; accounts; // No maximum length of sequence.&lt;br /&gt;
	sequence&amp;lt;Account,50&amp;gt; accountsBis; // 50 is the maximum length of sequence.&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Do not use sequences of octects to communicate serialized objects from one module to another: that means that you are forcing any receiver to use the same objects definition, tying them to your needs. Use only sequences of octects to pack together data that either has no structure or its structure is common knowledge -no additional libraries needed to handle it-.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Arrays&amp;#039;&amp;#039;&amp;#039;: Fixed-length indexed sets of elements of the same type (maybe composed). For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct SomeAccounts &lt;br /&gt;
{&lt;br /&gt;
	string bankSortCode&amp;lt;10&amp;gt;;  // string of length 10&lt;br /&gt;
	Account accounts[10][2];   // array of dimensions 10x2&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others (enum, string) ===&lt;br /&gt;
&lt;br /&gt;
BDL includes these other composed types:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Enumerated&amp;#039;&amp;#039;&amp;#039;: The enumeration of several constants. No numeric equivalence should be assumed. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
enum Currency {pound, dollar, yen, franc};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Strings&amp;#039;&amp;#039;&amp;#039;: Sequences of characters of 8 bits each. They can be given a fixed maximum length. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStructName&lt;br /&gt;
{&lt;br /&gt;
	string&amp;lt;10&amp;gt;  MyString;   // A string that can store no more than 10 characters&lt;br /&gt;
	string MyString2;   // A string without maximum length&lt;br /&gt;
} MyStructVar;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;typedef&amp;#039;&amp;#039;&amp;#039; keyword has been introduced to define array data types, but it also can be used to define alias for already defined data types.&lt;br /&gt;
&lt;br /&gt;
The syntax is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
typedef &amp;lt; an already defined data type &amp;gt; &amp;lt; an alias for that type &amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long A;&lt;br /&gt;
	string B;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct MyStruct MyAliasForMyStruct;&lt;br /&gt;
typedef unsigned long MyAliasForUnsignedLong;&lt;br /&gt;
&lt;br /&gt;
typedef sequence&amp;lt;short, 50&amp;gt; ShortListType; &lt;br /&gt;
typedef sequence&amp;lt;long&amp;gt; LongListType; &lt;br /&gt;
&lt;br /&gt;
typedef short ShortArrayType[50][10]; &lt;br /&gt;
&lt;br /&gt;
typedef enum MyCurrency {pound, dollar, yen, franc} OtherCurrency;&lt;br /&gt;
&lt;br /&gt;
typedef string&amp;lt;10&amp;gt;  MyStringType;   &lt;br /&gt;
typedef string MyString;   &lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The way of defining constants in BDL is:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const &amp;lt;type&amp;gt; &amp;lt;const name&amp;gt; = &amp;lt;value&amp;gt;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predefined types ==&lt;br /&gt;
&lt;br /&gt;
A few types are predefined so they can be readily used by any BABEL module. Their translation into the generated source code language follows the same rules as though they were defined by the user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	typedef sequence&amp;lt;string&amp;gt; SeqOfStrings;&lt;br /&gt;
	typedef sequence&amp;lt;octet&amp;gt; SeqOfBytes;&lt;br /&gt;
	typedef sequence&amp;lt;boolean&amp;gt; SeqOfBools;&lt;br /&gt;
	typedef sequence&amp;lt;float&amp;gt; SeqOfFloats;&lt;br /&gt;
	typedef sequence&amp;lt;double&amp;gt; SeqOfDoubles;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;short&amp;gt; SeqOfShorts;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned short&amp;gt; SeqOfUShorts;&lt;br /&gt;
	typedef sequence&amp;lt;long&amp;gt; SeqOfLongs;&lt;br /&gt;
	typedef sequence&amp;lt;unsigned long&amp;gt; SeqOfULongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef sequence&amp;lt;unsigned long long&amp;gt; SeqOfULongLongs;&lt;br /&gt;
	 &lt;br /&gt;
	typedef double TMatrix22[2][2];&lt;br /&gt;
	typedef double TMatrix33[3][3];&lt;br /&gt;
	typedef double TMatrix44[4][4];&lt;br /&gt;
	typedef double TMatrix66[6][6];	&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=  Using BDL in C++ codification language =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed-length and variable-length data types ==&lt;br /&gt;
&lt;br /&gt;
The implementation and usage of the BDL data types can be different if the data type is fixed-length or variable-length.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed-length data types ===&lt;br /&gt;
&lt;br /&gt;
* octet&lt;br /&gt;
* short&lt;br /&gt;
* unsigned short&lt;br /&gt;
* long&lt;br /&gt;
* unsigned long&lt;br /&gt;
* long long&lt;br /&gt;
* unsigned long long&lt;br /&gt;
* float&lt;br /&gt;
* double&lt;br /&gt;
* char&lt;br /&gt;
* boolean&lt;br /&gt;
* enum&lt;br /&gt;
&lt;br /&gt;
=== Variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
* Bounded and unbounded string&lt;br /&gt;
* Bounded and unbounded sequence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data types that can be fixed-length or variable-length === &lt;br /&gt;
&lt;br /&gt;
* A struct is fixed-length if all its members are fixed-length. It is variable-length if one or more of its members are variable-length.&lt;br /&gt;
* An array is fixed-length if its base type is fixed-length. If its base type is variable-length, then the array is variable-length.&lt;br /&gt;
&lt;br /&gt;
Note: A variable-length array is not an array with a variable number of elements; it is an array with a variable-length element data type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== First consideration: fixed-length and variable-length data types ===&lt;br /&gt;
&lt;br /&gt;
The first issue when BDL types are translated into C++ is that &amp;#039;&amp;#039;&amp;#039;service output parameters&amp;#039;&amp;#039;&amp;#039; are translated as reference (DataType &amp;amp;) for fixed-length data types, but as a reference to a pointer (DataType *&amp;amp;) for variable-length data types. For variable-length data types, there is also the need to manage the allocation and deallocation of its memory (BABEL does not provide code for that). For specific information, see the documentation for each data type under Usage of BDL in C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// All of this is BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct (float and long are fixed-length)&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct (the data member contains a string)&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef long FArrA[8][3]; // A fixed-length array (long is fixed-length)&lt;br /&gt;
typedef FStrA FArrB[8]; // A fixed-length array (FStrA is fixed-length)&lt;br /&gt;
typedef string&amp;lt;10&amp;gt; VArrC[7]; // A variable-length array (a bounded string is variable-length)&lt;br /&gt;
typedef VStrB VArrD[12]; // A variable-length array (VStrB is variable-length)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic types ==&lt;br /&gt;
&lt;br /&gt;
All the basic types are mapped to types defined in the portable namespace &amp;quot;BABEL&amp;quot; (this is done indepently on the codification language chosen), with functionalities that are indistinguishable from native C++ types. However, &amp;#039;&amp;#039;&amp;#039;octet&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;char&amp;#039;&amp;#039;&amp;#039; may be mapped to the same native C++ type, so any overloaded function that is overloaded solely on these types should be avoided. Also, the 64-bit integer types (long long and unsigned long long) could not be available in some implementations, being mapped in an undefined way.&lt;br /&gt;
&lt;br /&gt;
=== Translation of basic BDL data types to C++ ===&lt;br /&gt;
&lt;br /&gt;
Numeric:&lt;br /&gt;
&lt;br /&gt;
* octet: BABEL::Octet&lt;br /&gt;
* short: BABEL::Short&lt;br /&gt;
* unsigned short: BABEL::UShort&lt;br /&gt;
* long: BABEL::Long&lt;br /&gt;
* unsigned long: BABEL::ULong&lt;br /&gt;
* long long: BABEL::LongLong&lt;br /&gt;
* unsigned long long: BABEL::ULongLong&lt;br /&gt;
* float: BABEL::Float&lt;br /&gt;
* double: BABEL::Double&lt;br /&gt;
&lt;br /&gt;
Alphanumeric:&lt;br /&gt;
&lt;br /&gt;
* char: BABEL::Char&lt;br /&gt;
&lt;br /&gt;
Others:&lt;br /&gt;
&lt;br /&gt;
* boolean: BABEL::Boolean. &lt;br /&gt;
&lt;br /&gt;
There are two predefined boolean constants:&lt;br /&gt;
- BABEL::True&lt;br /&gt;
- BABEL::False&lt;br /&gt;
&lt;br /&gt;
One can use a BABEL::Boolean variable as a C++ bool type, but it can be defined as another type. You can compare a Boolean value with BABEL::False, but the comparison with BABEL::True should be avoided (use v!=BABEL::False or !v instead of v==BABEL::True).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using basic data types as service parameters === &lt;br /&gt;
&lt;br /&gt;
The basic data types are mapped as BABEL::datatype (as shown above) when used as input parameters in services, and as BABEL::datatype&amp;amp; when used as output. For example, a  service &amp;quot;MyOp&amp;quot; with the input parameters &amp;quot;char ch&amp;quot; and &amp;quot;long lg&amp;quot; and the output parameters &amp;quot;boolean bl&amp;quot; and &amp;quot;float fl&amp;quot; can be considered as though it was translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void &amp;lt;some class not interesting for the user&amp;gt;::MyOp(BABEL::Char ch, BABEL::Long lg, BABEL::Boolean&amp;amp; bl, BABEL::Float&amp;amp; fl);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the data type is passed by value, the caller can use for it a local variable, constant, or expression.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the data type, so the caller must use a variable (defined in the caller) of the corresponding translated data type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Composed Types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Not-Repeated (struct) ===&lt;br /&gt;
&lt;br /&gt;
The struct data type is mapped to a C++ struct with equivalent members.&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	float f;&lt;br /&gt;
	long c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct&lt;br /&gt;
	string name; // the struct is variable-length because of this string member&lt;br /&gt;
	unsigned short age;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
struct FStrA { // a fixed-length struct&lt;br /&gt;
	BABEL::Float f;&lt;br /&gt;
	BABEL::Long c;&lt;br /&gt;
}; // Full name: BABEL::MyModule::FStrA&lt;br /&gt;
&lt;br /&gt;
struct VStrB { // a variable-length struct (because of the string member)&lt;br /&gt;
	/* string manager class */ name; // the class name is not defined and should not be used&lt;br /&gt;
	BABEL::UShort age;&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrB&lt;br /&gt;
&lt;br /&gt;
struct VStrC { // another variable length struct&lt;br /&gt;
	BABEL::Long x;&lt;br /&gt;
	VStrB data; // the struct is variable-length because of this variable-length struct member&lt;br /&gt;
}; // Full name: BABEL::MyModule::VStrC&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct can be dynamically allocated and deallocated using C++ new and delete operators. If the struct contains any strings (directly or inside another contained data type) then, the strings will be initialized to &amp;quot;&amp;quot; instead of NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deep copy of struct variables&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	When you use the assignment operator (=), the struct is deep copied. Any allocated memory will be duplicated, so one can change a copied or original struct without changing the other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length struct data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	A struct is variable-length if it contains strings or sequences (directly as a member or recursively). If it does not, the struct is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
	One must know if a struct is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The struct will be sent as const MyStructDataType&amp;amp;, so the caller needs a variable of that struct to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A struct as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	Since the input struct is const MyStructDataType&amp;amp;, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp; so the caller needs a variable of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType&amp;amp;. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. The callee can set the parameter&amp;#039;s value assigning another struct of the same type or by setting all of its members. Please, see the documentation of the data type (string, sequence, others...) to know how to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned struct. The caller must free the memory when the struct is not needed (using the C++ delete operator). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A variable-length struct as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	The parameter type will be MyStructDataType*&amp;amp; (not MyStructDataType&amp;amp; used with fixed-length structs). The callee must allocate a new struct using the C++ operator new, change any member as needed, and store the pointer to the allocated struct in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous struct will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
=== Repeated: sequence ===&lt;br /&gt;
&lt;br /&gt;
The sequences are mapped to C++ classes.&lt;br /&gt;
&lt;br /&gt;
Examples: See array operators and the get_buffer functions for examples of the sequence usage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dynamic allocation and deallocation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To dynamically allocate and deallocate a sequence, one can use the new and delete C++ operators. The buffer used by the sequence is managed automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The sequence will be sent as const MySequenceDataType&amp;amp;, so the caller needs a variable of that sequence to use it as an input parameter of a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the sequence is const MySequenceDataType&amp;amp;, the callee cannot change it. Note that the sequence could be empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned sequence. The caller must free the memory when the array is not needed, using the C++ delete operator. The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A sequence as an output (out) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MySequenceDataType*&amp;amp;. The callee must allocate a new sequence using the C++ new operator. After the allocation, change the content as needed, and store the pointer to the allocated sequence in the output parameter. The initial value of the output parameter is undefined and must not be used or freed. The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous sequence will not be freed. If you do not assign any pointer to it, the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using delete and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
Warning: The callee can return a empty sequence, but not a NULL pointer (assigning a NULL pointer to the output parameter is not valid).&lt;br /&gt;
&lt;br /&gt;
Using the output parameter:&lt;br /&gt;
&lt;br /&gt;
	After assigning a pointer to the output parameter, the callee can use the pointed sequence as usual, but one must remember that the parameter is a pointer, not a sequence. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
out_seq = new BABEL::MyModule::MyStringSequenceDataType();&lt;br /&gt;
out_seq-&amp;gt;length(1); // use -&amp;gt; instead of .&lt;br /&gt;
(*out_seq)[0] = BABEL::string_dup(&amp;quot;my string&amp;quot;); // use (*out_seq)[index] instead of out_seq[index]&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repeated: array ===&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef float MyLongA[8];&lt;br /&gt;
typedef string MyStrA[4][12];&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Float MyLongA[8];&lt;br /&gt;
typedef BABEL::Float MyLongA_slice;&lt;br /&gt;
typedef /* string manager class */ MyStrA[4][12];&lt;br /&gt;
typedef /* string manager class */ MyStrA_slice[12];&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::MyLongA)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; The T_slice data type &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The T_slice data type (e.g.: MyLongA_slice, MyStrA_slice) has the same element type and the same dimensions as the original except the first one. T_slice can be used to declare pointers to an array, since C++ declares array pointers as pointers to the first element of.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA a; // an array of MyLongA type&lt;br /&gt;
BABEL::MyModule::MyLongA_slice* ptr = a; // a pointer to an array of MyLongA type&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning:&lt;br /&gt;
	&lt;br /&gt;
The T_slice data type for arrays with different first dimension lengths is the same. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
typedef long A[16][8][2];&lt;br /&gt;
typedef long B[4][8][2];&lt;br /&gt;
// C++&lt;br /&gt;
typedef BABEL::Long A[16][8][2];&lt;br /&gt;
typedef BABEL::Long A_slice[8][2];&lt;br /&gt;
typedef BABEL::Long B[4][8][2];&lt;br /&gt;
typedef BABEL::Long B_slice[8][2]; // the same data type as A_slice&lt;br /&gt;
// Their full names begins with &amp;quot;BABEL::MyModule::&amp;quot; (e.g.: BABEL::MyModule::A)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That means that a pointer to A (A_slice*) is compatible with a pointer to B (B_slice*), and the user could use a pointer of one of them as if it were a pointer to the other. That is a grave error (usually leads to core dump), but the C++ compiler will compile the code without issuing a warning message.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Static allocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A statically allocated array can be created by using its data type name, as any C++ data type. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
BABEL::MyModule::MyLongA v1;&lt;br /&gt;
BABEL::MyModule::MyStrA v2;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. When the variable goes out of scope (e.g.: the function that declares it ends) all used memory is freed (strings, sequences, arrays, ...).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Dynamic allocation and deallocation &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	To dynamically allocate and deallocate an array, one cannot use the new and delete operators or its array versions (new T[] and delete[] ptr). To allocate an array, use the T_alloc function (e.g.: BABEL::MyModule::MyLongA_alloc(), BABEL::MyModule::MyStrA_alloc()). If the element data type includes strings, they are initialized to &amp;quot;&amp;quot; instead of NULL. To deallocate an array, use T_free (e.g.: BABEL::MyModule::MyLongA_free(), BABEL::MyModule::MyStrA_free()).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_alloc()&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a T array and returns a pointer to it or NULL if there is not enough memory. Note that the user must free the array when it is not needed anymore. To free the array, use the T_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_free(T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a T array allocated by T_alloc() or T_dup() (see &amp;quot;Copy and duplication&amp;quot;). p is the array to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Copy and duplication &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void T_copy(T_slice* to, const T_slice* from)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copies the contents of the from array to the to array. If from or to or both are NULL, the function does nothing. The parameters can be statically or dynamically allocated (or one of each kind). An example of this function could be BABEL::MyModule::MyLongA_copy().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
T_slice *T_dup(const T_slice* p)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dynamically allocates a new array of the T type, copies the contents of the p array into it and then returns a pointer to it. The caller must free the array using T_free() described in &amp;quot;Dynamic allocation and deallocation&amp;quot;. If there is not enough memory or if p is NULL, the returned pointer will be NULL. An example of this function could be BABEL::MyModule::MyLongA_dup()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Array usage &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The BDL arrays can be used as C++ arrays except for:&lt;br /&gt;
&lt;br /&gt;
* Dynamic allocation and deallocation must be done using T_alloc() and T_free().&lt;br /&gt;
* The arrays can be copied or duplicated using T_copy() and T_dup().&lt;br /&gt;
* The usage of the elements stored in the array must follow the element data type usage.&lt;br /&gt;
* Any embedded string is initialized to &amp;quot;&amp;quot; (instead of NULL or no initialization at all).&lt;br /&gt;
&lt;br /&gt;
The [ ] operator can be used as usual with BDL arrays.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
struct MyStruct {&lt;br /&gt;
	long value;&lt;br /&gt;
	string name;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef MyStruct MyArray[8][2];&lt;br /&gt;
// MyArray is variable-length because of the string member &amp;quot;name&amp;quot; of its element data type&lt;br /&gt;
&lt;br /&gt;
// C++&lt;br /&gt;
int i;&lt;br /&gt;
BABEL::MyModule::MyArray a; // a statically allocated array&lt;br /&gt;
&lt;br /&gt;
a[2][1].name = BABEL::string_dup(&amp;quot;this member will not be an empty string&amp;quot;);&lt;br /&gt;
for(i=0; i&amp;lt;8; i++) a[i][0].value=a[i][1].value=i;&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_slice* b; // a dynamically allocated array&lt;br /&gt;
BABEL::MyModule::MyArray_slice* c; // another dynamically allocated array&lt;br /&gt;
&lt;br /&gt;
b = BABEL::MyModule::MyArray_alloc(); // dynamically allocates the array&lt;br /&gt;
BABEL::MyModule::MyArray_copy(b,a); // copy a into b (b=a)&lt;br /&gt;
c = BABEL::MyModule::MyArray_dup(b); // dynamically allocates an array and copies the contents of b&lt;br /&gt;
c[2][1].name = BABEL::string_dup(&amp;quot;c&amp;quot;); // a and b will not be changed&lt;br /&gt;
&lt;br /&gt;
BABEL::MyModule::MyArray_free(b); // dynamically frees the b array&lt;br /&gt;
BABEL::MyModule::MyArray_free(c); // dynamically frees the c array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fixed-length and variable-length array data types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
An array is variable-length if its element data type is variable-length (contains strings or sequences, directly or recursively). If it does not, the array is fixed-length. See fixed-length and variable-length data types for a detailed definition of fixed-length and variable length data types.&lt;br /&gt;
&lt;br /&gt;
One must know if an array is fixed-length or variable-length to know how to pass it as an output parameter of a service (an operation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; An array as an input (in) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The array will be sent as const MyArrayDataType, so the caller needs a variable of that array to use it as an input parameter of a service. Note that for C++, the const MyArrayDataType is equivalent to const MyArrayDataType_slice*.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;An array as an input (in) parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the array is const MyArrayDataType, the callee cannot change it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A fixed-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The caller needs a (dynamically/statically) allocated array of that struct to use it as an output parameter of a service. The initial content of the variable is ignored by the callee, and the caller keeps the ownership (must free the array when not needed). Note that the fixed-length array is allocated by the caller, not by the callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A fixed-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*. The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and that is an error. Please, see the documentation of the element data type (string, sequence, others...) to know how to do the assignment. Note that the array was allocated by the caller, and the callee cannot reallocate it (the callee does not have a reference to the array pointer).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (caller point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The caller needs a pointer variable to use it as an output parameter of a service. In that pointer variable, the service will store a pointer to the returned array. The caller must free the memory when the array is not needed, using T_free() (e.g.: MyArrayDataType_free()). The pointer variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A variable-length array as an output (out) parameter (callee point of view): &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter type will be a class that behaves as a MyArrayDataType_slice*&amp;amp; (not MyStructDataType_slice* used with fixed-length arrays). The callee must allocate a new array using T_alloc() (e.g.: BABEL::MyModule::MyArrayDataType_alloc()). After the allocation, change the content as needed, and store the pointer to the allocated array in the output parameter. The initial value of the output parameter is undefined and must not be used or freed.&lt;br /&gt;
&lt;br /&gt;
Warning: The caller must do the assignment to the output parameter once and only once. If you do it more than once, the previous array will not be freed. If you do not assign any pointer to it (or if you assign the  NULL pointer), the parameter value will be undefined and that is an error. However, the callee can assign a pointer, then delete it using T_free() and then assign a new pointer.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Usage of the variable-length array output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After assigning a pointer to the output parameter, the callee can use the pointed array, but there are some rules. You can retrieve the stored pointer (a MyArrayDataType_slice*) using the method ptr() of the output parameter class. For example (the BABEL module is called &amp;quot;MyModule&amp;quot;, and the variable-length array output parameter is &amp;quot;arr_out&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// Allocate the array and assign it to the output parameter:&lt;br /&gt;
arr_out = BABEL::MyModule::arr_alloc(); &lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 1):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out.ptr(); // gets the pointer stored in arr_out&lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Get the stored pointer (method 2):&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = arr_out; // gets the pointer without using ptr()  &lt;br /&gt;
//  arr_out keeps pointing to the array&lt;br /&gt;
&lt;br /&gt;
// Access to array elements:&lt;br /&gt;
arr_out.ptr()[4][8] = arr_out.ptr()[1][2] + arr_out.ptr()[3][7]; // Ok&lt;br /&gt;
&lt;br /&gt;
// This is not valid:&lt;br /&gt;
arr_out[4][8] = arr_out[1][2] + arr_out[3][7]; // Error: use ptr()&lt;br /&gt;
(*arr_out)[4][8] = (*arr_out)[1][2] + (*arr_out)[3][7]; // Error: use ptr()&lt;br /&gt;
	&lt;br /&gt;
// Recommended usage:&lt;br /&gt;
BABEL::MyModule::arr_slice* arr_ptr = BABEL::MyModule::arr_alloc(); // allocates the array in a temporal variable.&lt;br /&gt;
// One can duplicate an array instead of allocating a default initialized one.&lt;br /&gt;
arr_out = arr_ptr; // arr_out and arr_ptr points to the same array (the one to be returned)&lt;br /&gt;
arr_ptr[1][2] = arr_ptr[3][3] + arr_ptr[4][4]; // use the temporal variable to do any changes to the array&lt;br /&gt;
// When the function ends, arr_ptr returns the array&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others: enum ===&lt;br /&gt;
&lt;br /&gt;
The enum data type is mapped directly to a C++ enum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Translation example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
enum MyEnum {one, two, three};&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
enum MyEnum {one, two, three}; // the full name for using it will be: BABEL::MyModule::MyEnum&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using enum as service parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The enum data types are mapped as datatype (shown above) when used as input parameters in services, and as datatype&amp;amp; when used as output. For example, a service &amp;quot;MyOp&amp;quot; with an input and output parameters (a_in and b_out) of the enumerated &amp;quot;MyEnum&amp;quot; can be considered as though it is translated into the following C++ method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class uninteresting for the user&amp;gt;::MyOp(BABEL::MyModule::MyEnum a_in, BABEL::MyModule::MyEnum&amp;amp; b_out);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Since the enum is passed by value, the caller can use a variable or a constant enumerator (an enumerated value) of the same translated type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee can use and change the value of the input parameter as expected, but, since it was passed by value, the changes will not be sent back to the caller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The output parameter type is a reference to the enumerated type, so the caller must use a variable of the translated enumerated type to receive the output value. The initial value of this variable will be ignored by the callee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The callee must ignore the initial value of the output parameter (it can be different from the one passed by the caller), and must set a new value (at least once). If the caller does not set the value, then it will be undefined, and this is an error.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Others: string ===&lt;br /&gt;
&lt;br /&gt;
Strings of BDL are translated into (possibly &amp;#039;&amp;#039;&amp;#039;const&amp;#039;&amp;#039;&amp;#039;) &amp;#039;&amp;#039;&amp;#039;char *&amp;#039;&amp;#039;&amp;#039; of C++ if they appear directly as types of some input/output parameter of a service. They can be also defined as variables in the logic of some service in this way: &amp;#039;&amp;#039;&amp;#039;BABEL::String str;&amp;#039;&amp;#039;&amp;#039;. In both cases, the helper functions described below apply. &lt;br /&gt;
&lt;br /&gt;
However, when a BDL string type appears as the type of a field of a composed public type of a module, it is not translated into a &amp;#039;&amp;#039;&amp;#039;BABEL::String&amp;#039;&amp;#039;&amp;#039; type. In that case, it is translated into a special object that can use &amp;#039;&amp;#039;&amp;#039;BABEL::string_dup&amp;#039;&amp;#039;&amp;#039; for assignment, but it &amp;#039;&amp;#039;&amp;#039;cannot&amp;#039;&amp;#039;&amp;#039; use &amp;#039;&amp;#039;&amp;#039;BABEL::string_free&amp;#039;&amp;#039;&amp;#039; for deletion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Helper functions&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_alloc(BABEL::ULong len)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allocates space for a string. The allocated size will be len+1 (so the allocated buffer has enough space for the trailing 0). Return: The allocated buffer or NULL if there is not enough memory. Note that the user must free the buffer when it is not needed anymore (or assigned to an object that do so). To free the buffer, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
char * BABEL::string_dup(const char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Duplicates a string. c is the string to be duplicated. The return value is the duplicated string or NULL if there is not enough memory. If c is NULL, the return value will be NULL. The allocated size will be strlen(c)+1 using BABEL::string_alloc(strlen(c)). Note that the user must free the string when it is not needed anymore (or assigned to an object that do so). To free the string, use the BABEL::string_free() function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
void BABEL::string_free(char *c)&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frees a string allocated by BABEL::string_alloc() or BABEL::string_dup(). c is the string to be freed. It can be NULL (in that case the function does nothing).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use a const char* or a char*  (will be treated as a const char*) for passing a string (an embedded string is also valid). Passing a NULL pointer is not allowed and the outcome is undefined. The caller keeps the string ownership.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an input parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Just use the parameter as a const char* (it should not be NULL).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (caller point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Use a char* variable as parameter (the parameter is a class that behaves as a char*&amp;amp;). The variable value will be overwritten without freeing its content, so, make sure to free its contents before using it as an output parameter. The returned value can be &amp;quot;&amp;quot; but never NULL. When you do not need the returned string anymore, you must delete it using BABEL::string_free() as described earlier (do not use delete/delete[] to free it). &lt;br /&gt;
&lt;br /&gt;
Also, you can pass as output parameter a string which is part of a composed type. In that case the current string will be automatically freed. For example, if you have a service &amp;quot;MyOp&amp;quot; with an output parameter &amp;quot;string s&amp;quot;, you can pass as that parameter the following: &amp;quot;MyStruct.stringfield&amp;quot;, provided that MyStruct is a variable of some struct type that contains a field (&amp;quot;stringfield&amp;quot;) of type string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A string as an output parameter (callee point of view):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The parameter will be a class that behaves as a char*&amp;amp;. The callee must do the assignment to a string output parameter once and only once. If you do it more than once, the previous string will not be freed. If you do not assign any string to it, the parameter value will be undefined and that is an error. However, the following is valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
	void &amp;lt;some class that is not interesting for the user&amp;gt;::MyOperation(/*out string parameter data type*/ str)&lt;br /&gt;
	{&lt;br /&gt;
		str = BABEL::string_dup(&amp;quot;Unknown&amp;quot;);&lt;br /&gt;
		if(/*...*/) {&lt;br /&gt;
			BABEL::string_free(str); // free the previous string&lt;br /&gt;
			str = BABEL::string_dup(&amp;quot;Ok&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: An output string parameter does not behaves as an embedded string. As stated before, each assignment overwrites the previous string without freeing it.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
When assigning a char* value to an output string parameter, the parameter will own that pointer without making a duplicate of the string, so that string should be created through BABEL::string_dup() or BABEL::string_alloc(), because it will be eventually freed using BABEL::string_free() (if it was created by new or anything else, a typecast to const char* is needed).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning a const char* value:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If you assign a value using a const char*, the string will be duplicated with BABEL::string_dup(). Please, note that some compilers (non ANSI/ISO C++ compliant) treats literal strings as char*, not as const char*, so it is preferred to use str = (const char*)&amp;quot;literal string&amp;quot; or str = BABEL::string_dup(&amp;quot;literal string&amp;quot;) instead of str = &amp;quot;literal string&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assigning an embedded string:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The direct assignment of an embedded string to an output string parameter is not allowed. Please, use string_dup() to do the assignment. E.g: out_str_arg = BABEL::string_dup(my_struct.my_embedded_str).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Using the output parameter:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After a string is assigned to the output parameter, you can use the parameter as a char*. The [ ] operator is available for read and write, but one sould take care not to use an index out of the string allocated buffer. The string can be modified and shortened but not enlarged. To enlarge a string you must allocate a larger buffer using BABEL::string_alloc(). If you assign a new buffer to the output parameter, remember to free the previous one using BABEL::string_free().&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// This service has an input string parameter, str_in, and an output string parameter, str_out.&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::Echo(const char* str_in, /* the string output class */ str_out) &lt;br /&gt;
{&lt;br /&gt;
	str_out = BABEL::string_dup(str_in); // duplicates str_in and returns the copy in str_out&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = str_in; // duplicates str_in and returns the copy in str_out (the same as above)&lt;br /&gt;
	// or:&lt;br /&gt;
	str_out = &amp;quot;str&amp;quot;; // duplicates &amp;quot;str&amp;quot; and returns the copy in str_out. However, str_out = (const char*)&amp;quot;str&amp;quot; is preferred.&lt;br /&gt;
&lt;br /&gt;
	//str_out = new char[1]; str_out[0]=0; // thar is an error: the string must be allocated using string_dup() or string_alloc().&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void &amp;lt;uninteresting class&amp;gt;::GetName(const MyContactStruct&amp;amp; contact_in, /* the string output class */ name_out)&lt;br /&gt;
{&lt;br /&gt;
	name_out = BABEL::string_dup(contact_in.name); // copies contact_in.name and returns the copy in name_out&lt;br /&gt;
	//name_out = contact_in.name; // that is an error (*)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(*): contact_in.name is an embedded string. This assignment is not allowed. The user must use the prior line to do the assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data type alias (typedef) ==&lt;br /&gt;
&lt;br /&gt;
An alias for a data type created by the BDL typedef keyword behaves as the original data type. For example, an alias for an array should be treated as if that alias was an original array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Constants (const) ==&lt;br /&gt;
&lt;br /&gt;
The BDL constants are mapped to equivalent C++ constants. To use a constant one must add BABEL::MyModule:: before the name of the constant (&amp;quot;MyModule&amp;quot; is the name of the BABEL module). Thus, the constant PI should be referenced in C++ as BABEL::MyModule::PI.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;99%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// BDL&lt;br /&gt;
const float PI=3.14159265;&lt;br /&gt;
const char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
const string LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// C++&lt;br /&gt;
static const BABEL::Float PI=3.14159265;&lt;br /&gt;
static const BABEL::Char NUL=&amp;#039;\0&amp;#039;;&lt;br /&gt;
static const char* LAST_WORDS=&amp;quot;My god, it&amp;#039;s full of stars!&amp;quot;;&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=689</id>
		<title>Documentation:People</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=689"/>
		<updated>2011-01-12T20:38:22Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Over the years, a diversity of people has used, tested or contributed in heterogeneous forms to the development of the BABEL tools. This below is the complete list in reverse chronological order. Since in BABEL, heterogeneity in developers is consider as important as any other kind of heterogenity, their academic level when they worked with the system is also annotated. &lt;br /&gt;
&lt;br /&gt;
If any one is missing, the guilt lays only with the [[ Documentation:Contact | responsible ]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Ana Gago-Ben&amp;amp;iacute;tez (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Jos&amp;amp;eacute;-Luis Blanco-Claraco (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Francisco Moreno-Due&amp;amp;ntilde;as (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Luis-Miguel Molina-Alarc&amp;amp;oacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Amy Loufti (PhD Computer Science).&lt;br /&gt;
*Ana Cruz-Mart&amp;amp;iacute;n (PhD in Computer Science).&lt;br /&gt;
*Elena Cruz-Mart&amp;amp;iacute;n (Master thesis student, Telecommunication engineering).&lt;br /&gt;
*Vicente Ar&amp;amp;eacute;valo-Espejo (PhD student, Computer Science).&lt;br /&gt;
*Marcos Rodr&amp;amp;iacute;guez-Romero (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Jos&amp;amp;eacute;-Manuel &amp;amp;Aacute;lvarez-Mateos (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Miguel-&amp;amp;Aacute;ngel Olivares-M&amp;amp;eacute;ndez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Carlos P&amp;amp;eacute;rez-Sanjuan (Master thesis student, Computer Science).&lt;br /&gt;
*Juan-Ram&amp;amp;oacute;n Jim&amp;amp;eacute;nez-Gal&amp;amp;aacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*&amp;amp;Oacute;scar Moreno-G&amp;amp;oacute;mez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Cipriano Galindo-Andrades (PhD student, Computer Science).&lt;br /&gt;
*Rosa Mu&amp;amp;ntilde;oz-Mart&amp;amp;iacute;nez (Master thesis student, Computer Science).&lt;br /&gt;
*Salvador Pedraza-Moreno (PhD student, Industrial Engineering).&lt;br /&gt;
*Raquel Fern&amp;amp;aacute;ndez-Ramos (PhD student, Telecomunication Engineering).&lt;br /&gt;
*Javier Gonz&amp;amp;aacute;lez-Jim&amp;amp;eacute;nez (PhD in Industrial Engineering).&lt;br /&gt;
*Juan-Antonio Fern&amp;amp;aacute;ndez-Madrigal (PhD student, Computer Science).&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=688</id>
		<title>Documentation:People</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=688"/>
		<updated>2011-01-12T20:38:07Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Over the years, a diversity of people has used, tested or contributed in heterogeneous forms to the development of the BABEL tools. This below is the complete list in reverse chronological order. Since in BABEL, heterogeneity in developers is consider as important as any other kind of heterogenity, their academic level when they worked with the system is also annotated. &lt;br /&gt;
&lt;br /&gt;
If any one is missing, the guilt lays only with the [[ Documentation:Contact | responsible ]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Ana Gago-Ben&amp;amp;iacute;tez (PhD studente, Telecommunication Engineering).&lt;br /&gt;
*Jos&amp;amp;eacute;-Luis Blanco-Claraco (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Francisco Moreno-Due&amp;amp;ntilde;as (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Luis-Miguel Molina-Alarc&amp;amp;oacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Amy Loufti (PhD Computer Science).&lt;br /&gt;
*Ana Cruz-Mart&amp;amp;iacute;n (PhD in Computer Science).&lt;br /&gt;
*Elena Cruz-Mart&amp;amp;iacute;n (Master thesis student, Telecommunication engineering).&lt;br /&gt;
*Vicente Ar&amp;amp;eacute;valo-Espejo (PhD student, Computer Science).&lt;br /&gt;
*Marcos Rodr&amp;amp;iacute;guez-Romero (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Jos&amp;amp;eacute;-Manuel &amp;amp;Aacute;lvarez-Mateos (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Miguel-&amp;amp;Aacute;ngel Olivares-M&amp;amp;eacute;ndez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Carlos P&amp;amp;eacute;rez-Sanjuan (Master thesis student, Computer Science).&lt;br /&gt;
*Juan-Ram&amp;amp;oacute;n Jim&amp;amp;eacute;nez-Gal&amp;amp;aacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*&amp;amp;Oacute;scar Moreno-G&amp;amp;oacute;mez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Cipriano Galindo-Andrades (PhD student, Computer Science).&lt;br /&gt;
*Rosa Mu&amp;amp;ntilde;oz-Mart&amp;amp;iacute;nez (Master thesis student, Computer Science).&lt;br /&gt;
*Salvador Pedraza-Moreno (PhD student, Industrial Engineering).&lt;br /&gt;
*Raquel Fern&amp;amp;aacute;ndez-Ramos (PhD student, Telecomunication Engineering).&lt;br /&gt;
*Javier Gonz&amp;amp;aacute;lez-Jim&amp;amp;eacute;nez (PhD in Industrial Engineering).&lt;br /&gt;
*Juan-Antonio Fern&amp;amp;aacute;ndez-Madrigal (PhD student, Computer Science).&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=687</id>
		<title>Documentation:People</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:People&amp;diff=687"/>
		<updated>2010-09-08T12:20:59Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Over the years, a diversity of people has used, tested or contributed in heterogeneous forms to the development of the BABEL tools. This below is the complete list in reverse chronological order. Since in BABEL, heterogeneity in developers is consider as important as any other kind of heterogenity, their academic level when they worked with the system is also annotated. &lt;br /&gt;
&lt;br /&gt;
If any one is missing, the guilt lays only with the [[ Documentation:Contact | responsible ]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Jos&amp;amp;eacute;-Luis Blanco-Claraco (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Francisco Moreno-Due&amp;amp;ntilde;as (PhD student, Telecommunication Engineering).&lt;br /&gt;
*Luis-Miguel Molina-Alarc&amp;amp;oacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Amy Loufti (PhD Computer Science).&lt;br /&gt;
*Ana Cruz-Mart&amp;amp;iacute;n (PhD in Computer Science).&lt;br /&gt;
*Elena Cruz-Mart&amp;amp;iacute;n (Master thesis student, Telecommunication engineering).&lt;br /&gt;
*Vicente Ar&amp;amp;eacute;valo-Espejo (PhD student, Computer Science).&lt;br /&gt;
*Marcos Rodr&amp;amp;iacute;guez-Romero (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Jos&amp;amp;eacute;-Manuel &amp;amp;Aacute;lvarez-Mateos (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Miguel-&amp;amp;Aacute;ngel Olivares-M&amp;amp;eacute;ndez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Carlos P&amp;amp;eacute;rez-Sanjuan (Master thesis student, Computer Science).&lt;br /&gt;
*Juan-Ram&amp;amp;oacute;n Jim&amp;amp;eacute;nez-Gal&amp;amp;aacute;n (Bachelor thesis student, Computer Science).&lt;br /&gt;
*&amp;amp;Oacute;scar Moreno-G&amp;amp;oacute;mez (Bachelor thesis student, Computer Science).&lt;br /&gt;
*Cipriano Galindo-Andrades (PhD student, Computer Science).&lt;br /&gt;
*Rosa Mu&amp;amp;ntilde;oz-Mart&amp;amp;iacute;nez (Master thesis student, Computer Science).&lt;br /&gt;
*Salvador Pedraza-Moreno (PhD student, Industrial Engineering).&lt;br /&gt;
*Raquel Fern&amp;amp;aacute;ndez-Ramos (PhD student, Telecomunication Engineering).&lt;br /&gt;
*Javier Gonz&amp;amp;aacute;lez-Jim&amp;amp;eacute;nez (PhD in Industrial Engineering).&lt;br /&gt;
*Juan-Antonio Fern&amp;amp;aacute;ndez-Madrigal (PhD student, Computer Science).&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=686</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=686"/>
		<updated>2010-09-08T10:12:10Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* The BABEL System&lt;br /&gt;
** The Aracne Specification | The Aracne Specification&lt;br /&gt;
** The Module Designer | The Module Designer&lt;br /&gt;
** Generators | Generators&lt;br /&gt;
** The Execution Manager | The Execution Manager&lt;br /&gt;
** The Debugger | The Debugger&lt;br /&gt;
** Main Page | The Maintainance Site (this site)&lt;br /&gt;
** The Robotic Development Subsystem | The Robotic Subsystem&lt;br /&gt;
* Documentation &amp;amp; info&lt;br /&gt;
** Documentation:BDL | BDL &lt;br /&gt;
** Documentation:Aracne atoms | Aracne atoms&lt;br /&gt;
** Documentation:Publications | Publications&lt;br /&gt;
** Documentation:Multimedia | Multimedia&lt;br /&gt;
** Documentation:Changes history | Changes history&lt;br /&gt;
** Documentation:ToDo | ToDo&lt;br /&gt;
** Documentation:People | People&lt;br /&gt;
** Documentation:Contact | Contact&lt;br /&gt;
* Downloads&lt;br /&gt;
** Download:BABEL | Download BABEL&lt;br /&gt;
* Robotic Sw Development&lt;br /&gt;
** Robotic Software Development | Index&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=685</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=685"/>
		<updated>2010-09-08T10:11:51Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* The BABEL System&lt;br /&gt;
** The Aracne Specification | The Aracne Specification&lt;br /&gt;
** The Module Designer | The Module Designer&lt;br /&gt;
** Generators | Generators&lt;br /&gt;
** The Execution Manager | The Execution Manager&lt;br /&gt;
** The Debugger | The Debugger&lt;br /&gt;
** Main Page | The Maintainance Site (this site)&lt;br /&gt;
** The Robotic Development Subsystem | The Robotic Subsystem&lt;br /&gt;
* Documentation &amp;amp; info&lt;br /&gt;
** Documentation:BDL | BDL &lt;br /&gt;
** Documentation:Aracne atoms | Aracne atoms&lt;br /&gt;
** Documentation:Publications | Publications&lt;br /&gt;
** Documentation:Multimedia | Multimedia&lt;br /&gt;
** Documentation:Changes history | Changes history&lt;br /&gt;
** Documentation:ToDo | ToDo&lt;br /&gt;
** Documentation:People | People&lt;br /&gt;
** Documentation:Contact | Contact&lt;br /&gt;
* Downloads&lt;br /&gt;
** Download:BABEL | Download BABEL&lt;br /&gt;
** Download:Install | Install&lt;br /&gt;
* Robotic Sw Development&lt;br /&gt;
** Robotic Software Development | Index&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=684</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=684"/>
		<updated>2010-09-08T10:11:23Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Site navigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the BABEL Development Site v3.0 ==&lt;br /&gt;
&lt;br /&gt;
The BABEL Development System is a programming language / operating system neutral framework for creating complex software applications with the focus in coping with heterogeneity (typically, very different program code produced by different people to manage diverse software and hardware devices). It was born in the robotics domain, where heterogeneity is of the uttermost importance, particularly in today&amp;#039;s large scale and long-term projects. &lt;br /&gt;
&lt;br /&gt;
This framework is being developed since 1996 at the System Engineering and Automation Department of the University of Málaga [http://www.isa.uma.es] and it&amp;#039;s aimed to cover several aspects of the robotic software lifecycle, such as the design, validation, debugging, implementation, testing, and manteinance phases.&lt;br /&gt;
&lt;br /&gt;
== Specifications and Tools ==&lt;br /&gt;
&lt;br /&gt;
The current components of BABEL are:&lt;br /&gt;
&lt;br /&gt;
* The &amp;#039;&amp;#039;&amp;#039;Aracne&amp;#039;&amp;#039;&amp;#039; specification, which covers the design stage of development. Currently it is being extended and transformed into the &amp;#039;&amp;#039;&amp;#039;H&amp;#039;&amp;#039;&amp;#039; specification language.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babel.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Module Designer&amp;#039;&amp;#039;&amp;#039;, a visual tool for designing the components (modules) of the application. It also covers the implementation by generating semi-automatically the source code of those components.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Console.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Generator&amp;#039;&amp;#039;&amp;#039;, a command-line tool for generating the implementations without visual aids.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Em.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Execution Manager&amp;#039;&amp;#039;&amp;#039;, a visual tool for managing all the components of an application in a possibly networked system from a centralized location. It is able to launch the programs and collect the logs produced by execution.&lt;br /&gt;
&lt;br /&gt;
* [[Image:D.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Debugger&amp;#039;&amp;#039;&amp;#039;, a visual tool for examining the time logs produced by the application and therefore detecting possible flaws and requirement unsatisfaction.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babelsite.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Development Site&amp;#039;&amp;#039;&amp;#039; [http://babel.isa.uma.es/babel2], a web site for maintainance of the system.&lt;br /&gt;
&lt;br /&gt;
* The [[ The Robotic Development Subsystem | &amp;#039;&amp;#039;&amp;#039;BABEL Robotic Development Subsystem&amp;#039;&amp;#039;&amp;#039; ]], a subsystem composed of its own tools, specifications and BABEL modules, specialized for creating robotic architectures.&lt;br /&gt;
&lt;br /&gt;
== Site navigation ==&lt;br /&gt;
&lt;br /&gt;
Within this site you can find all the tools and documentation produced for Babel. &lt;br /&gt;
&lt;br /&gt;
On your left you can see different sections:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The BABEL System&amp;#039;&amp;#039;&amp;#039;. It contains general descriptions of the components of the BABEL Development System. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Documentation &amp;amp; info&amp;#039;&amp;#039;&amp;#039;. All the documentation we currently have for our system, and contact info.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Donwloads&amp;#039;&amp;#039;&amp;#039;. A section where you can download BABEL and other files.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robotic Software Development&amp;#039;&amp;#039;&amp;#039;. In this under-construction section you will find general information about the development of robotic software.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma_personales&amp;amp;t=html&amp;amp;f=BABELwiki.gif This site is always under maintenance, so we apologize for not all the information being available at a given time.&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=683</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=683"/>
		<updated>2010-09-08T10:08:22Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* The BABEL System&lt;br /&gt;
** The Aracne Specification | The Aracne Specification&lt;br /&gt;
** The Module Designer | The Module Designer&lt;br /&gt;
** Generators | Generators&lt;br /&gt;
** The Execution Manager | The Execution Manager&lt;br /&gt;
** The Debugger | The Debugger&lt;br /&gt;
** Main Page | The Maintainance Site (this site)&lt;br /&gt;
** The Robotic Development Subsystem | The Robotic Subsystem&lt;br /&gt;
* Documentation &amp;amp; info&lt;br /&gt;
** Documentation:BDL | BDL &lt;br /&gt;
** Documentation:Aracne atoms | Aracne atoms&lt;br /&gt;
** Documentation:Publications | Publications&lt;br /&gt;
** Documentation:Multimedia | Multimedia&lt;br /&gt;
** Documentation:Changes history | Changes history&lt;br /&gt;
** Documentation:ToDo | ToDo&lt;br /&gt;
** Documentation:People | People&lt;br /&gt;
** Documentation:Contact | Contact&lt;br /&gt;
* Download&lt;br /&gt;
** Download:BABEL | Download BABEL&lt;br /&gt;
** Download:Install | Install&lt;br /&gt;
* Robotic Sw Development&lt;br /&gt;
** Robotic Software Development | Index&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=682</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=682"/>
		<updated>2010-09-08T10:08:00Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the BABEL Development Site v3.0 ==&lt;br /&gt;
&lt;br /&gt;
The BABEL Development System is a programming language / operating system neutral framework for creating complex software applications with the focus in coping with heterogeneity (typically, very different program code produced by different people to manage diverse software and hardware devices). It was born in the robotics domain, where heterogeneity is of the uttermost importance, particularly in today&amp;#039;s large scale and long-term projects. &lt;br /&gt;
&lt;br /&gt;
This framework is being developed since 1996 at the System Engineering and Automation Department of the University of Málaga [http://www.isa.uma.es] and it&amp;#039;s aimed to cover several aspects of the robotic software lifecycle, such as the design, validation, debugging, implementation, testing, and manteinance phases.&lt;br /&gt;
&lt;br /&gt;
== Specifications and Tools ==&lt;br /&gt;
&lt;br /&gt;
The current components of BABEL are:&lt;br /&gt;
&lt;br /&gt;
* The &amp;#039;&amp;#039;&amp;#039;Aracne&amp;#039;&amp;#039;&amp;#039; specification, which covers the design stage of development. Currently it is being extended and transformed into the &amp;#039;&amp;#039;&amp;#039;H&amp;#039;&amp;#039;&amp;#039; specification language.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babel.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Module Designer&amp;#039;&amp;#039;&amp;#039;, a visual tool for designing the components (modules) of the application. It also covers the implementation by generating semi-automatically the source code of those components.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Console.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Generator&amp;#039;&amp;#039;&amp;#039;, a command-line tool for generating the implementations without visual aids.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Em.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Execution Manager&amp;#039;&amp;#039;&amp;#039;, a visual tool for managing all the components of an application in a possibly networked system from a centralized location. It is able to launch the programs and collect the logs produced by execution.&lt;br /&gt;
&lt;br /&gt;
* [[Image:D.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Debugger&amp;#039;&amp;#039;&amp;#039;, a visual tool for examining the time logs produced by the application and therefore detecting possible flaws and requirement unsatisfaction.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babelsite.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Development Site&amp;#039;&amp;#039;&amp;#039; [http://babel.isa.uma.es/babel2], a web site for maintainance of the system.&lt;br /&gt;
&lt;br /&gt;
* The [[ The Robotic Development Subsystem | &amp;#039;&amp;#039;&amp;#039;BABEL Robotic Development Subsystem&amp;#039;&amp;#039;&amp;#039; ]], a subsystem composed of its own tools, specifications and BABEL modules, specialized for creating robotic architectures.&lt;br /&gt;
&lt;br /&gt;
== Site navigation ==&lt;br /&gt;
&lt;br /&gt;
Within this site you can find all the tools and documentation produced for Babel. We also maintain here (restricted) a repository of the software modules developed with our system for our robotic applications. &lt;br /&gt;
&lt;br /&gt;
On your left you can see different sections:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The BABEL System&amp;#039;&amp;#039;&amp;#039;. It contains documentation of the different components of the BABEL Development System. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;BABEL Documentation&amp;#039;&amp;#039;&amp;#039;. All the documentation we currently have for our system (appart from the scientific publications, that you can find in the main page of BABEL)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robotic Software Development&amp;#039;&amp;#039;&amp;#039;. In this section you can find general information about the development of robotic software.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma_personales&amp;amp;t=html&amp;amp;f=BABELwiki.gif This site is always under maintenance, so we apologize for not all the information being available at a given time.&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=681</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Main_Page&amp;diff=681"/>
		<updated>2010-09-08T10:07:37Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the BABEL Development Site v3.0 ==&lt;br /&gt;
&lt;br /&gt;
The BABEL Development System is a programming language / operating system neutral framework for creating complex software applications with the focus in coping with heterogeneity (typically, very different program code produced by different people to manage diverse software and hardware devices). It was born in the robotics domain, where heterogeneity is of the uttermost importance, particularly in today&amp;#039;s large scale and long-term projects. &lt;br /&gt;
&lt;br /&gt;
This framework is being developed since 1996 at the System Engineering and Automation Department of the University of Málaga [http://www.isa.uma.es] and it&amp;#039;s aimed to cover several aspects of the robotic software lifecycle, such as the design, validation, debugging, implementation, testing, and manteinance phases.&lt;br /&gt;
&lt;br /&gt;
== Specifications and Tools ==&lt;br /&gt;
&lt;br /&gt;
The current components of BABEL are:&lt;br /&gt;
&lt;br /&gt;
* The &amp;#039;&amp;#039;&amp;#039;Aracne&amp;#039;&amp;#039;&amp;#039; specification, which covers the design stage of development. Currently it is being extended and transformed into the &amp;#039;&amp;#039;&amp;#039;H&amp;#039;&amp;#039;&amp;#039; specification language.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babel.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Module Designer&amp;#039;&amp;#039;&amp;#039;, a visual tool for designing the components (modules) of the application. It also covers the implementation by generating semi-automatically the source code of those components.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Console.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Generator&amp;#039;&amp;#039;&amp;#039;, a command-line tool for generating the implementations without visual aids.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Em.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Execution Manager&amp;#039;&amp;#039;&amp;#039;, a visual tool for managing all the components of an application in a possibly networked system from a centralized location. It is able to launch the programs and collect the logs produced by execution.&lt;br /&gt;
&lt;br /&gt;
* [[Image:D.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Debugger&amp;#039;&amp;#039;&amp;#039;, a visual tool for examining the time logs produced by the application and therefore detecting possible flaws and requirement unsatisfaction.&lt;br /&gt;
&lt;br /&gt;
* [[Image:Babelsite.png]] The &amp;#039;&amp;#039;&amp;#039;BABEL Development Site&amp;#039;&amp;#039;&amp;#039; [http://babel.isa.uma.es/babel2], a web site for maintainance of the system.&lt;br /&gt;
&lt;br /&gt;
* The [[ The Robotic Development Subsystem | &amp;#039;&amp;#039;&amp;#039;BABEL Robotic Development Subsystem&amp;#039;&amp;#039;&amp;#039; ]], a subsystem composed of its own tools, specifications and BABEL modules, specialized for creating robotic architectures.&lt;br /&gt;
&lt;br /&gt;
== Site navigation ==&lt;br /&gt;
&lt;br /&gt;
Within this site you can find all the tools and documentation produced for Babel. We also maintain here (restricted) a repository of the software modules developed with our system for our robotic applications. &lt;br /&gt;
&lt;br /&gt;
On your left you can see different sections:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The BABEL System&amp;#039;&amp;#039;&amp;#039;. It contains documentation of the different components of the BABEL Development System. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;BABEL Documentation&amp;#039;&amp;#039;&amp;#039;. All the documentation we currently have for our system (appart from the scientific publications, that you can find in the main page of BABEL)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Robotic Software Development&amp;#039;&amp;#039;&amp;#039;. In this section you can find general information about the development of robotic software.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma_personales&amp;amp;t=html&amp;amp;f=BABELwiki.gif &amp;#039;&amp;#039;Note:&amp;#039;&amp;#039; This site is always under maintenance, so we apologize for not all the information being available at a given time.&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=680</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=680"/>
		<updated>2010-09-08T10:00:33Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have collected here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
*An application of our mobile robot SANCHO for its use in conferences or shows. A number of modules (both onboard and in remote computers) have been programmed for navigation, obstacle avoidance, speech recognition, speaking, and remote projection of multimedia. Both twisted-pair and WiFi communication hardware are used [http://babel.isa.uma.es/babel2/images/Sancho.wmv (wmv file, 10.5Mb)].&lt;br /&gt;
&lt;br /&gt;
*A complete robotic software architecture has been implemented in our robotic wheelchair SENA that enables the driver to interact cognitive and physically with the robot. A number of modules are dedicated to obstacle avoidance, automatic navigation, localization, and symbolic world modelling. All of them run on the onboard laptop, but they communicate to external web server to recover wheather information, etc. [http://babel.isa.uma.es/babel2/images/ACHRIN_Show.wmv (wmv file, 39.7Mb)].&lt;br /&gt;
&lt;br /&gt;
*An experiment with a BABEL-generated module that controls the industrial manipulator arm PERFORMER MK2 to discriminate small plastic pieces through their colour and pick them up. A camera and several infrared sensors attached to the arm wrist are used for colour discrimination and collision avoidance [http://babel.isa.uma.es/babel2/images/RAM2-Antunez.wmv (wmv file, 11Mb)].&lt;br /&gt;
&lt;br /&gt;
*A JAVA applet is used to remotely control the navigation software of the mobile robot SANCHO, composed of a number of modules for motion, obstacle avoidance, and sensor management. The communication includes twisted-pair cable and WiFi technologies [http://babel.isa.uma.es/babel2/images/finalxvid_small2.wmv (wmv file, 22Mb)].&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=679</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=679"/>
		<updated>2010-09-08T09:58:33Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
*An application of our mobile robot SANCHO for its use in conferences or shows. A number of modules (both onboard and in remote computers) have been programmed for navigation, obstacle avoidance, speech recognition, speaking, and remote projection of multimedia. Both twisted-pair and WiFi communication hardware are used [http://babel.isa.uma.es/babel2/images/Sancho.wmv (wmv file, 10.5Mb)].&lt;br /&gt;
&lt;br /&gt;
*A complete robotic software architecture has been implemented in our robotic wheelchair SENA that enables the driver to interact cognitive and physically with the robot. A number of modules are dedicated to obstacle avoidance, automatic navigation, localization, and symbolic world modelling. All of them run on the onboard laptop, but they communicate to external web server to recover wheather information, etc. [http://babel.isa.uma.es/babel2/images/ACHRIN_Show.wmv (wmv file, 39.7Mb)].&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=678</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=678"/>
		<updated>2010-09-08T09:57:55Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
*An application of our mobile robot SANCHO for its use in conferences or shows. A number of modules (both onboard and in remote computers) have been programmed for navigation, obstacle avoidance, speech recognition, speaking, and remote projection of multimedia. Both twisted-pair and WiFi communication hardware are used [http://babel.isa.uma.es/babel2/images/Sancho.wmv (wmv file, 10.5Mb)].&lt;br /&gt;
&lt;br /&gt;
*A complete robotic software architecture has been implemented in our robotic wheelchair SENA that enables the driver to interact cognitive and physically with the robot. A number of modules are dedicated to obstacle avoidance, automatic navigation, localization, and symbolic world modelling. All of them run on the onboard laptop, but they communicate to external web server to recover wheather information, etc. [http://babel.isa.uma.es/babel2/images/ACHRIN Show.wmv (wmv file, 39.7Mb)].&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=677</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=677"/>
		<updated>2010-09-08T09:56:46Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
*An application of our mobile robot SANCHO for its use in conferences or shows. A number of modules (both onboard and in remote computers) have been programmed for navigation, obstacle avoidance, speech recognition, speaking, and remote projection of multimedia. Both twisted-pair and WiFi communication hardware are used [http://babel.isa.uma.es/babel2/images/Sancho.wmv (wmv file, 10.5Mb)].&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=676</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=676"/>
		<updated>2010-09-08T09:56:00Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
*An application of our mobile robot SANCHO for its use in conferences or shows. A number of modules (both onboard and in remote computers) have been programmed for navigation, obstacle avoidance, speech recognition, speaking, and remote projection of multimedia. Both twisted-pair and WiFi communication hardware are used [http://babel.isa.uma.es/babel2/images/Sancho.wmv].&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=675</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=675"/>
		<updated>2010-09-08T09:54:50Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
[http://babel.isa.uma.es/babel2/images/babel_wiki_logo.png]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=674</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=674"/>
		<updated>2010-09-08T09:53:13Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
[[Image:babel_wiki_logo.png]]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=673</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=673"/>
		<updated>2010-09-08T09:50:08Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
[[media:images/babel_wiki_logo.png]]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=672</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=672"/>
		<updated>2010-09-08T09:49:55Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
[[media:babel_wiki_logo.png]]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=671</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=671"/>
		<updated>2010-09-08T09:49:06Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
[[media:RAM2-Antunez.wmv]]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=670</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=670"/>
		<updated>2010-09-08T09:47:26Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;br /&gt;
&lt;br /&gt;
[File:RAM2-Antunez.wmv]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=669</id>
		<title>Documentation:Multimedia</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Documentation:Multimedia&amp;diff=669"/>
		<updated>2010-09-08T09:46:32Z</updated>

		<summary type="html">&lt;p&gt;Jafma: Created page with &amp;quot;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We collect here some illustrative multimedia files related to applications developed with the BABEL Development System.&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=668</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=MediaWiki:Sidebar&amp;diff=668"/>
		<updated>2010-09-08T09:44:13Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* The BABEL System&lt;br /&gt;
** BABEL Description | Description&lt;br /&gt;
** The Aracne Specification | The Aracne Specification&lt;br /&gt;
** The Module Designer | The Module Designer&lt;br /&gt;
** Generators | Generators&lt;br /&gt;
** The Execution Manager | The Execution Manager&lt;br /&gt;
** The Debugger | The Debugger&lt;br /&gt;
** Main Page | The Maintainance Site (this site)&lt;br /&gt;
** The Robotic Development Subsystem | The Robotic Subsystem&lt;br /&gt;
* Documentation &amp;amp; info&lt;br /&gt;
** Documentation:BDL | BDL &lt;br /&gt;
** Documentation:Aracne atoms | Aracne atoms&lt;br /&gt;
** Documentation:Publications | Publications&lt;br /&gt;
** Documentation:Multimedia | Multimedia&lt;br /&gt;
** Documentation:Changes history | Changes history&lt;br /&gt;
** Documentation:ToDo | ToDo&lt;br /&gt;
** Documentation:People | People&lt;br /&gt;
** Documentation:Contact | Contact&lt;br /&gt;
* Download&lt;br /&gt;
** Download:BABEL | Download BABEL&lt;br /&gt;
** Download:Install | Install&lt;br /&gt;
* Robotic Sw Development&lt;br /&gt;
** Robotic Software Development | Index&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=667</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=667"/>
		<updated>2010-09-08T09:41:42Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.38-free Hyperion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.38-free Hyperion ==&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=666</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=666"/>
		<updated>2010-09-08T09:41:26Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.0 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.0 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
==== Robot simulation kit ====&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
==== Brief installation instructions ====&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=665</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=665"/>
		<updated>2010-09-08T09:41:13Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.1 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
== BABEL v0.39.1 Endymion ==&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.0 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
==== Robot simulation kit ====&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
==== Brief installation instructions ====&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=664</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=664"/>
		<updated>2010-09-08T09:40:04Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.1 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.0 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
==== Robot simulation kit ====&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
==== Brief installation instructions ====&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=663</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=663"/>
		<updated>2010-09-08T09:38:55Z</updated>

		<summary type="html">&lt;p&gt;Jafma: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the latest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.1 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.0 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=662</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=662"/>
		<updated>2010-09-08T09:38:38Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Brief installation instructions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the lattest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.1 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.0 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=661</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=661"/>
		<updated>2010-09-08T09:38:13Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* Robot simulation kit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the lattest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.1 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.0 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=660</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=660"/>
		<updated>2010-09-08T09:37:59Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.38-free Hyperion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the lattest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.1 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.0 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
	<entry>
		<id>https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=659</id>
		<title>Download:BABEL</title>
		<link rel="alternate" type="text/html" href="https://babel.isa.uma.es/babel2/index.php?title=Download:BABEL&amp;diff=659"/>
		<updated>2010-09-08T09:37:49Z</updated>

		<summary type="html">&lt;p&gt;Jafma: /* BABEL v0.39.0 Endymion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this section you can download the lattest versions of the BABEL Development Site. Currently they are distributed as binaries for Windows platforms. Work on shifting to open-source multi-platform distribution is in progress.&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.1 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The same version as v0.39.0 but with some bugs fixed and a different way of dealing with external libraries, more consistent with the BABEL specification: now the MRPT, OpenCV and wxWidget are no longer included in the download file, and must be installed in the machine that generates the code if they are needed. Also, they must be included in the &amp;quot;non-portable design&amp;quot; part of the module in order for the generator to work properly.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv0391_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.39.0 Endymion ===&lt;br /&gt;
&lt;br /&gt;
The free version of the BABEL Development System for Win32 platforms that supports the following code generators: Endymion (W32+ACE51TAO11+VC++2008), Hyperion (W32+ACE51TAO11+VC++6), Iapetus (JAVA+OpenORB -experimental-), and Cryo (HTML report generator). &lt;br /&gt;
&lt;br /&gt;
It is also shipped with the MRPT toolkit, the WxWidget libraries and the OpenCV libraries, and includes three sample applications. &lt;br /&gt;
&lt;br /&gt;
Apart from the new generators, the system is used the same as the Hyperion 0.38 version. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTES:&amp;#039;&amp;#039; &lt;br /&gt;
*Uncompress the files in a path that does not contain spaces or special characters. &lt;br /&gt;
*Do not use spaces or special characters in any of the path you create for generating modules. &lt;br /&gt;
*It has been tested in Windows NT, 2000, XP and Vista. In the latter you must download the msvbvm50.dll and register it in the system with the command line program regsvr32, or maybe just copy it into the BABEL base directory. If you find any other dll missing, the procedure is the same. &lt;br /&gt;
*It has been tested with VC++6.0 in Win NT and XP. &lt;br /&gt;
*It has been tested with VS2008 Professional and Express in Win XP and Vista.&lt;br /&gt;
&lt;br /&gt;
:[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv039_endymion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== BABEL v0.38-free Hyperion ===&lt;br /&gt;
&lt;br /&gt;
The most intensively tested configuration of the BABEL tools in our research laboratory: Hyperion (C++, ACE5.1+TAO1.1, Win32). With this version, you can design, implement, and test robotic applications with all the functionality of BABEL. &lt;br /&gt;
&lt;br /&gt;
This compilation also includes the MRPT robotic programming library and the ACE5.1+TAO1.1 free implementation of CORBA as the communication platform. The MRPT version included in this file is v0.5.1. For more information on updating that version to new MRPTs, please visit the [http://babel.isa.uma.es/mrpt  MRPT site].&lt;br /&gt;
&lt;br /&gt;
The downloadable file contains the brief installation manual in PDF format.&lt;br /&gt;
&lt;br /&gt;
[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/babelv38_free_hyperion.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Robot simulation kit ===&lt;br /&gt;
&lt;br /&gt;
A zip file containing several modules to test the BABEL free version. These modules simulate a mobile robot and permit the user to command simple movement actions and produce log files. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;IMPORTANT NOTE:&amp;#039;&amp;#039; Some problems have been found with this kit in the newer versions of BABEL (v0.39 and later). It is recommended to not use this kit in those versions: they contain their own kits appropriately tested.&lt;br /&gt;
&lt;br /&gt;
[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=zip&amp;amp;f=downloads/jafma/babel/BABEL_test.zip Download it]&lt;br /&gt;
&lt;br /&gt;
=== Brief installation instructions ===&lt;br /&gt;
&lt;br /&gt;
This is a brief installation manual the BABEL v.0.38. More updated information can be found in the others section of this web.&lt;br /&gt;
&lt;br /&gt;
[http://babel.isa.uma.es/_utils/downloads/logdownloads.php?u=jafma&amp;amp;t=pdf&amp;amp;f=downloads/jafma/babel/BABELInstalMan.pdf Download it]&lt;/div&gt;</summary>
		<author><name>Jafma</name></author>
		
	</entry>
</feed>