tag:blogger.com,1999:blog-23494342310909747382024-03-05T17:42:24.126+00:00Advanced C++ with ExamplesThis blog aims to explain Advanced C++ concepts with simple examples. I found that sometimes programmers can learn the concepts very easily with a well written and commented code rather then going through hundreds of book pages.Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.comBlogger155125tag:blogger.com,1999:blog-2349434231090974738.post-40721661872476713722013-01-14T19:24:00.001+00:002013-01-14T19:24:41.241+00:00Xerces: Writing out an XML file<div dir="ltr" style="text-align: left;" trbidi="on">
This is the next in the <a href="http://advancedcppwithexamples.blogspot.com/2012/10/xerces-reading-xml-file-and-printing-it.html">Xerces series</a> that shows writing out to the XML file. The output file will be written in the <a href="http://advancedcppwithexamples.blogspot.com/2012/10/xerces-for-c-using-visual-studio-2010.html">XML directory</a>.<br />
<br />
<br />
<div style="background: #DDDDDD;">
<pre><span class="comment">
//Program tested on Microsoft Visual Studio 2010 - Zahid Ghadialy
//Example demonstrates creating an XML file
//Based on example at: http://www.codeproject.com/Articles/32762/Xerces-for-C-Using-Visual-C-Part-2
//Xerces is xerces-c-3.1.1-x86-windows-vc-10.0
</span><span class="pre">
#include <iostream>
#include <string>
#include <sstream>
</span><span class="comment">//Mandatory for using any feature of Xerces.
</span><span class="pre">#include <xercesc/util/PlatformUtils.hpp>
</span><span class="comment">//Use the Document Object Model (DOM) API
</span><span class="pre">#include <xercesc/dom/DOM.hpp>
</span><span class="comment">//Required for outputing a Xerces DOMDocument to a standard output stream (Also see: XMLFormatTarget)
</span><span class="pre">#include <xercesc/framework/StdOutFormatTarget.hpp>
</span><span class="comment">//Required for outputing a Xerces DOMDocument to the file system (Also see: XMLFormatTarget)
</span><span class="pre">#include <xercesc/framework/LocalFileFormatTarget.hpp>
</span><span class="keyword">
using namespace</span> std<span class="operator">;</span>
XERCES_CPP_NAMESPACE_USE<span class="type">
void</span> DoOutput2Stream<span class="operator">(</span>DOMDocument<span class="operator">*</span> pmyDOMDocument<span class="operator">);</span><span class="type">
void</span> DoOutput2File<span class="operator">(</span>DOMDocument<span class="operator">*</span> pmyDOMDocument<span class="operator">,</span><span class="keyword"> const</span><span class="type"> wchar_t</span><span class="operator"> *</span> FullFilePath<span class="operator"> );</span><span class="type">
int</span><span class="keyword"> main</span><span class="operator">()
{</span><span class="comment">
// Initilize Xerces.
</span> XMLPlatformUtils<span class="operator">::</span>Initialize<span class="operator">();</span><span class="comment">
// Pointer to our DOMImplementation.
</span> DOMImplementation<span class="operator">*</span> p_DOMImplementation<span class="operator"> =</span> NULL<span class="operator">;</span>
p_DOMImplementation<span class="operator"> =</span> DOMImplementationRegistry<span class="operator">::</span>getDOMImplementation<span class="operator">(</span>XMLString<span class="operator">::</span>transcode<span class="operator">(</span><span class="string">"core"</span><span class="operator">));</span><span class="comment">
// Pointer to our DOMDocument.
</span> DOMDocument<span class="operator">*</span> p_DOMDocument<span class="operator"> =</span> NULL<span class="operator">;</span>
p_DOMDocument<span class="operator"> =</span> p_DOMImplementation<span class="operator">-></span>createDocument<span class="operator">(</span><span class="int">0</span><span class="operator">,</span><span class="string"> L"Hello_World"</span><span class="operator">,</span><span class="int"> 0</span><span class="operator">);</span>
DOMElement<span class="operator"> *</span> p_RootElement<span class="operator"> =</span> NULL<span class="operator">;</span>
p_RootElement<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>getDocumentElement<span class="operator">();</span><span class="comment">
//Fill in the DOM document - different parts
//Create a Comment node, and then append this to the root element.
</span> DOMComment<span class="operator"> *</span> p_DOMComment<span class="operator"> =</span> NULL<span class="operator">;</span>
p_DOMComment<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createComment<span class="operator">(</span><span class="string">L"Dates are formatted mm/dd/yy."
L" Don't forget XML is case-sensitive."</span><span class="operator">);</span>
p_RootElement<span class="operator">-></span>appendChild<span class="operator">(</span>p_DOMComment<span class="operator">);</span><span class="comment">
//Create an Element node, then fill in some attributes, and then append this to the root element.
</span> DOMElement<span class="operator"> *</span> p_DataElement<span class="operator"> =</span> NULL<span class="operator">;</span>
p_DataElement<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createElement<span class="operator">(</span><span class="string">L"data"</span><span class="operator">);</span><span class="comment">
//Copy the current system date to a buffer, then set/create the attribute.
</span><span class="type"> wchar_t</span> wcharBuffer<span class="operator">[</span><span class="int">128</span><span class="operator">];</span>
_wstrdate_s<span class="operator">(</span>wcharBuffer<span class="operator">,</span><span class="int"> 9</span><span class="operator">);</span>
p_DataElement<span class="operator">-></span>setAttribute<span class="operator">(</span><span class="string">L"date"</span><span class="operator">,</span> wcharBuffer<span class="operator">);</span><span class="comment">
//Convert an integer to a string, then set/create the attribute.
</span> _itow_s<span class="operator">(</span><span class="int">65536</span><span class="operator">,</span> wcharBuffer<span class="operator">,</span><span class="int"> 128</span><span class="operator">,</span><span class="int"> 10</span><span class="operator">);</span>
p_DataElement<span class="operator">-></span>setAttribute<span class="operator">(</span><span class="string">L"integer"</span><span class="operator">,</span> wcharBuffer<span class="operator">);</span><span class="comment">
//Convert a floating-point number to a wstring, then set/create the attribute.
</span> std<span class="operator">::</span>wstringstream myStream<span class="operator">;</span>
myStream<span class="operator">.</span>precision<span class="operator">(</span><span class="int">8</span><span class="operator">);</span>
myStream<span class="operator">.</span>setf<span class="operator">(</span>std<span class="operator">::</span>ios_base<span class="operator">::</span>fixed<span class="operator">,</span> std<span class="operator">::</span>ios_base<span class="operator">::</span>floatfield<span class="operator">);</span>
myStream<span class="operator"> <<</span><span class="float"> 3.1415926535897932384626433832795</span><span class="operator">;</span><span class="keyword">
const</span> std<span class="operator">::</span>wstring ws<span class="operator">(</span>myStream<span class="operator">.</span>str<span class="operator">());</span>
p_DataElement<span class="operator">-></span>setAttribute<span class="operator">(</span><span class="string">L"float"</span><span class="operator">,</span> ws<span class="operator">.</span>c_str<span class="operator">());</span>
p_RootElement<span class="operator">-></span>appendChild<span class="operator">(</span>p_DataElement<span class="operator">);</span><span class="comment">
// Create an Element node, then fill in some attributes, add some text,
// then append this to the 'pDataElement' element.
</span> DOMElement<span class="operator"> *</span> p_Row<span class="operator"> =</span> NULL<span class="operator">;</span>
p_Row<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createElement<span class="operator">(</span><span class="string">L"row"</span><span class="operator">);</span><span class="comment">
// Create some sample data.
</span> _itow_s<span class="operator">(</span><span class="int">1</span><span class="operator">,</span> wcharBuffer<span class="operator">,</span><span class="int"> 128</span><span class="operator">,</span><span class="int"> 10</span><span class="operator">);</span>
p_Row<span class="operator">-></span>setAttribute<span class="operator">(</span><span class="string">L"index"</span><span class="operator">,</span> wcharBuffer<span class="operator">);</span><span class="comment">
/*
Create a text node and append this as well. Some people
prefer to place their data in the text node
which is perfectly valid, others prefer to use
the attributes. A combination of the two is quite common.
*/</span>
DOMText<span class="operator">*</span> p_TextNode<span class="operator"> =</span> NULL<span class="operator">;</span>
p_TextNode<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createTextNode<span class="operator">(</span><span class="string">L"Comments and"
L" data can also go in text nodes."</span><span class="operator">);</span>
p_Row<span class="operator">-></span>appendChild<span class="operator">(</span>p_TextNode<span class="operator">);</span>
p_DataElement<span class="operator">-></span>appendChild<span class="operator">(</span>p_Row<span class="operator">);</span><span class="comment">
// Create another row (this time putting data and descriptions into different places).
</span> p_Row<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createElement<span class="operator">(</span><span class="string">L"row"</span><span class="operator">);</span>
p_Row<span class="operator">-></span>setAttribute<span class="operator">(</span><span class="string">L"description"</span><span class="operator">,</span><span class="string"> L"The value of PI"</span><span class="operator">);</span>
p_TextNode<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createTextNode<span class="operator">(</span><span class="string">L"3.1415926535897932384626433832795"</span><span class="operator">);</span>
p_Row<span class="operator">-></span>appendChild<span class="operator">(</span>p_TextNode<span class="operator">);</span>
p_DataElement<span class="operator">-></span>appendChild<span class="operator">(</span>p_Row<span class="operator">);</span><span class="comment">
// Create another row.
</span> p_Row<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createElement<span class="operator">(</span><span class="string">L"row"</span><span class="operator">);</span>
p_Row<span class="operator">-></span>setAttribute<span class="operator">(</span><span class="string">L"website"</span><span class="operator">,</span><span class="string"> L"http://www.3g4g.co.uk/"</span><span class="operator">);</span>
p_TextNode<span class="operator"> =</span> p_DOMDocument<span class="operator">-></span>createTextNode<span class="operator">(</span><span class="string">L"3G and 4G Wireless Resources"</span><span class="operator">);</span>
p_Row<span class="operator">-></span>appendChild<span class="operator">(</span>p_TextNode<span class="operator">);</span>
p_DataElement<span class="operator">-></span>appendChild<span class="operator">(</span>p_Row<span class="operator">);</span><span class="comment">
//Output on console
</span> DoOutput2Stream<span class="operator">(</span>p_DOMDocument<span class="operator">);</span><span class="comment">
//Output to a file
</span> DoOutput2File<span class="operator">(</span>p_DOMDocument<span class="operator">,</span> XMLString<span class="operator">::</span>transcode<span class="operator">(</span><span class="string">"..\\..\\XML\\Test.xml"</span><span class="operator">));</span><span class="comment">
// Cleanup.
</span> p_DOMDocument<span class="operator">-></span>release<span class="operator">();</span>
XMLPlatformUtils<span class="operator">::</span>Terminate<span class="operator">();</span><span class="flow">
return</span><span class="int"> 0</span><span class="operator">;
}</span><span class="type">
void</span> DoOutput2Stream<span class="operator">(</span>DOMDocument<span class="operator">*</span> pmyDOMDocument<span class="operator">)
{</span>
DOMImplementation<span class="operator"> *</span>pImplement<span class="operator"> =</span> NULL<span class="operator">;</span>
DOMLSSerializer<span class="operator"> *</span>pSerializer<span class="operator"> =</span> NULL<span class="operator">;</span>
XMLFormatTarget<span class="operator"> *</span>pTarget<span class="operator"> =</span> NULL<span class="operator">;</span><span class="comment">
/*
Return the first registered implementation that has
the desired features. In this case, we are after
a DOM implementation that has the LS feature... or Load/Save.
*/</span>
pImplement<span class="operator"> =</span> DOMImplementationRegistry<span class="operator">::</span>getDOMImplementation<span class="operator">(</span><span class="string">L"LS"</span><span class="operator">);</span><span class="comment">
/*
From the DOMImplementation, create a DOMWriter.
DOMWriters are used to serialize a DOM tree [back] into an XML document.
*/</span>
pSerializer<span class="operator"> = ((</span>DOMImplementationLS<span class="operator">*)</span>pImplement<span class="operator">)-></span>createLSSerializer<span class="operator">();</span><span class="comment">
/*
This line is optional. It just sets a feature
of the Serializer to make the output
more human-readable by inserting line-feeds and tabs,
without actually inserting any new nodes
into the DOM tree. (There are many different features to set.)
Comment it out and see the difference.
*/</span><span class="comment">
//The end-of-line sequence of characters to be used in the XML being written out.
</span> pSerializer<span class="operator">-></span>setNewLine<span class="operator">(</span>XMLString<span class="operator">::</span>transcode<span class="operator">(</span><span class="string">"\n"</span><span class="operator">));</span>
DOMConfiguration<span class="operator">*</span> pDomConfiguration<span class="operator"> =</span> pSerializer<span class="operator">-></span>getDomConfig<span class="operator">();</span>
pDomConfiguration<span class="operator">-></span>setParameter<span class="operator">(</span>XMLUni<span class="operator">::</span>fgDOMWRTFormatPrettyPrint<span class="operator">,</span><span class="bool"> true</span><span class="operator">);</span><span class="comment">
/*
Choose a location for the serialized output. The 3 options are:
1) StdOutFormatTarget (std output stream - good for debugging)
2) MemBufFormatTarget (to Memory)
3) LocalFileFormatTarget (save to file)
(Note: You'll need a different header file for each one)
*/</span>
pTarget<span class="operator"> =</span><span class="keyword"> new</span> StdOutFormatTarget<span class="operator">();</span>
DOMLSOutput<span class="operator">*</span> pDomLsOutput<span class="operator"> = ((</span>DOMImplementationLS<span class="operator">*)</span>pImplement<span class="operator">)-></span>createLSOutput<span class="operator">();</span>
pDomLsOutput<span class="operator">-></span>setByteStream<span class="operator">(</span>pTarget<span class="operator">);</span><span class="comment">
// Write the serialized output to the target.
</span> pSerializer<span class="operator">-></span>write<span class="operator">(</span>pmyDOMDocument<span class="operator">,</span> pDomLsOutput<span class="operator">);
}</span><span class="type">
void</span> DoOutput2File<span class="operator">(</span>DOMDocument<span class="operator">*</span> pmyDOMDocument<span class="operator">,</span><span class="keyword"> const</span><span class="type"> wchar_t</span><span class="operator"> *</span> FullFilePath<span class="operator"> )
{</span>
DOMImplementation<span class="operator"> *</span>pImplement<span class="operator"> =</span> NULL<span class="operator">;</span>
DOMLSSerializer<span class="operator"> *</span>pSerializer<span class="operator"> =</span> NULL<span class="operator">;</span>
XMLFormatTarget<span class="operator"> *</span>pTarget<span class="operator"> =</span> NULL<span class="operator">;</span><span class="comment">
/*
Return the first registered implementation that
has the desired features. In this case, we are after
a DOM implementation that has the LS feature... or Load/Save.
*/</span>
pImplement<span class="operator"> =</span> DOMImplementationRegistry<span class="operator">::</span>getDOMImplementation<span class="operator">(</span><span class="string">L"LS"</span><span class="operator">);</span><span class="comment">
/*
From the DOMImplementation, create a DOMWriter.
DOMWriters are used to serialize a DOM tree [back] into an XML document.
*/</span>
pSerializer<span class="operator"> = ((</span>DOMImplementationLS<span class="operator">*)</span>pImplement<span class="operator">)-></span>createLSSerializer<span class="operator">();</span><span class="comment">
/*
This line is optional. It just sets a feature
of the Serializer to make the output
more human-readable by inserting line-feeds,
without actually inserting any new elements/nodes
into the DOM tree. (There are many different features to set.)
Comment it out and see the difference.
*/</span>
DOMConfiguration<span class="operator">*</span> pDomConfiguration<span class="operator"> =</span> pSerializer<span class="operator">-></span>getDomConfig<span class="operator">();</span>
pDomConfiguration<span class="operator">-></span>setParameter<span class="operator">(</span>XMLUni<span class="operator">::</span>fgDOMWRTFormatPrettyPrint<span class="operator">,</span><span class="bool"> true</span><span class="operator">);</span><span class="comment">
/*
Choose a location for the serialized output. The 3 options are:
1) StdOutFormatTarget (std output stream - good for debugging)
2) MemBufFormatTarget (to Memory)
3) LocalFileFormatTarget (save to file)
(Note: You'll need a different header file for each one)
Don't forget to escape file-paths with a backslash character, or
just specify a file to be saved in the exe directory.
eg. c:\\example\\subfolder\\pfile.xml
*/</span>
pTarget<span class="operator"> =</span><span class="keyword"> new</span> LocalFileFormatTarget<span class="operator">(</span>FullFilePath<span class="operator">);</span><span class="comment">
// Write the serialized output to the target.
</span> DOMLSOutput<span class="operator">*</span> pDomLsOutput<span class="operator"> = ((</span>DOMImplementationLS<span class="operator">*)</span>pImplement<span class="operator">)-></span>createLSOutput<span class="operator">();</span>
pDomLsOutput<span class="operator">-></span>setByteStream<span class="operator">(</span>pTarget<span class="operator">);</span>
pSerializer<span class="operator">-></span>write<span class="operator">(</span>pmyDOMDocument<span class="operator">,</span> pDomLsOutput<span class="operator">);
}</span>
</pre>
</div>
<br />
<br />
The output is as follows:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY-u2rgdnK8MfeERje0LfqcbNmfSF0FElBYXxYOHzKZOvT2MJcgr6D5fmNo4z4P4TeGPviZvSRM2_ClDJY_xKlOsKfO5PLG9XE54qAq8yiiJ7Mba18msPhAbyY-3QhXUXCIo91E9Acw2kV/s1600/XercesSample02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY-u2rgdnK8MfeERje0LfqcbNmfSF0FElBYXxYOHzKZOvT2MJcgr6D5fmNo4z4P4TeGPviZvSRM2_ClDJY_xKlOsKfO5PLG9XE54qAq8yiiJ7Mba18msPhAbyY-3QhXUXCIo91E9Acw2kV/s640/XercesSample02.jpg" width="640" /></a></div>
<br />
<br />
The XML file is as follows:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhabBoGh1_10RcCDDSYmdm0si3y9eZr3mqbQT5JZveGnKKnhhOBDnbgrg1b-sGuYzSjAndg1Us4ji0Rv_qjPaJ928OWttlRpPxjd-g68blrhNFFQxmin2rCKIdPYoGhor7r47Wo7Ko9vAxI/s1600/Test.xml.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhabBoGh1_10RcCDDSYmdm0si3y9eZr3mqbQT5JZveGnKKnhhOBDnbgrg1b-sGuYzSjAndg1Us4ji0Rv_qjPaJ928OWttlRpPxjd-g68blrhNFFQxmin2rCKIdPYoGhor7r47Wo7Ko9vAxI/s640/Test.xml.jpg" width="640" /></a></div>
<br /></div>
Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com4tag:blogger.com,1999:blog-2349434231090974738.post-40117839672062693582012-10-14T15:42:00.000+01:002012-10-14T15:42:06.712+01:00Xerces: Reading an XML file and printing it out<div dir="ltr" style="text-align: left;" trbidi="on">
As I mentioned in the<a href="http://advancedcppwithexamples.blogspot.com/2012/10/xerces-for-c-using-visual-studio-2010.html"> Xerces introductory post</a>, here is the first program:<br />
<br />
I have created an XML file called books.xml located in the <a href="http://advancedcppwithexamples.blogspot.com/2012/10/xerces-for-c-using-visual-studio-2010.html">XML directory</a>.<br />
<br />
All the operations will be done in the DomReader class.<br />
<br />
main.cpp<br />
<div style="background: #DDDDDD;">
<pre><span class="comment">
//Program tested on Microsoft Visual Studio 2010 - Zahid Ghadialy
//Example demonstrates reading an XML file and printing it out
</span><span class="pre">
#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include "DomReader.h"
</span><span class="keyword">
using namespace</span> std<span class="operator">;</span><span class="type">
int</span><span class="keyword"> main</span><span class="operator">()
{</span>
string xmlFileName<span class="operator">=</span><span class="string">"..\\..\\XML\\books.xml"</span><span class="operator">;</span>
DomReader myDomReader<span class="operator">;</span><span class="flow">
try</span><span class="operator">
{</span>
myDomReader<span class="operator">.</span>readDomFile<span class="operator">(</span>xmlFileName<span class="operator">);
}</span><span class="flow">
catch</span><span class="operator"> (</span>runtime_error e<span class="operator">)
{</span>
cout<span class="operator"> <<</span> e<span class="operator">.</span>what<span class="operator">() <<</span>endl<span class="operator">;
}</span><span class="flow">
catch</span><span class="operator">(...)
{</span>
cout<span class="operator"> <<</span><span class="string"> "Unexpected error occurred"</span><span class="operator"> <<</span> endl<span class="operator">;
}</span><span class="flow">
return</span><span class="int"> 0</span><span class="operator">;
}</span></pre>
</div>
<br />
<br />
DomReader.h<br />
<div style="background: #DDDDDD;">
<pre><span class="pre">
#include <string>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
</span><span class="keyword">
using namespace</span> std<span class="operator">;</span>
XERCES_CPP_NAMESPACE_USE<span class="keyword">
class</span> DomReader<span class="operator">
{</span><span class="keyword">
public</span><span class="operator">:</span>
DomReader<span class="operator">();
~</span>DomReader<span class="operator">();</span><span class="type">
void</span> readDomFile<span class="operator">(</span>std<span class="operator">::</span>string<span class="operator">&)</span><span class="flow"> throw</span><span class="operator">(</span>std<span class="operator">::</span>runtime_error<span class="operator">);</span><span class="keyword">
private</span><span class="operator">:</span><span class="type">
void</span> convertDomToXmlString<span class="operator">(</span>DOMNode<span class="operator">*</span> domNode<span class="operator">,</span> std<span class="operator">::</span>string<span class="operator"> &)</span><span class="flow"> throw</span><span class="operator">(</span>std<span class="operator">::</span>runtime_error<span class="operator">);</span>
string narrow<span class="operator">(</span><span class="keyword"> const</span> wstring<span class="operator">&</span> str<span class="operator"> );</span>
xercesc<span class="operator">::</span>XercesDOMParser<span class="operator"> *</span>domFileParser<span class="operator">;
};</span>
</pre>
</div>
<br />
<br />
DomReader.cpp<br />
<div style="background: #DDDDDD;">
<pre><span class="pre">
#include <iostream>
#include <sstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "DomReader.h"
</span>
DomReader<span class="operator">::</span>DomReader<span class="operator">()
{</span>
XMLPlatformUtils<span class="operator">::</span>Initialize<span class="operator">();</span>
domFileParser<span class="operator"> =</span><span class="keyword"> new</span> XercesDOMParser<span class="operator">;</span>
domFileParser<span class="operator">-></span>setValidationScheme<span class="operator">(</span>XercesDOMParser<span class="operator">::</span>Val_Never<span class="operator">);</span>
domFileParser<span class="operator">-></span>setDoNamespaces<span class="operator">(</span><span class="bool">false</span><span class="operator">);</span><span class="comment"> // optional
</span><span class="operator">}</span>
DomReader<span class="operator">::~</span>DomReader<span class="operator">()
{</span><span class="flow">
if</span><span class="operator">(</span>domFileParser<span class="operator">)</span><span class="keyword">
delete</span> domFileParser<span class="operator">;</span>
XMLPlatformUtils<span class="operator">::</span>Terminate<span class="operator">();
}</span><span class="type">
void</span> DomReader<span class="operator">::</span>readDomFile<span class="operator">(</span>string<span class="operator">&</span> domFileName<span class="operator">)</span><span class="flow"> throw</span><span class="operator">(</span>std<span class="operator">::</span>runtime_error<span class="operator">)
{</span><span class="comment">
//Check if filename / file is good
</span><span class="keyword"> struct</span> _stat fileStatus<span class="operator">;</span><span class="type">
int</span> returnStat<span class="operator"> =</span> _stat<span class="operator">(</span>domFileName<span class="operator">.</span>c_str<span class="operator">(), &</span>fileStatus<span class="operator">);</span><span class="flow">
if</span><span class="operator"> (</span> returnStat<span class="operator"> ==</span> ENOENT<span class="operator"> )</span><span class="flow">
throw</span><span class="operator"> (</span> runtime_error<span class="operator">(</span><span class="string">"Path file_name does not exist, or path is an empty string."</span><span class="operator">) );</span><span class="flow">
else if</span><span class="operator"> (</span> returnStat<span class="operator"> ==</span> ENOTDIR<span class="operator"> )</span><span class="flow">
throw</span><span class="operator"> (</span> std<span class="operator">::</span>runtime_error<span class="operator">(</span><span class="string">"A component of the path is not a directory."</span><span class="operator">));</span><span class="flow">
else if</span><span class="operator">(</span> returnStat<span class="operator"> ==</span> ELOOP<span class="operator"> )</span><span class="flow">
throw</span><span class="operator"> (</span> std<span class="operator">::</span>runtime_error<span class="operator">(</span><span class="string">"Too many symbolic links encountered while traversing the path."</span><span class="operator">));</span><span class="flow">
else if</span><span class="operator">(</span> returnStat<span class="operator"> ==</span> EACCES<span class="operator"> )</span><span class="flow">
throw</span><span class="operator"> (</span> std<span class="operator">::</span>runtime_error<span class="operator">(</span><span class="string">"Permission denied."</span><span class="operator">));</span><span class="flow">
else if</span><span class="operator">(</span> returnStat<span class="operator"> ==</span> ENAMETOOLONG<span class="operator"> )</span><span class="flow">
throw</span><span class="operator"> (</span> std<span class="operator">::</span>runtime_error<span class="operator">(</span><span class="string">"File can not be read\n"</span><span class="operator">));</span><span class="flow">
else if</span><span class="operator">(</span> returnStat<span class="operator"> == -</span><span class="int">1</span><span class="operator">)</span><span class="flow">
throw</span><span class="operator"> (</span> std<span class="operator">::</span>runtime_error<span class="operator">(</span><span class="string">"Other Unknown Error\n"</span><span class="operator">));</span><span class="comment">
//Parse the file
</span> domFileParser<span class="operator">-></span>parse<span class="operator">(</span>domFileName<span class="operator">.</span>c_str<span class="operator">());</span><span class="comment">
//No need to free this pointer - owned by the parent parser object
</span> DOMDocument<span class="operator">*</span> xmlDoc<span class="operator"> =</span> domFileParser<span class="operator">-></span>getDocument<span class="operator">();</span><span class="flow">
if</span><span class="operator">( !</span>xmlDoc<span class="operator"> )</span><span class="flow"> throw</span><span class="operator">(</span>std<span class="operator">::</span>runtime_error<span class="operator">(</span><span class="string"> "DOM document could not be opened"</span><span class="operator"> ));</span><span class="comment">
//Get the top-level element: Name is "root". No attributes for "root"
</span> DOMElement<span class="operator">*</span> elementRoot<span class="operator"> =</span> xmlDoc<span class="operator">-></span>getDocumentElement<span class="operator">();</span><span class="flow">
if</span><span class="operator">( !</span>elementRoot<span class="operator"> )</span><span class="flow"> throw</span><span class="operator">(</span>std<span class="operator">::</span>runtime_error<span class="operator">(</span><span class="string"> "empty XML document"</span><span class="operator"> ));</span>
string xmlString<span class="operator">;</span><span class="flow">
try</span><span class="operator">
{</span>
convertDomToXmlString<span class="operator">(</span>elementRoot<span class="operator">,</span> xmlString<span class="operator">);
}</span><span class="flow">
catch</span><span class="operator">(</span>runtime_error e<span class="operator">)
{</span><span class="flow">
throw</span><span class="operator">(</span>runtime_error<span class="operator">(</span>e<span class="operator">));
}</span>
cout<span class="operator"> <<</span><span class="string"> "DOM File: "</span><span class="operator"><<</span> domFileName<span class="operator"> <<</span><span class="string"> " output is as follows "</span><span class="operator"><<</span>endl<span class="operator">;</span>
cout<span class="operator"> <<</span> xmlString<span class="operator">;</span>
cout<span class="operator"> <<</span> endl<span class="operator">;
}</span><span class="type">
void</span> DomReader<span class="operator">::</span>convertDomToXmlString<span class="operator">(</span>DOMNode<span class="operator">*</span> domNode<span class="operator">,</span> string<span class="operator"> &</span>xmlString<span class="operator">)</span><span class="flow"> throw</span><span class="operator">(</span>std<span class="operator">::</span>runtime_error<span class="operator">)
{</span><span class="flow">
try</span><span class="operator">
{</span>
DOMImplementation<span class="operator"> *</span>domImpl<span class="operator"> =</span> DOMImplementationRegistry<span class="operator">::</span>getDOMImplementation<span class="operator">(</span><span class="string">L"LS"</span><span class="operator">);</span>
DOMLSSerializer<span class="operator"> *</span>domSerializer<span class="operator"> = ((</span>DOMImplementationLS<span class="operator">*)</span>domImpl<span class="operator">)-></span>createLSSerializer<span class="operator">();</span>
XMLCh<span class="operator"> *</span>xmlBuffer<span class="operator"> =</span> domSerializer<span class="operator">-></span>writeToString<span class="operator">(</span>domNode<span class="operator">);</span>
xmlString<span class="operator"> =</span> narrow<span class="operator">(</span>xmlBuffer<span class="operator">);</span>
XMLString<span class="operator">::</span>release<span class="operator"> (&</span>xmlBuffer<span class="operator">);</span><span class="keyword">
delete</span> domSerializer<span class="operator">;
}</span><span class="flow">
catch</span><span class="operator">(</span>XMLException<span class="operator">&</span> e<span class="operator">)
{</span><span class="type">
char</span><span class="operator"> *</span>xmlErrMessage<span class="operator"> =</span> XMLString<span class="operator">::</span>transcode<span class="operator">(</span>e<span class="operator">.</span>getMessage<span class="operator">());</span><span class="flow">
throw</span> runtime_error<span class="operator">(</span>xmlErrMessage<span class="operator">);
}</span><span class="flow">
catch</span><span class="operator">(...)
{</span><span class="flow">
throw</span> runtime_error<span class="operator">(</span><span class="string">"Unknown error in convertDomToXmlString\n"</span><span class="operator">);
}
}</span>
string DomReader<span class="operator">::</span>narrow<span class="operator">(</span><span class="keyword"> const</span> wstring<span class="operator">&</span> str<span class="operator"> )
{</span>
ostringstream stm<span class="operator"> ;</span><span class="keyword">
const</span> ctype<span class="operator"><</span><span class="type">char</span><span class="operator">>&</span> ctfacet<span class="operator"> =</span> use_facet<span class="operator"><</span> ctype<span class="operator"><</span><span class="type">char</span><span class="operator">> >(</span> stm<span class="operator">.</span>getloc<span class="operator">() ) ;</span><span class="flow">
for</span><span class="operator">(</span> size_t i<span class="operator">=</span><span class="int">0</span><span class="operator"> ;</span> i<span class="operator"><</span>str<span class="operator">.</span>size<span class="operator">() ; ++</span>i<span class="operator"> )</span>
stm<span class="operator"> <<</span> ctfacet<span class="operator">.</span>narrow<span class="operator">(</span> str<span class="operator">[</span>i<span class="operator">],</span><span class="int"> 0</span><span class="operator"> ) ;</span><span class="flow">
return</span> stm<span class="operator">.</span>str<span class="operator">() ;
}</span>
</pre>
</div>
<br />
<br />
The output is as follows:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEtP0xZAbn5e5j-0yAW7iAXWdqY-_5uoWBBtfUzvuiYCz5r3NyZlQmDgk6-AvhWTZWcj1bdrbAWNuzmTkmrBqLeXVsCs5tjHXgblsZ4ww4GZibZfyY5HtwVFs2eDvfe6mXMDbnHDD2TXMA/s1600/XercesSample01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEtP0xZAbn5e5j-0yAW7iAXWdqY-_5uoWBBtfUzvuiYCz5r3NyZlQmDgk6-AvhWTZWcj1bdrbAWNuzmTkmrBqLeXVsCs5tjHXgblsZ4ww4GZibZfyY5HtwVFs2eDvfe6mXMDbnHDD2TXMA/s640/XercesSample01.jpg" width="640" /></a></div>
<br />
<br /></div>
Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-10651929283741653032012-10-13T15:08:00.001+01:002012-10-13T15:08:47.086+01:00Xerces for C++ Using Visual Studio 2010<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
It has been long since the last updates to this blog. I am in process of using Xerces-C++ for doing some coding and am going to write some posts on that. Clearly I have to say that this is my attempt to learn and I will be making lots of mistakes as a result. Having said that I am hoping that some of the people who are experts will correct me and provide good suggestions, better solutions.<br />
<br />
I am also happy if someone else wants to write some blog posts on this topic or general C++ as long as there are enough examples to get your point across.<br />
<br />
My Configuration:<br />
<br />
Visual Studio 2010<br />
<br />
Xerces is xerces-c-3.1.1-x86-windows-vc-10.0 that I have installed (copied) at: <span style="color: #990000;">C:\Program Files</span>. Downloaded from <a href="http://xerces.apache.org/xerces-c/download.cgi">http://xerces.apache.org/xerces-c/download.cgi</a><br />
<br />
The following will need to be added in the properties<br />
In Include Directories add - <span style="color: #990000;">C:\Program Files\xerces-c-3.1.1-x86-windows-vc-10.0\include;</span><br />
In Library Directories add - <span style="color: #990000;">C:\Program Files\xerces-c-3.1.1-x86-windows-vc-10.0\lib;</span><br />
In Additional dependancies add - xerces-c_3D.lib; --> Note that this is for Debug configuration, for Release configuration you will need the release .lib<br />
<br />
I also use Notepad++ to write XML files manually, available at: <a href="http://notepad-plus-plus.org/">http://notepad-plus-plus.org/</a><br />
<br />
The directory structure for the code is as follows<br />
<span style="color: #990000;">/</span><br />
<span style="color: #990000;">---Sample01/</span><br />
<span style="color: #990000;">---Sample02/</span><br />
<span style="color: #990000;">---XML/</span><br />
<span style="color: #990000;"> ---books.xml</span><br />
<span style="color: #990000;"> ---xyz.xml</span><br />
<br />
I will be using the xml files in XML directory and if needed will write output there <br />
<br />
These programs will use XML and DOM so its a good idea to learn a bit about it. Use the link for XML and DOM.<br />
<a href="http://www.w3schools.com/xml/">http://www.w3schools.com/xml/</a><br />
<a href="http://www.w3schools.com/dom/default.asp">http://www.w3schools.com/dom/default.asp</a><br />
<br />
Here are some of the other sites (working list) I am following for this topic and will be referring to examples from here.<br />
<br />
<a href="http://www.yolinux.com/TUTORIALS/XML-Xerces-C.html">http://www.yolinux.com/TUTORIALS/XML-Xerces-C.html</a><br />
<a href="http://www.codeproject.com/Articles/31088/Xerces-for-C-Tutorial-Using-Visual-C">http://www.codeproject.com/Articles/31088/Xerces-for-C-Tutorial-Using-Visual-C</a><br />
<a href="http://www.codeproject.com/Articles/32762/Xerces-for-C-Using-Visual-C-Part-2">http://www.codeproject.com/Articles/32762/Xerces-for-C-Using-Visual-C-Part-2</a><br />
<br />
</div>
Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com1tag:blogger.com,1999:blog-2349434231090974738.post-20164548346121684382011-06-18T02:56:00.000+01:002011-06-18T02:56:00.152+01:00On vacation from coding<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX4yB7jKnnzK0Z3PReMMPUhakRKYUl3PTogvpfzI6sPm1L9rnkdvK_rAnrnscZqzsPdSWH6wpklnxcPmDVQwb9_Q10p9Y5ITxr6P7GGPZx__CuW5s8xrZ2f-_SHuhjmqLQTOUSBNHceIjk/s1600/vacacation.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX4yB7jKnnzK0Z3PReMMPUhakRKYUl3PTogvpfzI6sPm1L9rnkdvK_rAnrnscZqzsPdSWH6wpklnxcPmDVQwb9_Q10p9Y5ITxr6P7GGPZx__CuW5s8xrZ2f-_SHuhjmqLQTOUSBNHceIjk/s400/vacacation.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5617718527489061794" /></a><br /><div>I am taking a vacation from coding and as a result, I may not be updating the blog for some time to come. </div><div><br /></div><div>I will still try my best to moderate the comments and reply to them as far as possible.</div><div><br /></div><div>If you are interested in C++, I recommend that you join the <a href="http://www.linkedin.com/groups?mostPopular=&gid=86782">C++ professional group</a> on Linkedin and there are lots of interesting discussions going on, on a regular basis. There is also the <a href="http://advancedcppwithexamples.blogspot.com/p/other-websites-with-c-code-examples.html">other websites</a> page that links other interesting sites on C++.</div><div><br /></div><div>For the time being, Adieu!</div><div><br /></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com1tag:blogger.com,1999:blog-2349434231090974738.post-47360295920816153712011-06-14T06:33:00.004+01:002011-06-14T06:33:00.189+01:00When true != trueIf we define a boolean variable, say: <div><span class="Apple-style-span" >bool</span> xyz;<div><br /></div><div>then when we have to do some kind of a comparison we may do this as follows:</div><div><span class="Apple-style-span" >if</span>(xyz == <span class="Apple-style-span" >true</span>) </div><div><br /></div><div>When I used to be a new programmer, I used to always do this as follows:</div><div><span class="Apple-style-span" >if</span>(<span class="Apple-style-span" >true</span> == xyz)</div><div><br /></div><div>I think the way I did it is more robust and less error prone because you can by mistake do as follows:</div><div><span class="Apple-style-span" >if</span>(xyz = <span class="Apple-style-span" >true</span>) //Single = instead of ==</div><div><br /></div><div>The problem with my approach is that the code readability is affected and most people hate to see code like this. Instead, I started doing what normal people would do but making sure that I always use '==' and not '='.</div><div><br /></div><div>Now some of you may be thinking why not:</div><div><span class="Apple-style-span" >if</span>(xyz)</div><div><br /></div><div>True, in case of Boolean this is a simplest way to do it and I had personally no problem with it until recently. While reviewing some code, I noticed that an engineer had changed a piece of code from:</div><div><span class="Apple-style-span" >if</span>(xyz == <span class="Apple-style-span" >true</span>) to <span class="Apple-style-span" >if</span>(xyz)</div><div><br /></div><div>Initially I thought that it may be that he did not like the '==' as its redundant. So when I checked his other code, I realised that he may have done this for a reason. Executing his code in the debug mode worked fine. So I changed:</div><div><span class="Apple-style-span" >if</span>(xyz) back to <span class="Apple-style-span" >if</span>(xyz == <span class="Apple-style-span" >true</span>) and lo and behold, the test started to fail.</div><div><br /></div><div>Putting a breakpoint I can see that while on the statement:</div><div><span class="Apple-style-span" >if</span>(xyz == <span class="Apple-style-span" >true</span>)</div><div>the debugger shows xyz is 'true' but the comparison fails.</div><div><br /></div></div><div>As usual digging into the problem further, I found that in one of the constructors, xyz was not initialised and the default garbage value appeared to show it as 'true'.</div><div><br /></div><div>So its again got me into thinking that it may be better to write <span class="Apple-style-span" >if</span>(xyz == <span class="Apple-style-span" >true</span>) instead of <span class="Apple-style-span" >if</span>(xyz) as it may help in catching uninitialised variables. The best thing of course would be to make sure all variables in the class, whether public, protected or private are initialised.</div><div><br /></div><div>Opinions welcome!</div><div><br /></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com6tag:blogger.com,1999:blog-2349434231090974738.post-13320981222354118872011-06-07T06:14:00.000+01:002011-06-07T06:14:00.458+01:00Multisets and Multimaps<div>I was trying to understand where multisets would be used as compared to multimaps and I didnt find any straightforward answer. I found this simple explanation at <a href="http://stackoverflow.com/questions/2858127/multiset-multimap-whats-the-point">StackOverflow</a>:</div><div><br /></div><div><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-weight: bold; background-position: initial initial; background-repeat: initial initial; ">multimap</strong></p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; list-style-type: disc; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">With ZIP code as a key, all people which have that ZIP code</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">With account ID as key, all open orders of that person/account</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">A dictionary, with per keyword various explanations</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-weight: bold; background-position: initial initial; background-repeat: initial initial; ">multiset</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">is in essence a map with a key and a integer count.</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; list-style-type: disc; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">The inventory of a shop, all products have their key and the amount still available is the value</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">accumulated sales data of a shop, every time a product is sold the product id get's added to the multiset thereby increasing the amount sold</li></ul></span></div><div><br /></div><div>As a result I created this example below. This is probably not the best of examples but I didnt want to change it. The main problem below is that multimap's are not strictly speaking required in the example below. I could have used a map. Multimap would be needed if there was no quantity_ in the class and then I can add the products one by one. I could have then used the count method to get the quantity. </div><div><br /></div><div>Anyway, program as follows:</div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br />//Simple example of multiset<br /></span><span class="pre"><br />#include <iostream><br />#include <string><br />#include <set><br />#include <map><br />#include <algorithm><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="keyword"><br /><br />class</span> Product<span class="comment"> //Keeping this simple<br /></span><span class="operator">{</span><span class="keyword"><br />public</span><span class="operator">:</span><br />Product<span class="operator">(</span>string name<span class="operator">,</span><span class="type"> int</span> code<span class="operator">,</span><span class="type"> int</span> price<span class="operator">) :</span><br /> name_<span class="operator">(</span>name<span class="operator">),</span> productCode_<span class="operator">(</span>code<span class="operator">),</span> price_<span class="operator">(</span>price<span class="operator">)<br /> {</span><br /> quantity_<span class="operator"> =</span><span class="int"> 10</span><span class="operator">;</span><span class="comment"> //Lets fix this value for simplicity<br /></span><span class="operator"> }</span><span class="type"><br />bool</span> availableForSale<span class="operator">()<br />{</span><span class="flow"><br /> if</span><span class="operator">(</span>quantity_<span class="operator"> ></span><span class="int"> 0</span><span class="operator">)<br /> {</span><br /> quantity_<span class="operator">--;</span><span class="flow"><br /> return</span><span class="bool"> true</span><span class="operator">;<br /> }</span><span class="flow"><br /> return</span><span class="bool"> false</span><span class="operator">;<br />}</span><br />string name_<span class="operator">;</span><span class="type"><br />int</span> productCode_<span class="operator">;</span><span class="type"><br />int</span> price_<span class="operator">;</span><span class="type"><br />int</span> quantity_<span class="operator">;</span><span class="keyword"><br />private</span><span class="operator">:</span><br />Product<span class="operator">();</span><span class="comment"> //Disabled the default constructor<br /></span><span class="operator">};</span><span class="type"><br /><br />void</span> sellProduct<span class="operator">(</span>string name<span class="operator">,</span> multimap<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>&</span> inventory<span class="operator">,</span> multiset<span class="operator"> <</span><span class="type">int</span><span class="operator">> &</span>soldItems<span class="operator">)<br />{</span><br />multimap<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>::</span>iterator it<span class="operator"> =</span> inventory<span class="operator">.</span>find<span class="operator">(</span>name<span class="operator">);</span><span class="flow"><br />if</span><span class="operator">(</span>it<span class="operator"> !=</span> inventory<span class="operator">.</span>end<span class="operator">())<br />{</span><span class="flow"><br /> if</span><span class="operator"> ((*</span>it<span class="operator">-></span>second<span class="operator">).</span>availableForSale<span class="operator">())<br /> {</span><br /> soldItems<span class="operator">.</span>insert<span class="operator">((*</span>it<span class="operator">-></span>second<span class="operator">).</span>productCode_<span class="operator">);<br /> }<br />}</span><span class="flow"><br />else</span><span class="operator"><br />{</span><br /> cout<span class="operator"> <<</span><span class="string"> "Unknown product : "</span><span class="operator"> <<</span> name<span class="operator"> <<</span> endl<span class="operator">;<br />}<br />}</span><span class="type"><br /><br />void</span> soldItemsList<span class="operator">(</span>multimap<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>&</span> inventory<span class="operator">,</span> multiset<span class="operator"> <</span><span class="type">int</span><span class="operator">> &</span>soldItems<span class="operator">)<br />{</span><br />multimap<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>::</span>iterator it<span class="operator"> =</span> inventory<span class="operator">.</span>begin<span class="operator">();</span><span class="flow"><br />for</span><span class="operator">(</span>it<span class="operator"> =</span> inventory<span class="operator">.</span>begin<span class="operator">();</span> it<span class="operator"> !=</span> inventory<span class="operator">.</span>end<span class="operator">(); ++</span>it<span class="operator">)<br />{</span><span class="type"><br /> int</span> soldCount<span class="operator"> =</span> soldItems<span class="operator">.</span>count<span class="operator">((*</span>it<span class="operator">-></span>second<span class="operator">).</span>productCode_<span class="operator">);</span><br /> cout<span class="operator"><<</span><span class="string">"Product = "</span><span class="operator"> << (*</span>it<span class="operator">-></span>second<span class="operator">).</span>name_<span class="operator"> <<</span><span class="string"> ", Quantity Sold = "</span><span class="operator"> <<</span> soldCount<span class="operator"> <<</span> endl<span class="operator">;<br />}<br />}</span><span class="type"><br /><br />int</span> checkSales<span class="operator">(</span>multimap<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>&</span> inventory<span class="operator">,</span> multiset<span class="operator"> <</span><span class="type">int</span><span class="operator">> &</span>soldItems<span class="operator">)<br />{</span><span class="type"><br />int</span> totalSales<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span><br />multimap<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>::</span>iterator it<span class="operator">;</span><span class="flow"><br />for</span><span class="operator">(</span>it<span class="operator"> =</span> inventory<span class="operator">.</span>begin<span class="operator">();</span> it<span class="operator"> !=</span> inventory<span class="operator">.</span>end<span class="operator">(); ++</span>it<span class="operator">)<br />{</span><span class="type"><br /> int</span> soldCount<span class="operator"> =</span> soldItems<span class="operator">.</span>count<span class="operator">((*</span>it<span class="operator">-></span>second<span class="operator">).</span>productCode_<span class="operator">);</span><br /> totalSales<span class="operator"> +=</span> soldCount<span class="operator"> * (*</span>it<span class="operator">-></span>second<span class="operator">).</span>price_<span class="operator">;<br />}</span><span class="flow"><br />return</span> totalSales<span class="operator">;<br />}</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="comment"><br />//There is no special reason to use multimap instead of a map<br />//If you wanted to add same product and create quantity multimap is required<br /></span> multimap<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*></span> inventory<span class="operator">;</span><br />Product<span class="operator">*</span> prod1<span class="operator"> =</span><span class="keyword"> new</span> Product<span class="operator">(</span><span class="string">"product1"</span><span class="operator">,</span><span class="int"> 2334</span><span class="operator">,</span><span class="int"> 10</span><span class="operator">);</span><br />Product<span class="operator">*</span> prod2<span class="operator"> =</span><span class="keyword"> new</span> Product<span class="operator">(</span><span class="string">"product2"</span><span class="operator">,</span><span class="int"> 4556</span><span class="operator">,</span><span class="int"> 50</span><span class="operator">);</span><br />inventory<span class="operator">.</span>insert<span class="operator">(</span>pair<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>(</span><span class="string">"product1"</span><span class="operator">,</span>prod1<span class="operator">));</span><br />inventory<span class="operator">.</span>insert<span class="operator">(</span>pair<span class="operator"><</span>string<span class="operator">,</span> Product<span class="operator">*>(</span><span class="string">"product2"</span><span class="operator">,</span>prod2<span class="operator">));</span><br /><br />multiset<span class="operator"> <</span><span class="type">int</span><span class="operator">></span> soldItems<span class="operator">;</span><br /><br />sellProduct<span class="operator">(</span><span class="string">"product1"</span><span class="operator">,</span> inventory<span class="operator">,</span> soldItems<span class="operator">);</span><br />sellProduct<span class="operator">(</span><span class="string">"product2"</span><span class="operator">,</span> inventory<span class="operator">,</span> soldItems<span class="operator">);</span><br />sellProduct<span class="operator">(</span><span class="string">"apple"</span><span class="operator">,</span> inventory<span class="operator">,</span> soldItems<span class="operator">);</span><br />sellProduct<span class="operator">(</span><span class="string">"product1"</span><span class="operator">,</span> inventory<span class="operator">,</span> soldItems<span class="operator">);</span><br />sellProduct<span class="operator">(</span><span class="string">"product1"</span><span class="operator">,</span> inventory<span class="operator">,</span> soldItems<span class="operator">);</span><br />sellProduct<span class="operator">(</span><span class="string">"product2"</span><span class="operator">,</span> inventory<span class="operator">,</span> soldItems<span class="operator">);</span><br /><br />soldItemsList<span class="operator">(</span>inventory<span class="operator">,</span> soldItems<span class="operator">);</span><br /><br />cout<span class="operator"><<</span><span class="string">"Total sales = "</span><span class="operator"> <<</span> checkSales<span class="operator">(</span>inventory<span class="operator">,</span> soldItems<span class="operator">) <<</span> endl<span class="operator">;</span><span class="keyword"><br /><br />delete</span> prod1<span class="operator">;</span><span class="keyword"><br />delete</span> prod2<span class="operator">;</span><span class="flow"><br />return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div><br /></div><div>The output as follows:</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz-jDHqXHA3BZzvPugYzWToy3qedCo3ZLRIJGAdpYJ_Z71WKJdmf8Agrvjhn9wQJCTGAPfgVdNME7QVX37B2VkviFj_TFh6fNtMlAoDiq2L5PBPbX-jaHnzEbRFazr0QRCsap95eynJgTG/s1600/zg_multiset_2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 125px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz-jDHqXHA3BZzvPugYzWToy3qedCo3ZLRIJGAdpYJ_Z71WKJdmf8Agrvjhn9wQJCTGAPfgVdNME7QVX37B2VkviFj_TFh6fNtMlAoDiq2L5PBPbX-jaHnzEbRFazr0QRCsap95eynJgTG/s400/zg_multiset_2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5613254809328668418" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com2tag:blogger.com,1999:blog-2349434231090974738.post-29677892368104647462011-06-02T06:08:00.002+01:002011-06-02T06:08:00.252+01:00Example of Multisets<div>Took this one from <a href="http://www.java2s.com/Code/Cpp/Set-Multiset/multisetcount.htm">Java2s</a> and modified it slightly to show a bit more info.</div><div><br /></div><div>Example as follows:</div><div><br /></div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br />//Simple example of multiset<br /></span><span class="pre"><br />#include <iostream><br />#include <set><br />#include <algorithm><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> a<span class="operator">[</span><span class="int"> 10</span><span class="operator"> ] = {</span><span class="int"> 7</span><span class="operator">,</span><span class="int"> 22</span><span class="operator">,</span><span class="int"> 9</span><span class="operator">,</span><span class="int"> 1</span><span class="operator">,</span><span class="int"> 18</span><span class="operator">,</span><span class="int"> 30</span><span class="operator">,</span><span class="int"> 100</span><span class="operator">,</span><span class="int"> 22</span><span class="operator">,</span><span class="int"> 85</span><span class="operator">,</span><span class="int"> 13</span><span class="operator"> };</span><span class="type"><br /> int</span> aSize<span class="operator"> =</span><span class="keyword"> sizeof</span><span class="operator">(</span>a<span class="operator">) /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="type">int</span><span class="operator">);</span><br /> std<span class="operator">::</span>multiset<span class="operator"><</span><span class="type"> int</span><span class="operator">,</span> std<span class="operator">::</span>less<span class="operator"><</span><span class="type"> int</span><span class="operator"> > ></span> intMultiset<span class="operator">(</span>a<span class="operator">,</span> a<span class="operator"> +</span> aSize<span class="operator">);</span><br /><br /> cout<span class="operator"> <<</span><span class="string"> "Printing out all the values in the multiset : "</span><span class="operator">;</span><br /> multiset<span class="operator"><</span><span class="type">int</span><span class="operator">>::</span>iterator it<span class="operator">;</span><span class="flow"><br /> for</span><span class="operator"> (</span> it<span class="operator"> =</span> intMultiset<span class="operator">.</span>begin<span class="operator">();</span> it<span class="operator"> !=</span> intMultiset<span class="operator">.</span>end<span class="operator">(); ++</span>it<span class="operator">)</span><br /> cout<span class="operator"> <<</span><span class="string"> " "</span><span class="operator"> << *</span>it<span class="operator">;</span><br /> cout<span class="operator"> <<</span> endl<span class="operator"> <<</span> endl<span class="operator">;</span><br /><br /> std<span class="operator">::</span>ostream_iterator<span class="operator"><</span><span class="type"> int</span><span class="operator"> ></span> output<span class="operator">(</span> cout<span class="operator">,</span><span class="string"> " "</span><span class="operator"> );</span><br /><br /> cout<span class="operator"> <<</span><span class="string"> "There are currently "</span><span class="operator"> <<</span> intMultiset<span class="operator">.</span>count<span class="operator">(</span><span class="int"> 15</span><span class="operator"> )<br /> <<</span><span class="string"> " values of 15 in the multiset\n\n"</span><span class="operator">;</span><br /><br /> intMultiset<span class="operator">.</span>insert<span class="operator">(</span><span class="int"> 15</span><span class="operator"> );</span><br /> intMultiset<span class="operator">.</span>insert<span class="operator">(</span><span class="int"> 15</span><span class="operator"> );</span><br /><br /> cout<span class="operator"> <<</span><span class="string"> "After two inserts, there are currently "</span><span class="operator"> <<</span> intMultiset<span class="operator">.</span>count<span class="operator">(</span><span class="int"> 15</span><span class="operator"> )<br /> <<</span><span class="string"> " values of 15 in the multiset\n\n"</span><span class="operator">;</span><br /><br /> cout<span class="operator"> <<</span><span class="string"> "Printing out all the values in the multiset : "</span><span class="operator">;</span><span class="flow"><br /> for</span><span class="operator"> (</span> it<span class="operator"> =</span> intMultiset<span class="operator">.</span>begin<span class="operator">();</span> it<span class="operator"> !=</span> intMultiset<span class="operator">.</span>end<span class="operator">(); ++</span>it<span class="operator">)</span><br /> cout<span class="operator"> <<</span><span class="string"> " "</span><span class="operator"> << *</span>it<span class="operator">;</span><br /> cout<span class="operator"> <<</span> endl<span class="operator"> <<</span> endl<span class="operator">;</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div><br /></div><div>Output as follows:</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh9BJ8-ffAtuGDjz8_IlZVzsEE0FxHsPcnbhyphenhyphenngfhRO4Qcv5jEdCxKaODSDxFx_mhgm0GE1hHGgE0v-BzxLM2ZJJA2IJvcV_P-dhEZPfwKB3osQbURKWyVo7CZJadJMGExn_ZIUTqcyOaQ/s1600/zg_multiset_1.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 100px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh9BJ8-ffAtuGDjz8_IlZVzsEE0FxHsPcnbhyphenhyphenngfhRO4Qcv5jEdCxKaODSDxFx_mhgm0GE1hHGgE0v-BzxLM2ZJJA2IJvcV_P-dhEZPfwKB3osQbURKWyVo7CZJadJMGExn_ZIUTqcyOaQ/s400/zg_multiset_1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5613191362031316594" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-15006527479036636542011-05-25T06:51:00.003+01:002011-05-25T06:51:00.651+01:00'auto' and 'register' variables<div>One of the questions that is still being asked in the interviews is about 'auto variables' and 'register variables'. I have never come across any practical code that uses them and dont even see any need for them being used but as I say, Interview questions dont reflect how good a coder would be and even if a person answers all questions correctly, how can we judge someone's debugging skills.</div><div><br /></div><div>Anyway, 'auto' variables are the default local variables. When you define a local variable, it is by default 'auto'. There is no need to use it as its implicit. In the new C++ standard, <a href="http://en.wikipedia.org/wiki/C%2B%2B0x">C++0x</a>, 'auto' serves <a href="http://stackoverflow.com/questions/2847410/goal-of-cs-auto-keyword">another purpose</a> and may break any C++ code using auto when compiled using C++0x.</div><div><br /></div><div>The 'register' keyword was initially used to help the compiler optimise the performance for the variables that were read/written very often. Since the compilers have evolved, nowadays they choose to <a href="http://stackoverflow.com/questions/709114/register-variables">ignore the requests</a> as they can optimize the performance better than us humans. </div><div><br /></div><div>The following is from <a href="http://stackoverflow.com/questions/1256246/address-of-register-variable">StackOverflow</a> discussion:</div><div><br /></div><div><span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">Here's an excerpt from Section 6.7.1 (footnote 101) of the <a href="http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: rgb(0, 119, 204); text-decoration: none; cursor: pointer; background-position: initial initial; background-repeat: initial initial; ">C99 standard (pdf)</a>:</p><blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 1px; padding-left: 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); quotes: none; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">The implementation may treat any <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code> declaration simply as an <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">auto</code> declaration. However,<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-weight: bold; background-position: initial initial; background-repeat: initial initial; ">whether or not addressable storage is actually used, the address of any part of an object declared with storage-class specifier register cannot be computed</strong>, either explicitly (by use of the unary <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">&</code> operator as discussed in 6.5.3.2) or implicitly (by converting an array name to a pointer as discussed in 6.3.2.1). Thus, the only operator that can be applied to an array declared with storage-class specifier <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code> is <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">sizeof</code>.</p></blockquote><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">And from Section 7.1.1, Paragraph 3 of the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: rgb(0, 119, 204); text-decoration: none; cursor: pointer; background-position: initial initial; background-repeat: initial initial; ">C++ standard (pdf)</a>:</p><blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 1px; padding-left: 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); quotes: none; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">A <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code> specifier has the same semantics as an <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">auto</code> specifier together with a hint to the implementation that the object so declared will be heavily used. <strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-weight: bold; background-position: initial initial; background-repeat: initial initial; ">[Note: the hint can be ignored and in most implementations it will be ignored if the address of the object is taken. —end note]</strong></p></blockquote><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">So, this seems like another case of C and C++ having "identical" features that behave the way you'd expect them most of the time, but diverge and cause confusion other times. In this situation, I think the way C does it makes sense since it</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; list-style-type: disc; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">is semantically closest to being correct and;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">doesn't do things behind your back.</li></ul><h2 style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 19px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-family: 'Trebuchet MS', 'Liberation Sans', 'DejaVu Sans', sans-serif; font-weight: bold; background-position: initial initial; background-repeat: initial initial; ">Fun tidbits about <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 19px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code></h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">The C++ group (WG21) <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#809" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: rgb(0, 119, 204); text-decoration: none; cursor: pointer; background-position: initial initial; background-repeat: initial initial; ">wants to deprecate <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code></a>:</p><blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 1px; padding-left: 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); quotes: none; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">The <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code> keyword serves very little function, offering no more than a hint that a note says is typically ignored. It should be deprecated in this version of the standard, freeing the reserved name up for use in a future standard, much like <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">auto</code> has been re-used this time around for being similarly useless.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; font-weight: bold; background-position: initial initial; background-repeat: initial initial; ">Notes from the March, 2009 meeting:</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">The consensus of the CWG was in favor of deprecating <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code>.</p></blockquote><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">Look what the C99 group (WG14) <a href="http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1300.pdf" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: rgb(0, 119, 204); text-decoration: none; cursor: pointer; background-position: initial initial; background-repeat: initial initial; ">said about <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code> (pdf)</a> at a meeting:</p><blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 10px; padding-right: 10px; padding-bottom: 1px; padding-left: 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); quotes: none; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; clear: both; word-wrap: break-word; background-position: initial initial; background-repeat: initial initial; ">General agreement to deprecate the “<code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">auto</code>” keyword. Should we ask WG21 to go back to the previous use of “<code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 5px; padding-bottom: 1px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(238, 238, 238); font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; background-position: initial initial; background-repeat: initial initial; ">register</code>” (no address)? No, this will not fly with WG21.</p></blockquote></span></div><div><br /></div><div>Sample program as follows:</div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment"><br />//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> i<span class="operator"> =</span><span class="int"> 123</span><span class="operator">;</span><span class="keyword"><br /> auto</span><span class="type"> int</span> j<span class="operator"> =</span><span class="int"> 456</span><span class="operator">;</span><span class="keyword"><br /> register</span><span class="type"> int</span> k<span class="operator"> =</span><span class="int"> 789</span><span class="operator">;</span><br /><br /> cout<span class="operator"><<</span><span class="string">"Address of i = "</span><span class="operator"> << &</span>i<span class="operator"> <<</span><span class="string">", Value = "</span><span class="operator"> <<</span> i<span class="operator"> <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Address of j = "</span><span class="operator"> << &</span>j<span class="operator"> <<</span><span class="string">", Value = "</span><span class="operator"> <<</span> j<span class="operator"> <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Address of k = "</span><span class="operator"> << &</span>k<span class="operator"> <<</span><span class="string">", Value = "</span><span class="operator"> <<</span> k<span class="operator"> <<</span> endl<span class="operator">;</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div><br /></div><div>Output as follows:</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRT0DFBeSPz-ZDEjuXP83U2EbZcGJWqmIDPv8yHeig18SR6EzoZAAVGXhKhI6XjbppY7WJTsgJM20xXmabxCZYE19Va2HmrYNXrljz7Gh0Lnh4nHHo8_MFZkm3J7j7qZxMNeJROtG67jab/s1600/zg_auto_and_register.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 145px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRT0DFBeSPz-ZDEjuXP83U2EbZcGJWqmIDPv8yHeig18SR6EzoZAAVGXhKhI6XjbppY7WJTsgJM20xXmabxCZYE19Va2HmrYNXrljz7Gh0Lnh4nHHo8_MFZkm3J7j7qZxMNeJROtG67jab/s400/zg_auto_and_register.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5610233689768989410" /></a>Note that the address of i, j and k are very close implying that the compiler chose to ignore the 'register' keyword.<br /><div><br /></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com3tag:blogger.com,1999:blog-2349434231090974738.post-73090927985262294142011-05-11T06:19:00.000+01:002011-05-11T06:19:00.129+01:00Example of set_union and set_intersection<div>Program as follows:</div><div><br /></div><div><br /></div><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include <iostream><br />#include <algorithm><br />#include <vector><br />#include <set><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /> <br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> setOne<span class="operator">[] = {</span><span class="int">5</span><span class="operator">,</span><span class="int"> 10</span><span class="operator">,</span><span class="int"> 15</span><span class="operator">,</span><span class="int"> 20</span><span class="operator">,</span><span class="int"> 25</span><span class="operator">};</span><span class="type"><br /> int</span> setTwo<span class="operator">[] = {</span><span class="int">50</span><span class="operator">,</span><span class="int"> 40</span><span class="operator">,</span><span class="int"> 30</span><span class="operator">,</span><span class="int"> 20</span><span class="operator">,</span><span class="int"> 10</span><span class="operator">,</span><span class="int"> 11</span><span class="operator">,</span><span class="int"> 21</span><span class="operator">,</span><span class="int"> 31</span><span class="operator">,</span><span class="int"> 41</span><span class="operator">,</span><span class="int"> 51</span><span class="operator">};</span><span class="type"><br /> <br /> int</span> setOneSize<span class="operator"> =</span><span class="keyword"> sizeof</span><span class="operator">(</span>setOne<span class="operator">) /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="type">int</span><span class="operator">);</span><span class="type"><br /> int</span> setTwoSize<span class="operator"> =</span><span class="keyword"> sizeof</span><span class="operator">(</span>setTwo<span class="operator">) /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="type">int</span><span class="operator">);</span><span class="comment"><br /> <br /> //Its necessary to sort if not already sorted<br /></span> sort<span class="operator">(</span>setTwo<span class="operator">,</span> setTwo<span class="operator"> +</span> setTwoSize<span class="operator">);</span><br /> <br /> vector<span class="operator"><</span><span class="type">int</span><span class="operator">></span> unionSetVector<span class="operator">(</span>setOneSize<span class="operator"> +</span> setTwoSize<span class="operator">);</span> <br /> set_union<span class="operator">(</span>setOne<span class="operator">,</span> setOne<span class="operator"> +</span> setOneSize<span class="operator">,</span> setTwo<span class="operator">,</span> setTwo<span class="operator"> +</span> setTwoSize<span class="operator">,</span> unionSetVector<span class="operator">.</span>begin<span class="operator">());</span><br /> <br /> cout<span class="operator"><<</span><span class="string">"\n1. unionSetVector : "</span><span class="operator">;</span><br /> copy<span class="operator">(</span>unionSetVector<span class="operator">.</span>begin<span class="operator">(),</span> unionSetVector<span class="operator">.</span>end<span class="operator">(),</span> ostream_iterator<span class="operator"><</span><span class="type">int</span><span class="operator">>(</span>cout<span class="operator">,</span><span class="string"> " "</span><span class="operator">));</span><br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><br /> <br /> vector<span class="operator"><</span><span class="type">int</span><span class="operator">></span> intersectionSetVector<span class="operator">(</span>min<span class="operator">(</span>setOneSize<span class="operator">,</span> setTwoSize<span class="operator">));</span> <br /> set_intersection<span class="operator">(</span>setOne<span class="operator">,</span> setOne<span class="operator"> +</span> setOneSize<span class="operator">,</span> setTwo<span class="operator">,</span> setTwo<span class="operator"> +</span> setTwoSize<span class="operator">,</span> intersectionSetVector<span class="operator">.</span>begin<span class="operator">());</span><br /> <br /> cout<span class="operator"><<</span><span class="string">"\n1. intersectionSetVector : "</span><span class="operator">;</span><br /> copy<span class="operator">(</span>intersectionSetVector<span class="operator">.</span>begin<span class="operator">(),</span> intersectionSetVector<span class="operator">.</span>end<span class="operator">(),</span> ostream_iterator<span class="operator"><</span><span class="type">int</span><span class="operator">>(</span>cout<span class="operator">,</span><span class="string"> " "</span><span class="operator">));</span><br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><br /> <br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><span class="flow"><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre></div><div><br /></div><div>The output is as follows:</div><div><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQTU3_EZQ-eqZbWxlYqYhy9sE6qfdIniExOwslG7aaIaAHK-1vZL4vuPKUSFFk3Y4PcSOs3HOa7wX1UzWkBmZuwo0M1nNSW21zcWiGeC7rv55kiEmeP5fhnPdPutGBUL-t0nSSBB13bOiK/s1600/zg_set_2.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 122px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQTU3_EZQ-eqZbWxlYqYhy9sE6qfdIniExOwslG7aaIaAHK-1vZL4vuPKUSFFk3Y4PcSOs3HOa7wX1UzWkBmZuwo0M1nNSW21zcWiGeC7rv55kiEmeP5fhnPdPutGBUL-t0nSSBB13bOiK/s400/zg_set_2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5604690336321571106" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com2tag:blogger.com,1999:blog-2349434231090974738.post-35528111207959289042011-05-03T06:14:00.000+01:002011-05-09T13:17:43.086+01:00Example of 'Set' and operations<div>Example of Set and operations as follows:</div><div><br /></div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br />#include <set><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /> <br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> someInts<span class="operator">[] = {</span><span class="int">3</span><span class="operator">,</span><span class="int"> 6</span><span class="operator">,</span><span class="int"> 9</span><span class="operator">,</span><span class="int"> 12</span><span class="operator">,</span><span class="int"> 15</span><span class="operator">,</span><span class="int"> 18</span><span class="operator">};</span><span class="type"><br /> int</span> someIntsSize<span class="operator"> =</span><span class="keyword"> sizeof</span><span class="operator">(</span>someInts<span class="operator">) /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="type">int</span><span class="operator">);</span><br /> <br /> set<span class="operator"><</span><span class="type">int</span><span class="operator">></span> someSet<span class="operator"> (</span>someInts<span class="operator">,</span> someInts<span class="operator"> +</span> someIntsSize<span class="operator">);</span><br /> <br /> cout<span class="operator"><<</span><span class="string">"\n1. someSet : "</span><span class="operator">;</span><br /> copy<span class="operator">(</span>someSet<span class="operator">.</span>begin<span class="operator">(),</span> someSet<span class="operator">.</span>end<span class="operator">(),</span> ostream_iterator<span class="operator"><</span><span class="type">int</span><span class="operator">>(</span>cout<span class="operator">,</span><span class="string"> " "</span><span class="operator">));</span><br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><span class="comment"><br /> <br /> //Insert some more elements<br /></span> someSet<span class="operator">.</span>insert<span class="operator">(</span><span class="int">0</span><span class="operator">);</span><br /> someSet<span class="operator">.</span>insert<span class="operator">(</span><span class="int">10</span><span class="operator">);</span><br /> someSet<span class="operator">.</span>insert<span class="operator">(</span><span class="int">20</span><span class="operator">);</span><br /> <br /> cout<span class="operator"><<</span><span class="string">"\n2. someSet : "</span><span class="operator">;</span><br /> copy<span class="operator">(</span>someSet<span class="operator">.</span>begin<span class="operator">(),</span> someSet<span class="operator">.</span>end<span class="operator">(),</span> ostream_iterator<span class="operator"><</span><span class="type">int</span><span class="operator">>(</span>cout<span class="operator">,</span><span class="string"> " "</span><span class="operator">));</span><br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><span class="comment"><br /> <br /> //Upper Bound means the next greater number <br /></span> set<span class="operator"><</span><span class="type">int</span><span class="operator">>::</span>iterator it<span class="operator"> =</span> someSet<span class="operator">.</span>upper_bound<span class="operator">(</span><span class="int">5</span><span class="operator">);</span><br /> cout<span class="operator"> <<</span><span class="string"> "\nupper_bound(5) = "</span><span class="operator"> << *</span>it<span class="operator"> <<</span> endl<span class="operator">;</span><br /> <br /> it<span class="operator"> =</span> someSet<span class="operator">.</span>upper_bound<span class="operator">(</span><span class="int">10</span><span class="operator">);</span><br /> cout<span class="operator"> <<</span><span class="string"> "\nupper_bound(10) = "</span><span class="operator"> << *</span>it<span class="operator"> <<</span> endl<span class="operator">;</span><span class="comment"><br /> <br /> //Lower bound means either equal or greater number<br /></span> it<span class="operator"> =</span> someSet<span class="operator">.</span>lower_bound<span class="operator">(</span><span class="int">5</span><span class="operator">);</span><br /> cout<span class="operator"> <<</span><span class="string"> "\nlower_bound(5) = "</span><span class="operator"> << *</span>it<span class="operator"> <<</span> endl<span class="operator">;</span><br /> <br /> it<span class="operator"> =</span> someSet<span class="operator">.</span>lower_bound<span class="operator">(</span><span class="int">10</span><span class="operator">);</span><br /> cout<span class="operator"> <<</span><span class="string"> "\nlower_bound(10) = "</span><span class="operator"> << *</span>it<span class="operator"> <<</span> endl<span class="operator">;</span><span class="comment"><br /> <br /> //Equal Range returns a pair<br /></span> pair<span class="operator"><</span>set<span class="operator"><</span><span class="type">int</span><span class="operator">>::</span>iterator<span class="operator">,</span>set<span class="operator"><</span><span class="type">int</span><span class="operator">>::</span>iterator<span class="operator">></span> retIt<span class="operator">;</span><br /> retIt<span class="operator"> =</span> someSet<span class="operator">.</span>equal_range<span class="operator">(</span><span class="int">5</span><span class="operator">);</span><br /> cout<span class="operator"><<</span><span class="string">"\nequal_range(5) - lower bound = "</span><span class="operator"> << *</span>retIt<span class="operator">.</span>first<span class="operator"> <<</span><span class="string"> <br /> " upper bound = "</span><span class="operator"> << *</span>retIt<span class="operator">.</span>second<span class="operator"> <<</span> endl<span class="operator">;</span><br /> <br /> retIt<span class="operator"> =</span> someSet<span class="operator">.</span>equal_range<span class="operator">(</span><span class="int">10</span><span class="operator">);</span><br /> cout<span class="operator"><<</span><span class="string">"\nequal_range(10) - lower bound = "</span><span class="operator"> << *</span>retIt<span class="operator">.</span>first<span class="operator"> <<</span><span class="string"> <br /> " upper bound = "</span><span class="operator"> << *</span>retIt<span class="operator">.</span>second<span class="operator"> <<</span> endl<span class="operator">;</span><br /> <br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><span class="flow"><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div></div><div>The output is as follows:</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCWfaPXpiIPYjuWdaOuok67L995kgR_NxBD5w1yFHV_iLIIdlgs-BWgX0cWHzBmEqfifT1a1_yC-2TPIQ__dUMio-6IpfcSsFBDJAQYXHIYULSO3G3JUPbKXqgJu2jLeGQ9oqLfoI4o41R/s1600/zg_set_1.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 279px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCWfaPXpiIPYjuWdaOuok67L995kgR_NxBD5w1yFHV_iLIIdlgs-BWgX0cWHzBmEqfifT1a1_yC-2TPIQ__dUMio-6IpfcSsFBDJAQYXHIYULSO3G3JUPbKXqgJu2jLeGQ9oqLfoI4o41R/s400/zg_set_1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5599831472849465074" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com3tag:blogger.com,1999:blog-2349434231090974738.post-77063844076091956802011-04-27T06:33:00.002+01:002011-04-27T06:33:00.369+01:00Example of Algorithm Copy<div>Sometimes its useful to know the 'copy' method in algorithm class. The following is an example:</div><div><br /></div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /> <br />//OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result );<br /></span><span class="pre"><br />#include<iostream><br />#include <algorithm><br />#include <vector><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /> <br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> someInts<span class="operator">[] = {</span><span class="int">10</span><span class="operator">,</span><span class="int"> 20</span><span class="operator">,</span><span class="int"> 20</span><span class="operator">,</span><span class="int"> 40</span><span class="operator">,</span><span class="int"> 50</span><span class="operator">};</span><span class="type"><br /> int</span> someMoreInts<span class="operator">[] = {</span><span class="int">100</span><span class="operator">,</span><span class="int"> 200</span><span class="operator">,</span><span class="int"> 300</span><span class="operator">,</span><span class="int"> 400</span><span class="operator">,</span><span class="int"> 500</span><span class="operator">,</span><span class="int"> 600</span><span class="operator">,</span><span class="int"> 700</span><span class="operator">};</span><br /> <br /> vector<span class="operator"><</span><span class="type">int</span><span class="operator">></span> someVector<span class="operator">;</span><br /> vector<span class="operator"><</span><span class="type">int</span><span class="operator">>::</span>iterator someIterator<span class="operator">;</span><span class="comment"><br /> <br /> //Get the total size of all elements<br /></span><span class="type"> int</span> totalSize<span class="operator"> = (</span><span class="keyword">sizeof</span><span class="operator">(</span>someInts<span class="operator">) +</span><span class="keyword"> sizeof</span><span class="operator">(</span>someMoreInts<span class="operator">)) /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="type">int</span><span class="operator">);</span><span class="comment"><br /> <br /> //Resize someVector to right size<br /></span> someVector<span class="operator">.</span>resize<span class="operator">(</span>someVector<span class="operator">.</span>size<span class="operator">() +</span> totalSize<span class="operator">);</span><span class="comment"><br /> <br /> //Get the number of elements of someInts<br /></span><span class="type"> int</span> tempSize<span class="operator"> =</span><span class="keyword"> sizeof</span><span class="operator">(</span>someInts<span class="operator">) /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="type">int</span><span class="operator">);</span><br /> <br /> vector<span class="operator"><</span><span class="type">int</span><span class="operator">>::</span>iterator finalElementIt<span class="operator"> =</span> copy<span class="operator">(</span>someInts<span class="operator">,</span> someInts<span class="operator"> +</span> tempSize<span class="operator">,</span> someVector<span class="operator">.</span>begin<span class="operator">());</span><br /> <br /> cout<span class="operator"><<</span><span class="string">"\n1. someVector contains :"</span><span class="operator">;</span><span class="flow"><br /> for</span><span class="operator">(</span>someIterator<span class="operator"> =</span> someVector<span class="operator">.</span>begin<span class="operator">();</span> someIterator<span class="operator"> !=</span> someVector<span class="operator">.</span>end<span class="operator">(); ++</span>someIterator<span class="operator">)</span><br /> cout<span class="operator"><<</span><span class="string">" "</span><span class="operator"><<*</span>someIterator<span class="operator">;</span><br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><span class="comment"><br /> <br /> //Get size of someMoreInts<br /></span> tempSize<span class="operator"> =</span><span class="keyword"> sizeof</span><span class="operator">(</span>someMoreInts<span class="operator">) /</span><span class="keyword"> sizeof</span><span class="operator">(</span><span class="type">int</span><span class="operator">);</span><br /> <br /> copy<span class="operator">(</span>someMoreInts<span class="operator">,</span> someMoreInts<span class="operator"> +</span> tempSize<span class="operator">,</span> finalElementIt<span class="operator">);</span><br /> <br /> cout<span class="operator"><<</span><span class="string">"\n2. someVector contains :"</span><span class="operator">;</span><span class="flow"><br /> for</span><span class="operator">(</span>someIterator<span class="operator"> =</span> someVector<span class="operator">.</span>begin<span class="operator">();</span> someIterator<span class="operator"> !=</span> someVector<span class="operator">.</span>end<span class="operator">(); ++</span>someIterator<span class="operator">)</span><br /> cout<span class="operator"><<</span><span class="string">" "</span><span class="operator"><<*</span>someIterator<span class="operator">;</span><br /> cout<span class="operator"><<</span>endl<span class="operator">;</span><span class="flow"><br /> <br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div></div><div>The output is as follows:</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbivt94Vamt4KN8nSZD1_QJqHkzZgqPs_Ug9vl5ubB7ws_Oz7Fte5IMmTacbJPSfkHXFWYrOyq9CjahtBKhgVHJXXIoL48l2GA8Qk3pQWX4KA-dudLOAIfUPKYgj2NjfpaMogyzUA3sjW/s1600/zg_algorithm_copy.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 98px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbivt94Vamt4KN8nSZD1_QJqHkzZgqPs_Ug9vl5ubB7ws_Oz7Fte5IMmTacbJPSfkHXFWYrOyq9CjahtBKhgVHJXXIoL48l2GA8Qk3pQWX4KA-dudLOAIfUPKYgj2NjfpaMogyzUA3sjW/s400/zg_algorithm_copy.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5599815551880068722" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-34547194917043922542011-04-20T06:10:00.004+01:002011-04-20T06:10:00.373+01:00An Challenging Interview question with a difference<div>The following program is provided:</div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="comment"><br /><br />//This class can be designed as you wish<br /></span><span class="keyword">class</span> SR<span class="operator"><br />{</span><span class="keyword"><br />public</span><span class="operator">:</span><br />SR<span class="operator">(</span><span class="type">int</span> i<span class="operator">) {}<br />};</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br />int</span> sum<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span><span class="flow"><br />for</span><span class="operator"> (</span><span class="type">int</span> i<span class="operator"> =</span><span class="int"> 1</span><span class="operator">;</span> i<span class="operator"> <</span><span class="int"> 100</span><span class="operator">;</span> i<span class="operator">++)<br />{</span><br /> SR ii<span class="operator">(</span>i<span class="operator">);</span><span class="flow"><br /> while</span><span class="operator"> (</span>i<span class="operator">--)</span><br /> sum<span class="operator"> +=</span> i<span class="operator">;<br />}</span><br />cout<span class="operator"><<</span><span class="string">"Expected value of sum = 161700"</span><span class="operator"> <<</span> endl<span class="operator">;</span><br />cout<span class="operator"><<</span><span class="string">"Returned value of sum = "</span><span class="operator"> <<</span> sum<span class="operator"> <<</span> endl<span class="operator">;</span><span class="flow"><br /><br />return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre></div><br /></div><div>As already mentioned above, the expected output of 161700 is provided. The class 'SR' could be written as one wishes. How to do write the class 'SR' to get the desired output?</div><div>.</div><div>.</div><div>.</div><div>.</div><div>Give it a try before looking at the solution.</div><div>.</div><div>.</div><div>.</div><div>.</div><div>.</div><div>The modified program with the correct 'SR' class as follows:</div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="comment"><br /><br />//This class can be designed as you wish<br /></span><span class="keyword">class</span> SR<span class="operator"><br />{</span><span class="keyword"><br />public</span><span class="operator">:</span><br /> SR<span class="operator">(</span><span class="type">int</span><span class="operator">&</span> i<span class="operator">):</span>ref<span class="operator">(</span>i<span class="operator">)<br /> {</span><br /> var<span class="operator"> =</span> i<span class="operator">;<br /> }<br /> ~</span>SR<span class="operator">()<br /> {</span><br /> ref<span class="operator"> =</span> var<span class="operator">;<br /> }</span><span class="keyword"><br />private</span><span class="operator">:</span><span class="type"><br /> int</span> var<span class="operator">;</span><span class="type"><br /> int</span><span class="operator"> &</span>ref<span class="operator">;<br />};</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> sum<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span><span class="flow"><br /> for</span><span class="operator"> (</span><span class="type">int</span> i<span class="operator"> =</span><span class="int"> 1</span><span class="operator">;</span> i<span class="operator"> <</span><span class="int"> 100</span><span class="operator">;</span> i<span class="operator">++)<br /> {</span><br /> SR ii<span class="operator">(</span>i<span class="operator">);</span><span class="flow"><br /> while</span><span class="operator"> (</span>i<span class="operator">--)</span><br /> sum<span class="operator"> +=</span> i<span class="operator">;<br /> }</span><br /> cout<span class="operator"><<</span><span class="string">"Expected value of sum = 161700"</span><span class="operator"> <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Returned value of sum = "</span><span class="operator"> <<</span> sum<span class="operator"> <<</span> endl<span class="operator">;</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre></div><br /></div><div><br /></div><div>Source: Modified from <a href="http://stackoverflow.com/questions/2428404/tricky-interview-question-for-c">here</a>. Another similar question is available here.</div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com3tag:blogger.com,1999:blog-2349434231090974738.post-41297746470204059142011-04-12T06:53:00.003+01:002011-04-12T06:53:00.536+01:00isNumeric()<div>For some reason many C++ programmers believe there is an isNumeric() function available as part of the language. In fact I was searching for the header file to include to get a piece of code to work. </div><div><br /></div><div>Its not difficult to create a function that will be able to check if the string is numeric or not. Here is the code.</div><div><br /></div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include <iostream><br />#include <string><br />#include <sstream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /> <br />bool</span> isNumeric1<span class="operator">(</span>string stringToCheck<span class="operator">)<br />{</span><span class="type"><br /> bool</span> numeric<span class="operator"> =</span><span class="bool"> false</span><span class="operator">;</span><span class="flow"><br /> <br /> if</span><span class="operator">(</span>stringToCheck<span class="operator">.</span>find_first_not_of<span class="operator">(</span><span class="string">"0123456789."</span><span class="operator">) ==</span> string<span class="operator">::</span>npos<span class="operator">)</span><br /> numeric<span class="operator"> =</span><span class="bool"> true</span><span class="operator">;</span><span class="flow"><br /> <br /> return</span> numeric<span class="operator">;<br />}</span><span class="type"><br /> <br />bool</span> isNumeric2<span class="operator">(</span>string stringToCheck<span class="operator">)<br />{</span><span class="type"><br /> bool</span> numeric<span class="operator"> =</span><span class="bool"> true</span><span class="operator">;</span><span class="type"><br /> unsigned</span> i<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span><span class="flow"><br /> <br /> while</span><span class="operator">(</span>numeric<span class="operator"> &&</span> i<span class="operator"> <</span> stringToCheck<span class="operator">.</span>length<span class="operator">())<br /> {</span><span class="flow"><br /> switch</span><span class="operator"> (</span>stringToCheck<span class="operator">[</span>i<span class="operator">])<br /> {</span><span class="flow"><br /> case</span><span class="char"> '0'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '1'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '2'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '3'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '4'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '5'</span><span class="operator">:</span><span class="flow"> <br /> case</span><span class="char"> '6'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '7'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '8'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '9'</span><span class="operator">:</span><span class="flow"> case</span><span class="char"> '.'</span><span class="operator">:</span><span class="comment"><br /> //do nothing<br /></span><span class="flow"> break</span><span class="operator">;</span><span class="flow"><br /> default</span><span class="operator">:</span><br /> numeric<span class="operator"> =</span><span class="bool"> false</span><span class="operator">;<br /> }</span><br /> i<span class="operator">++;<br /> }</span><span class="flow"><br /> <br /> return</span> numeric<span class="operator">;<br />}</span><span class="type"><br /> <br />bool</span> isNumeric3<span class="operator">(</span>string stringToCheck<span class="operator">)<br />{</span><br /> stringstream streamVal<span class="operator">(</span>stringToCheck<span class="operator">);</span><span class="type"><br /> double</span> tempVal<span class="operator">;</span><br /> <br /> streamVal<span class="operator"> >></span> tempVal<span class="operator">;</span><span class="comment"> //If numeric then everything transferred to tempVal<br /></span><span class="flow"><br /> if</span><span class="operator">(</span>streamVal<span class="operator">.</span>get<span class="operator">() !=</span> EOF<span class="operator">)</span><span class="flow"><br /> return</span><span class="bool"> false</span><span class="operator">;</span><span class="flow"><br /> else<br /> return</span><span class="bool"> true</span><span class="operator">;<br />}</span><span class="type"><br /> <br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> string str1<span class="operator">(</span><span class="string">"123"</span><span class="operator">),</span> str2<span class="operator">(</span><span class="string">"134.567"</span><span class="operator">),</span> str3<span class="operator">(</span><span class="string">"12AB"</span><span class="operator">);</span><br /> cout<span class="operator"> <<</span><span class="string"> "Approach 1"</span><span class="operator"> <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str1<span class="operator"> << (</span>isNumeric1<span class="operator">(</span>str1<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str2<span class="operator"> << (</span>isNumeric1<span class="operator">(</span>str2<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str3<span class="operator"> << (</span>isNumeric1<span class="operator">(</span>str3<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> <br /> cout<span class="operator"> <<</span><span class="string"> "\nApproach 2"</span><span class="operator"> <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str1<span class="operator"> << (</span>isNumeric2<span class="operator">(</span>str1<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str2<span class="operator"> << (</span>isNumeric2<span class="operator">(</span>str2<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str3<span class="operator"> << (</span>isNumeric2<span class="operator">(</span>str3<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> <br /> cout<span class="operator"> <<</span><span class="string"> "\nApproach 3"</span><span class="operator"> <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str1<span class="operator"> << (</span>isNumeric3<span class="operator">(</span>str1<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str2<span class="operator"> << (</span>isNumeric3<span class="operator">(</span>str2<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><br /> cout<span class="operator"> <<</span> str3<span class="operator"> << (</span>isNumeric3<span class="operator">(</span>str3<span class="operator">) ?</span><span class="string"> " is Numeric"</span><span class="operator"> :</span><span class="string"> " is Not Numeric"</span><span class="operator">) <<</span> endl<span class="operator">;</span><span class="flow"><br /> <br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /> <br /></pre></div><br /></div><div><br /></div><div>Output is as follows:</div><div><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM3ihM4sr7k6laen02V53FyHuJRjZboRSfYhw-7HqwcaxJ0OoAslsb5p_adkr65bthpReAGHudU2QAcpBz4uzn6ZF6EzJpLeBM-yq97AIPXAMcdwnpk5D44gvMQ6IyLwZYVv_3p_EBmflP/s1600/zg_is_numeric.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 252px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM3ihM4sr7k6laen02V53FyHuJRjZboRSfYhw-7HqwcaxJ0OoAslsb5p_adkr65bthpReAGHudU2QAcpBz4uzn6ZF6EzJpLeBM-yq97AIPXAMcdwnpk5D44gvMQ6IyLwZYVv_3p_EBmflP/s400/zg_is_numeric.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5592886661248283730" /></a><br /><div><div>There are few problems in the program above:</div><div><br /></div><div>1. It does not cater for negative numbers</div><div>2. It will return wrong result when you have incorrect string like 12.34.56.78</div><div><br /></div><div>I have intentionally left it as an exercise.</div><div><br /></div><div>Other approaches are possible as well. Why not try and think of an approach yourself.</div><div><br /></div></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com2tag:blogger.com,1999:blog-2349434231090974738.post-72362943135784475562011-04-05T06:37:00.000+01:002011-04-05T06:37:00.129+01:00string::find_next()<div>I met this new starter who has come from Java background. He was upset because he couldn't find string::find_next() as C++ function. He said Java is much more flexible this way. In reality, its not that bad if you look at the definition of find carefully. </div><div><br /></div><div><div><span class="Apple-style-span" >size_t find ( const string& str, size_t pos = 0 ) const;</span></div><div>size_t find ( const char* s, size_t pos, size_t n ) const;</div><div>size_t find ( const char* s, size_t pos = 0 ) const;</div><div>size_t find ( char c, size_t pos = 0 ) const;</div></div><div><br /></div><div>The first one works as find_next as I show in the example below:</div><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre"><br />#include <iostream><br />#include <string><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /> <br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> string someString<span class="operator">(</span><span class="string">"Tom is not in. Infact Tom is not going to be in Tomorrow or day after Tomorrow"</span><span class="operator">);</span><br /> string findTheString<span class="operator">(</span><span class="string">"Tom"</span><span class="operator">);</span><span class="type"><br /> <br /> unsigned</span> position<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span><br /> <br /> position<span class="operator"> =</span> someString<span class="operator">.</span>find<span class="operator">(</span>findTheString<span class="operator">);</span><br /> cout<span class="operator"><<</span><span class="string">"First position of "</span><span class="operator"> <<</span> findTheString<span class="operator"> <<</span><span class="string"> " is "</span><span class="operator"> <<</span> position<span class="operator"> <<</span> endl<span class="operator">;</span><span class="comment"><br /> <br /> //We want to find all the next positions which is after position + findTheString.length()<br /></span><span class="flow"> while</span><span class="operator">(</span>position<span class="operator"> !=</span> string<span class="operator">::</span>npos<span class="operator">)<br /> {</span><br /> position<span class="operator"> =</span> someString<span class="operator">.</span>find<span class="operator">(</span>findTheString<span class="operator">, (</span>position<span class="operator"> +</span> findTheString<span class="operator">.</span>length<span class="operator">()));</span><br /> cout<span class="operator"><<</span><span class="string">"Next position of "</span><span class="operator"> <<</span> findTheString<span class="operator"> <<</span><span class="string"> " is "</span><span class="operator"> <<</span> position<span class="operator"> <<</span> endl<span class="operator">;<br /> }</span><span class="flow"><br /> <br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre></div><div><br /></div><div><br /></div><div>The output is as follows:</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcERpWkVJlMRfUsFq4NIQn9C2_u502d_QT1ty9M6q8fIS9dBUvm77u0T_pfb_a4j0kwuqMBob3aDhKsifXlziN-F5VsA5ywRgRjoO3wWcIyKcVgd3kT_9M8LvoZ1tJbyRgNkQxi6ywXQwd/s1600/zg_string_find_next.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 148px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcERpWkVJlMRfUsFq4NIQn9C2_u502d_QT1ty9M6q8fIS9dBUvm77u0T_pfb_a4j0kwuqMBob3aDhKsifXlziN-F5VsA5ywRgRjoO3wWcIyKcVgd3kT_9M8LvoZ1tJbyRgNkQxi6ywXQwd/s400/zg_string_find_next.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5591670999014976482" /></a><br /><div>Exercise for new programmers:</div><div><ol><li>The last two Tom's are part of 'Tomorrow', how can you make sure they are not printed</li><li>The last Tom which is 4294... is equal to -1 or string::npos. How can you stop that being printed without making another check for string::npos</li></ol><div>Please dont post answers as they should be trivial exercise and you should be able to figure out without much problems.</div></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-88201820158973584682011-03-29T06:23:00.000+01:002011-03-29T15:02:45.408+01:00Reading file names from directory<div>The other day I had to read all the file names from a directory and I found it really difficult to write a simple program to do that. While searching I ended up at <a href="http://stackoverflow.com/">Stack Overflow</a> and the following example is taken from <a href="http://stackoverflow.com/questions/612097/how-can-i-get-a-list-of-files-in-a-directory-using-c-or-c">here</a>.</div><div><br /></div><div>Note that the 'dirent.h' is not available as standard windows file and the best option is to download it from <a href="http://users.cs.fiu.edu/~weiss/cop4338/dirent.h">here</a> and add it in your include directory of the project.</div><div><br /></div><div>The program as follows:</div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /><br />#pragma warning( disable : 4996 )<br />#include "dirent.h"<br />#pragma warning( default : 4996 )<br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">(</span><span class="type">int</span> argc<span class="operator">,</span><span class="type"> char</span><span class="operator"> *</span>argv<span class="operator">[])<br />{</span><span class="flow"><br />if</span><span class="operator">(</span>argc<span class="operator"> !=</span><span class="int"> 2</span><span class="operator">)<br />{</span><br /> cout<span class="operator"><<</span><span class="string">"Usage: "</span><span class="operator"><<</span>argv<span class="operator">[</span><span class="int">0</span><span class="operator">]<<</span><span class="string">" <Directory name>"</span><span class="operator"><<</span>endl<span class="operator">;</span><span class="flow"><br /> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">;<br />}</span><br /><br />DIR<span class="operator"> *</span>dir<span class="operator">;</span><br />dir<span class="operator"> =</span> opendir<span class="operator"> (</span>argv<span class="operator">[</span><span class="int">1</span><span class="operator">]);</span><span class="flow"><br />if</span><span class="operator"> (</span>dir<span class="operator"> !=</span> NULL<span class="operator">)<br />{</span><br /> cout<span class="operator"><<</span><span class="string">"Directory Listing for "</span><span class="operator"><<</span>argv<span class="operator">[</span><span class="int">1</span><span class="operator">]<<</span><span class="string">" : "</span><span class="operator"><<</span>endl<span class="operator">;</span><span class="keyword"><br /> struct</span> dirent<span class="operator"> *</span>ent<span class="operator">;</span><span class="flow"><br /> while</span><span class="operator"> ((</span>ent<span class="operator"> =</span> readdir<span class="operator"> (</span>dir<span class="operator">)) !=</span> NULL<span class="operator">)<br /> {</span><br /> cout<span class="operator"><<</span>ent<span class="operator">-></span>d_name<span class="operator"><<</span>endl<span class="operator">;<br /> }<br />}</span><span class="flow"><br />else</span><span class="operator"><br />{</span><br /> cout<span class="operator"><<</span><span class="string">"Invalid Directory name"</span><span class="operator"><<</span>endl<span class="operator">;</span><span class="flow"><br /> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">;<br />}</span><span class="flow"><br /><br />return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre></div>Note that in this program we put Command-line arguments argc and argv. What this means is that the final .exe is run using command prompt and the first parameter will be exe file name and the second parameter will be the directory path or you can add the directory path in Debugging->Command arguments of the properties </div><div><br /></div><div>You may also encounter the following warning</div><div><br /></div><div><span class="Apple-style-span">warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.</span></div><div><br /></div><div>to get rid of it, I have used the #Pragma <a href="http://advancedcppwithexamples.blogspot.com/2009/08/suppress-compiler-warning-using-pragma.html">supressor</a>. </div><div><br /></div><div>You may also get the following error:</div><div><br /></div><div><div><span class="Apple-style-span">error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'</span></div><div> </div><div>to get rid of it, go to properties->general->Character set - default is 'Use Unicode Charachter set', change it to 'Use Multi-Byte Character Set' </div></div><div><br /></div><div>The output is as follows:</div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKKzOHT_CNf8wJGFObFVDn7gYdla1WNbw6g4AZoMxXVAEr47QzedeCCm16eab5tkiS22fv1HrbVdMQPTpwBN0f-YI2f7an-xdonUrWutmC42W3GKoTzccZyYmrjhzisH5UeUlYWHSOzWmQ/s1600/zg_filesread_directory.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 157px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKKzOHT_CNf8wJGFObFVDn7gYdla1WNbw6g4AZoMxXVAEr47QzedeCCm16eab5tkiS22fv1HrbVdMQPTpwBN0f-YI2f7an-xdonUrWutmC42W3GKoTzccZyYmrjhzisH5UeUlYWHSOzWmQ/s400/zg_filesread_directory.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5588054307179400578" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-50188480327305372532011-03-22T06:57:00.002+00:002011-03-22T06:57:00.055+00:00Reading Files into Vector<div>Thought of this while trying to create a parser. The intention is to read a complete text file into a vector and then use this vector for other operations. This program shows how to read from a text file into vectors.</div><div><br /></div><div>The input file is as follows:</div><div><div><span class="Apple-style-span" style="font-family:'courier new';"><br /></span></div><div><span class="Apple-style-span" style="font-family:'courier new';">Line num 1</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span" style="font-family:'courier new';">Another line</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span" style="font-family:'courier new';">Line number 3</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span" style="font-family:'courier new';">4th Line!</span></div><div><span class="Apple-style-span"><br /></span></div><div><span class="Apple-style-span" style="font-family:'courier new';">**%** Last line **%**</span></div></div><div><br /></div><div>Program as follows:</div><div><br /></div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include <iostream><br />#include <vector><br />#include <fstream><br />#include <string><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> vector<span class="operator"><</span>std<span class="operator">::</span>string<span class="operator">></span> lines<span class="operator">;</span><br /> lines<span class="operator">.</span>reserve<span class="operator">(</span><span class="int">5000</span><span class="operator">);</span><span class="comment"> //Assuming that the file to read can have max 5K lines<br /></span><br /> string fileName<span class="operator">(</span><span class="string">"test.txt"</span><span class="operator">);</span><br /><br /> ifstream file<span class="operator">;</span><br /> file<span class="operator">.</span>open<span class="operator">(</span>fileName<span class="operator">.</span>c_str<span class="operator">());</span><span class="flow"><br /><br /> if</span><span class="operator">(!</span>file<span class="operator">.</span>is_open<span class="operator">())<br /> {</span><br /> cerr<span class="operator"><<</span><span class="string">"Error opening file : "</span><span class="operator"><<</span>fileName<span class="operator">.</span>c_str<span class="operator">()<<</span>endl<span class="operator">;</span><span class="flow"><br /> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">;<br /> }</span><span class="comment"><br /><br /> //Read the lines and store it in the vector<br /></span> string line<span class="operator">;</span><span class="flow"><br /> while</span><span class="operator">(</span>getline<span class="operator">(</span>file<span class="operator">,</span>line<span class="operator">))<br /> {</span><br /> lines<span class="operator">.</span>push_back<span class="operator">(</span>line<span class="operator">);<br /> }</span><br /><br /> file<span class="operator">.</span>close<span class="operator">();</span><span class="comment"><br /><br /> //Dump all the lines in output<br /></span><span class="flow"> for</span><span class="operator">(</span><span class="type">unsigned int</span> i<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span> i<span class="operator"> <</span> lines<span class="operator">.</span>size<span class="operator">();</span> i<span class="operator">++)<br /> {</span><br /> cout<span class="operator"><<</span>i<span class="operator"><<</span><span class="string">". "</span><span class="operator"><<</span>lines<span class="operator">[</span>i<span class="operator">]<<</span>endl<span class="operator">;<br /> }</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div><br /><div><br /></div><div>Output as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCcyQhqIQ2Osv36CUD12TkbHu40ZBQSCTRq4ms33vJCSSQp-sm8kCIf_hyphenhyphen_raTuUki5P4Y2pkKJBmphjXknFH9x5k7yDFXELIST50i01muA7W4QjwsAyeTmcAroSLMBhHe3wKHGykuaZt9/s1600/zg_FilesRead_vector01.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 175px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCcyQhqIQ2Osv36CUD12TkbHu40ZBQSCTRq4ms33vJCSSQp-sm8kCIf_hyphenhyphen_raTuUki5P4Y2pkKJBmphjXknFH9x5k7yDFXELIST50i01muA7W4QjwsAyeTmcAroSLMBhHe3wKHGykuaZt9/s400/zg_FilesRead_vector01.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5586547718704491682" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-91122349879700781452011-03-08T06:39:00.000+00:002011-03-08T06:39:00.315+00:00Switch Case using string<div>When I started thinking of this example, I also faced some of the other problems that I have encountered in my initial days of C++. One of these problems was how to convert String to multiple Ints and how to split strings easily, etc. Hopefully you will find the example useful.</div><div><br /></div><div><br /></div><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br />#include<string><br />#include<sstream><br />#include<map><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /><br />void</span> split<span class="operator">(</span><span class="keyword">const</span> string<span class="operator">&</span> input<span class="operator">,</span><span class="type"> int</span><span class="operator">&</span> num1<span class="operator">,</span><span class="type"> int</span><span class="operator">&</span> num2<span class="operator">,</span> string<span class="operator">&</span> operation<span class="operator">);</span><span class="type"><br />int</span> calculate<span class="operator">(</span><span class="type">int</span> num1<span class="operator">,</span><span class="type"> int</span> num2<span class="operator">,</span> string operation<span class="operator">);</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> string s<span class="operator">[</span><span class="int">5</span><span class="operator">] = {</span><span class="string">"2 + 2"</span><span class="operator">,</span><span class="string"> "4 - 1"</span><span class="operator">,</span><span class="string"> "4 * 6"</span><span class="operator">,</span><span class="string"> "18 / 3"</span><span class="operator">,</span><span class="string"> "12 ^ 2"</span><span class="operator">};</span><span class="flow"><br /><br /> for</span><span class="operator">(</span><span class="type">int</span> i<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span> i<span class="operator"> <</span><span class="int"> 5</span><span class="operator"> ;</span> i<span class="operator">++)<br /> {</span><span class="type"><br /> int</span> num1<span class="operator">=</span><span class="int">0</span><span class="operator">,</span> num2<span class="operator">=</span><span class="int">0</span><span class="operator">;</span><br /> string op<span class="operator">;</span><br /> split<span class="operator">(</span>s<span class="operator">[</span>i<span class="operator">],</span> num1<span class="operator">,</span> num2<span class="operator">,</span> op<span class="operator">);</span><span class="type"><br /> int</span> retVal<span class="operator"> =</span> calculate<span class="operator">(</span>num1<span class="operator">,</span> num2<span class="operator">,</span> op<span class="operator">);</span><br /> cout<span class="operator"><<</span>s<span class="operator">[</span>i<span class="operator">]<<</span><span class="string">" = "</span><span class="operator"><<</span>retVal<span class="operator"><<</span>endl<span class="operator">;<br /> }</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><span class="type"><br /><br />void</span> split<span class="operator">(</span><span class="keyword">const</span> string<span class="operator">&</span> input<span class="operator">,</span><span class="type"> int</span><span class="operator">&</span> num1<span class="operator">,</span><span class="type"> int</span><span class="operator">&</span> num2<span class="operator">,</span> string<span class="operator">&</span> operation<span class="operator">)<br />{</span><br /> istringstream iss<span class="operator">(</span>input<span class="operator">);</span><br /> iss<span class="operator"> >></span> num1<span class="operator">;</span><br /> iss<span class="operator"> >></span> operation<span class="operator">;</span><br /> iss<span class="operator"> >></span> num2<span class="operator">;<br />}</span><span class="type"><br /><br />int</span> calculate<span class="operator">(</span><span class="type">int</span> num1<span class="operator">,</span><span class="type"> int</span> num2<span class="operator">,</span> string operation<span class="operator">)<br />{</span><span class="keyword"><br /> enum</span> Operators<span class="operator"> {</span>unknown<span class="operator">,</span> add<span class="operator">,</span> sub<span class="operator">,</span> mul<span class="operator">,</span> div<span class="operator">};</span><br /> map<span class="operator"><</span>string<span class="operator">,</span> Operators<span class="operator">></span> mapOfOperators<span class="operator">;</span><br /> mapOfOperators<span class="operator">[</span><span class="string">"+"</span><span class="operator">] =</span> add<span class="operator">;</span><br /> mapOfOperators<span class="operator">[</span><span class="string">"-"</span><span class="operator">] =</span> sub<span class="operator">;</span><br /> mapOfOperators<span class="operator">[</span><span class="string">"*"</span><span class="operator">] =</span> mul<span class="operator">;</span><br /> mapOfOperators<span class="operator">[</span><span class="string">"/"</span><span class="operator">] =</span> div<span class="operator">;</span><span class="flow"><br /><br /> switch</span><span class="operator">(</span>mapOfOperators<span class="operator">[</span>operation<span class="operator">])<br /> {</span><span class="flow"><br /> case</span> add<span class="operator">:</span><span class="flow"><br /> return</span> num1<span class="operator"> +</span> num2<span class="operator">;</span><span class="flow"><br /> case</span> sub<span class="operator">:</span><span class="flow"><br /> return</span> num1<span class="operator"> -</span> num2<span class="operator">;</span><span class="flow"><br /> case</span> mul<span class="operator">:</span><span class="flow"><br /> return</span> num1<span class="operator"> *</span> num2<span class="operator">;</span><span class="flow"><br /> case</span> div<span class="operator">:</span><span class="flow"><br /> return</span> num1<span class="operator"> /</span> num2<span class="operator">;</span><span class="flow"><br /> default</span><span class="operator">:</span><br /> cout<span class="operator"><<</span><span class="string">"Unrecognised Operator "</span><span class="operator"><<</span>operation<span class="operator"><<</span>endl<span class="operator">;<br /> }</span><span class="flow"><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span></pre><br /></div><div><br /></div><div>The output is as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlUXxfPu8Qx5iJHtsr9TD7FLUbpOEVsnmZK-mg5AhoXKYOS1dp2vFGrQdtTYXhftvIuC22R994fh-4y5EqfW2K84GNR_DNIeO1ewyR536QKzNFwxY_XO-BWnP4F_qtwsjPBDiW1antYr0S/s1600/zg_SwitchForStrings.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 170px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlUXxfPu8Qx5iJHtsr9TD7FLUbpOEVsnmZK-mg5AhoXKYOS1dp2vFGrQdtTYXhftvIuC22R994fh-4y5EqfW2K84GNR_DNIeO1ewyR536QKzNFwxY_XO-BWnP4F_qtwsjPBDiW1antYr0S/s400/zg_SwitchForStrings.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5580265345230567250" /></a>See Also: <a href="http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4067">Codeguru article</a> on 'Switch on Strings in C++'.Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com1tag:blogger.com,1999:blog-2349434231090974738.post-47523955758594591592011-03-04T06:59:00.004+00:002011-03-04T07:50:50.993+00:00Removing all white-spaces from a string<div>Continuing on the same theme as the <a href="http://advancedcppwithexamples.blogspot.com/2011/03/removing-multiple-white-spaces-from.html">last post</a>. What if all the spaces need to be stripped out from the input string:</div><div><br /></div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br />#include<string><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><br /><br />string removeAllSpaces<span class="operator">(</span><span class="keyword">const</span> string<span class="operator">&</span> s<span class="operator">)<br />{</span><br /> string newStr<span class="operator">(</span>s<span class="operator">);</span><span class="type"><br /> bool</span> spacesLeft<span class="operator"> =</span><span class="bool"> true</span><span class="operator">;</span><span class="flow"><br /><br /> while</span><span class="operator">(</span>spacesLeft<span class="operator">)<br /> {</span><span class="type"><br /> int</span> pos<span class="operator"> =</span> newStr<span class="operator">.</span>find<span class="operator">(</span><span class="string">" "</span><span class="operator">);</span><span class="flow"><br /> if</span><span class="operator">(</span>pos<span class="operator"> !=</span> string<span class="operator">::</span>npos<span class="operator">)<br /> {</span><br /> newStr<span class="operator">.</span>erase<span class="operator">(</span>pos<span class="operator">,</span><span class="int"> 1</span><span class="operator">);<br /> }</span><span class="flow"><br /> else</span><br /> spacesLeft<span class="operator"> =</span><span class="bool"> false</span><span class="operator">;<br /> }</span><span class="flow"><br /><br /> return</span> newStr<span class="operator">;<br />}</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> string aString<span class="operator">(</span><span class="string">"This string has multiple spaces problem!"</span><span class="operator">);</span><br /><br /> cout<span class="operator"><<</span><span class="string">"Original : "</span><span class="operator"><<</span>aString<span class="operator"><<</span>endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Modified : "</span><span class="operator"><<</span>removeAllSpaces<span class="operator">(</span>aString<span class="operator">)<<</span>endl<span class="operator">;</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /><br /></pre><br /></div><br /><div><br /></div><div>The output is as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX7Yi7gnmiQ-J7UNACFwvnQ2F1j9tatw6bIzmyHkWoiWmkCnE7t2DZBSpAe_mSbWioMLf3NYaoFbZ5DN0K2JTnUJL8jshffQnIhqydACob851ZmaQoM0ub6oozdjZFfZpqt6jOM-P8EqW0/s1600/zg_noWhiteSpaces.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 73px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX7Yi7gnmiQ-J7UNACFwvnQ2F1j9tatw6bIzmyHkWoiWmkCnE7t2DZBSpAe_mSbWioMLf3NYaoFbZ5DN0K2JTnUJL8jshffQnIhqydACob851ZmaQoM0ub6oozdjZFfZpqt6jOM-P8EqW0/s400/zg_noWhiteSpaces.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5576157741532022866" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-41140883141784838812011-03-01T06:30:00.002+00:002011-03-01T06:30:00.813+00:00Removing Multiple White-spaces from a string<div>A simple program to remove an arbitrary number of white spaces in between words. Program as follows:</div><div><br /></div><br /><div style="background:#DDDDDD"><br /><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br />#include<string><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /> <br />bool</span> removeDoubleSpaces<span class="operator">(</span>string<span class="operator">&</span> s<span class="operator">)<br />{</span><span class="type"><br /> bool</span> found<span class="operator"> =</span><span class="bool"> true</span><span class="operator">;</span><span class="type"><br /> <br /> int</span> i<span class="operator"> =</span> s<span class="operator">.</span>find<span class="operator">(</span><span class="string">" "</span><span class="operator">);</span><span class="comment"> //Search for 2 spaces<br /></span><span class="flow"> if</span><span class="operator">(</span>i<span class="operator"> !=</span> string<span class="operator">::</span>npos<span class="operator">)<br /> {</span><br /> s<span class="operator">.</span>replace<span class="operator">(</span>i<span class="operator">,</span><span class="int"> 2</span><span class="operator">,</span><span class="string"> " "</span><span class="operator">);<br /> }</span><span class="flow"><br /> else</span><br /> found<span class="operator"> =</span><span class="bool"> false</span><span class="operator">;</span><span class="flow"><br /> <br /> return</span> found<span class="operator">;<br />}</span><br /> <br />string removeMultipleSpaces<span class="operator">(</span><span class="keyword">const</span> string<span class="operator">&</span> s<span class="operator">)<br />{</span><br /> string newStr<span class="operator">(</span>s<span class="operator">);</span><span class="type"><br /> bool</span> found<span class="operator"> =</span><span class="bool"> true</span><span class="operator">;</span><span class="flow"><br /> <br /> while</span><span class="operator">(</span>found<span class="operator">)<br /> {</span><br /> found<span class="operator"> =</span> removeDoubleSpaces<span class="operator">(</span>newStr<span class="operator">);<br /> }</span><span class="flow"><br /> <br /> return</span> newStr<span class="operator">;<br />}</span><span class="type"><br /> <br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> string aString<span class="operator">(</span><span class="string">"This string has multiple spaces problem!"</span><span class="operator">);</span><br /> <br /> cout<span class="operator"><<</span><span class="string">"Original : "</span><span class="operator"><<</span>aString<span class="operator"><<</span>endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Modified : "</span><span class="operator"><<</span>removeMultipleSpaces<span class="operator">(</span>aString<span class="operator">)<<</span>endl<span class="operator">;</span><span class="flow"><br /> <br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /> <br /></pre><br /></div><br /><div>The output is as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeqaRW4-VA0hOfdt6LAxdY8CFxPRmd1hWtdEqHZ1tFtph___81yppbQINZH25SLSHYN6gl3R1ZtIRhCD7LJB2njeWRYyWzsYKY7QPXsxw3wtiS6rJ5UJQgT5aMFp7QRvbg2nEdspJV775K/s1600/zg_multipleWhiteSpaces.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 85px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeqaRW4-VA0hOfdt6LAxdY8CFxPRmd1hWtdEqHZ1tFtph___81yppbQINZH25SLSHYN6gl3R1ZtIRhCD7LJB2njeWRYyWzsYKY7QPXsxw3wtiS6rJ5UJQgT5aMFp7QRvbg2nEdspJV775K/s400/zg_multipleWhiteSpaces.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5576150593858682610" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com1tag:blogger.com,1999:blog-2349434231090974738.post-27485458798122695722011-02-22T06:18:00.000+00:002011-02-22T06:18:00.245+00:00A generic sort program with 'functors' and 'templates'<div>Picked up this question from <a href="http://stackoverflow.com/questions/4864214/functor-and-templates">here</a> and made a program out of it. It may be a good idea to quickly brush <a href="http://advancedcppwithexamples.blogspot.com/2010/04/example-of-functors.html">functors</a> and <a href="http://advancedcppwithexamples.blogspot.com/2009/03/example-of-c-templates.html">templates</a> if required.</div><div><br /></div><div>The program sorts the input Vector provided regardless of the type.</div><div><br /></div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment"><br />//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include <iostream><br />#include <vector><br />#include <string><br />#include <algorithm><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="keyword"><br /><br />class</span> Int<span class="operator"><br />{</span><span class="keyword"><br />public</span><span class="operator">:</span><br /> Int<span class="operator">() {</span>x_<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;}</span><br /> Int<span class="operator">(</span><span class="keyword">const</span><span class="type"> int</span><span class="operator"> &</span>x<span class="operator">) {</span>x_<span class="operator"> =</span> x<span class="operator">;}</span><span class="type"><br /> int</span> getID<span class="operator"> (</span><span class="type">void</span><span class="operator">) {</span><span class="flow">return</span> x_<span class="operator">;}</span><span class="type"><br /> int</span> x_<span class="operator">;<br />};</span><span class="keyword"><br /><br />class</span> Str<span class="operator"><br />{</span><span class="keyword"><br />public</span><span class="operator">:</span><br /> Str<span class="operator">() {</span>x_<span class="operator"> =</span><span class="string"> ""</span><span class="operator">;}</span><br /> Str<span class="operator">(</span><span class="keyword">const</span> string<span class="operator"> &</span>x<span class="operator">) {</span>x_<span class="operator"> =</span> x<span class="operator">;}</span><br /> string getID<span class="operator"> (</span><span class="type">void</span><span class="operator">) {</span><span class="flow">return</span> x_<span class="operator">;}</span><br /> string x_<span class="operator">;<br />};</span><span class="keyword"><br /><br />template</span><span class="operator"> <</span><span class="keyword">typename</span> Object<span class="operator">></span><span class="keyword"> class</span> Comparator<span class="operator"> {</span><span class="keyword"><br /> public</span><span class="operator">:</span><span class="type"><br /> bool</span><span class="keyword"> operator</span><span class="operator">()(</span><span class="keyword">const</span> Object<span class="operator"> &</span>o1<span class="operator">,</span><span class="keyword"> const</span> Object<span class="operator"> &</span>o2<span class="operator">)</span><span class="keyword"> const</span><span class="operator"> <br /> {</span><span class="flow"><br /> return</span><span class="operator"> (</span><span class="keyword">const_cast</span><span class="operator"><</span>Object<span class="operator">&>(</span>o1<span class="operator">).</span>getID<span class="operator">() <</span><span class="keyword"> const_cast</span><span class="operator"><</span>Object<span class="operator">&>(</span>o2<span class="operator">).</span>getID<span class="operator">());<br /> }</span><span class="type"><br /><br /> bool</span><span class="keyword"> operator</span><span class="operator">()(</span><span class="keyword">const</span> Object<span class="operator"> *</span>o1<span class="operator">,</span><span class="keyword"> const</span> Object<span class="operator"> *</span>o2<span class="operator">)</span><span class="keyword"> const</span><span class="operator"> {</span><span class="flow"><br /> return</span><span class="operator"> (</span>o1<span class="operator">-></span>getID<span class="operator">() <</span> o2<span class="operator">-></span>getID<span class="operator">());<br /> }<br />};</span><span class="keyword"><br /><br />template</span><span class="operator"> <</span><span class="keyword">typename</span> VecObject<span class="operator">></span><span class="type"> void</span> Display<span class="operator">(</span>VecObject v<span class="operator">)<br />{</span><br /> VecObject<span class="operator">::</span>iterator it<span class="operator">;</span><span class="flow"><br /> for</span><span class="operator">(</span>it<span class="operator"> =</span> v<span class="operator">.</span>begin<span class="operator">();</span> it<span class="operator"> !=</span> v<span class="operator">.</span>end<span class="operator">(); ++</span>it<span class="operator">)<br /> {</span><br /> cout<span class="operator"><<</span>it<span class="operator">-></span>getID<span class="operator">()<<</span><span class="string">", "</span><span class="operator">;<br /> }</span><br /> cout<span class="operator"><<</span>endl<span class="operator">;<br />}</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> vector<span class="operator"><</span>Int<span class="operator">></span> objects1<span class="operator">;</span><br /> objects1<span class="operator">.</span>push_back<span class="operator">(</span>Int<span class="operator">(</span><span class="int">3</span><span class="operator">));</span><br /> objects1<span class="operator">.</span>push_back<span class="operator">(</span>Int<span class="operator">());</span><br /> objects1<span class="operator">.</span>push_back<span class="operator">(</span>Int<span class="operator">(</span><span class="int">77</span><span class="operator">));</span><span class="comment"><br /><br /> //print the output<br /></span> cout<span class="operator"><<</span><span class="string">"objects1 before sort = "</span><span class="operator">;</span><br /> Display<span class="operator">(</span>objects1<span class="operator">);</span><br /> std<span class="operator">::</span>sort<span class="operator">(</span>objects1<span class="operator">.</span>begin<span class="operator">(),</span> objects1<span class="operator">.</span>end<span class="operator">(),</span> Comparator<span class="operator"><</span>Int<span class="operator">> ());</span><br /> cout<span class="operator"><<</span><span class="string">"objects1 after sort = "</span><span class="operator">;</span><br /> Display<span class="operator">(</span>objects1<span class="operator">);</span><br /><br /> std<span class="operator">::</span>vector<span class="operator"><</span>Str<span class="operator">></span> objects2<span class="operator">;</span><br /> objects2<span class="operator">.</span>push_back<span class="operator">(</span>Str<span class="operator">(</span><span class="string">"Hello Hello"</span><span class="operator">));</span><br /> objects2<span class="operator">.</span>push_back<span class="operator">(</span>Str<span class="operator">(</span><span class="string">"apple?"</span><span class="operator">));</span><br /> objects2<span class="operator">.</span>push_back<span class="operator">(</span>Str<span class="operator">());</span><br /> objects2<span class="operator">.</span>push_back<span class="operator">(</span>Str<span class="operator">(</span><span class="string">"1 Jump"</span><span class="operator">));</span><span class="comment"><br /><br /> //print the output<br /></span> cout<span class="operator"><<</span><span class="string">"objects2 before sort = "</span><span class="operator">;</span><br /> Display<span class="operator">(</span>objects2<span class="operator">);</span><br /> std<span class="operator">::</span>sort<span class="operator">(</span>objects2<span class="operator">.</span>begin<span class="operator">(),</span> objects2<span class="operator">.</span>end<span class="operator">(),</span> Comparator<span class="operator"><</span>Str<span class="operator">> ());</span><br /> cout<span class="operator"><<</span><span class="string">"objects2 after sort = "</span><span class="operator">;</span><br /> Display<span class="operator">(</span>objects2<span class="operator">);</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div><br /><div><br /></div><div>The output is as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAJyGXwVF9Is23pvNJTFJYw68GBkNtwcjyZBDsSX2VgqhBImWZ9YuiuTrV5A2ZkoIA1ONvlQpNTnUyIW-oIgKhHRx0bYJBvYBNUgLTn4sHKcHfnk9AVpjKnxVzPkvkRh4QHvnKt6J6uyeX/s1600/zg_sort_functor_template.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 114px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAJyGXwVF9Is23pvNJTFJYw68GBkNtwcjyZBDsSX2VgqhBImWZ9YuiuTrV5A2ZkoIA1ONvlQpNTnUyIW-oIgKhHRx0bYJBvYBNUgLTn4sHKcHfnk9AVpjKnxVzPkvkRh4QHvnKt6J6uyeX/s400/zg_sort_functor_template.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5569169366021586626" /></a>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com1tag:blogger.com,1999:blog-2349434231090974738.post-31287141036761540922011-02-15T06:48:00.000+00:002011-02-15T06:48:00.219+00:00Debugging Mutex and Locks<div>When there are multiple Mutex's in the program, it may be required to find if a particular thread is locked far longer than necessary. This can cause problems and the output may not be what is expected. </div><div><br /></div><div>To get round this, I took an old example from <a href="http://advancedcppwithexamples.blogspot.com/2009/05/another-multi-threading-example-with.html">here</a> and modified it to help me print some debugging info.</div><div><br /></div><div>I modified the printSomething() in Singleton.h to add a sleep as follows:</div><div><br /></div><br /><div style="background:#DDDDDD"><br /><pre><span class="type"> void</span> printSomething<span class="operator">(</span><span class="type">char</span><span class="operator"> *</span>name<span class="operator">,</span><span class="type"> int</span> count<span class="operator">)<br /> {</span><br /> Lock guard<span class="operator">(</span>mutex_<span class="operator">);</span><br /> Sleep<span class="operator">(</span><span class="int">10</span><span class="operator">);</span><br /> Lock guard2<span class="operator">(</span>mutex_<span class="operator">);</span><br /> std<span class="operator">::</span>cout<span class="operator"> <<</span> name<span class="operator"> <<</span><span class="string"> " loop "</span><span class="operator"> <<</span> count<span class="operator"> <<</span> std<span class="operator">::</span>endl<span class="operator">;<br /> }</span><br /></pre><br /></div><br /><div><br /></div><div>and I modified the Mutex.h as follows:</div><div><br /></div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Example from http://www.relisoft.com/Win32/active.html<br /></span><span class="pre">#if !defined _MUTEX_H_<br />#define _MUTEX_H_<br /></span><span class="keyword"><br />class</span> Mutex<span class="operator"><br />{</span><span class="keyword"><br /> friend class</span> Lock<span class="operator">;</span><span class="keyword"><br />public</span><span class="operator">:</span><br /> Mutex<span class="operator"> () {</span> InitializeCriticalSection<span class="operator"> (&</span> _critSection<span class="operator">); }<br /> ~</span>Mutex<span class="operator"> () {</span> DeleteCriticalSection<span class="operator"> (&</span> _critSection<span class="operator">); }</span><span class="keyword"><br />private</span><span class="operator">:</span><span class="type"><br /> void</span> Acquire<span class="operator"> ()<br /> {</span><br /> DWORD start<span class="operator"> =</span> GetTickCount<span class="operator">();</span><br /> EnterCriticalSection<span class="operator"> (&</span> _critSection<span class="operator">);</span><br /> DWORD elapsed<span class="operator"> =</span> GetTickCount<span class="operator">() -</span> start<span class="operator">;</span><span class="flow"><br /> if</span><span class="operator"> (</span>elapsed<span class="operator"> ></span><span class="int"> 15</span><span class="operator">)<br /> {</span><span class="comment"><br /> //Debugging Info<br /></span> std<span class="operator">::</span>cout<span class="operator"><<</span><span class="string">"Debugging Info: Waited at mutex for "</span><span class="operator"><<</span>elapsed<span class="operator"><<</span>std<span class="operator">::</span>endl<span class="operator">;<br /> }<br /> }</span><span class="type"><br /> void</span> Release<span class="operator"> ()<br /> {</span><br /> LeaveCriticalSection<span class="operator"> (&</span> _critSection<span class="operator">);<br /> }</span><br /><br /> CRITICAL_SECTION _critSection<span class="operator">;<br />};</span><span class="pre"><br /><br />#endif </span></pre><br /></div><br /><div><br /></div><div>The output is as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxf9yDAjFN6wBHzYMq2i0qeLm3eDCx3MjhoZQFZaZ3CQnxn1iNUDLuNiRqke2S0Yj1SqUvXdz9EzEZmBxNqV0sLfHhyZo-74nM9OGYwyHRJefJf1RaD0e_P0M3ZCOxitjBgiR7SLqf1BAY/s1600/zg_mutex_debug.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 337px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxf9yDAjFN6wBHzYMq2i0qeLm3eDCx3MjhoZQFZaZ3CQnxn1iNUDLuNiRqke2S0Yj1SqUvXdz9EzEZmBxNqV0sLfHhyZo-74nM9OGYwyHRJefJf1RaD0e_P0M3ZCOxitjBgiR7SLqf1BAY/s400/zg_mutex_debug.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5569166203993081330" /></a>The small problem with the above approach is that if a Thread is deadlocked, we may not get the debug output as we would have to kill the process.<br /><div><br /></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-83740275386863036562011-02-09T06:24:00.004+00:002011-02-09T06:24:00.227+00:00Add two unsigned integers without using '+'I found this very interesting discussion (and the program) to add two numbers without the use of the arithmetic operator '+'. The obvious guess would be to use the <a href="http://www.cplusplus.com/doc/tutorial/operators/">Bitwise operators</a>.<div><br /></div><div>The logic behind the addition operation using the bitwise operators is as follows:</div><div><br /></div><br /><pre>integer1<span class="operator"> =</span><span class="int"> 3</span><span class="operator"> =</span> 0011b<br />integer2<span class="operator"> =</span><span class="int"> 5</span><span class="operator"> =</span> 0101b<br /><br /> first operation second operation third operation<span class="int"><br /> 0011 0011</span> shift by one<span class="int"><br /> 0101 0101</span> <br /> ______ ______<br /> XOR<span class="int"> 0110</span> AND<span class="int"> 0001</span><span class="operator"> ------> <<</span><span class="int">1 0010</span><br /><br /> Again<span class="operator">...</span> <br /> first operation second operation third operation<br />previous XOR<span class="int"> 0110 0110</span> shift by one<br />previous<span class="operator"> <<</span><span class="int">1 0010 0010</span><br /> ______ ______<br /> XOR<span class="int"> 0100</span> AND<span class="int"> 0010</span><span class="operator"> ------> <<</span><span class="int">1 0100</span><br /><br /> Again<span class="operator">...</span> <br /> first operation second operation third operation<br />previous XOR<span class="int"> 0100 0100</span> shift by one<br />previous<span class="operator"> <<</span><span class="int">1 0100 0100</span><br /> ______ ______<br /> XOR<span class="int"> 0000</span> AND<span class="int"> 0100</span><span class="operator"> ------> <<</span><span class="int">1 1000</span><br /><br /> Again<span class="operator">...</span> <br /> first operation second operation <br />previous XOR<span class="int"> 0000 0000</span> <br />previous<span class="operator"> <<</span><span class="int">1 1000 1000</span><br /> ______ ______<br /> XOR<span class="int"> 1000</span> AND<span class="int"> 0000</span> <br />When AND iguals<span class="int"> 0</span> the result of XOR is iqual to the sum of the two integers<br /></pre><br /><div></div><div>The program is as follows:</div><div><br /></div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program to add two numbers by using boolean operators<br />//Ref: http://www.daniweb.com/forums/thread84950.html<br />//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /><br />unsigned long</span> add<span class="operator">(</span><span class="type">unsigned</span> integer1<span class="operator">,</span><span class="type"> unsigned</span> integer2<span class="operator">)<br />{</span><span class="type"><br /> unsigned long</span><span class="operator"> xor</span><span class="operator">,</span><span class="operator"> and</span><span class="operator">,</span> temp<span class="operator">;</span><span class="operator"><br /><br /> and</span><span class="operator"> =</span> integer1<span class="operator"> &</span> integer2<span class="operator">;</span><span class="comment"> /* Obtain the carry bits */</span><span class="operator"><br /> xor</span><span class="operator"> =</span> integer1<span class="operator"> ^</span> integer2<span class="operator">;</span><span class="comment"> /* resulting bits */</span><span class="flow"><br /> <br /> while</span><span class="operator">(</span><span class="operator">and</span><span class="operator"> !=</span><span class="int"> 0</span><span class="operator"> )</span><span class="comment"> /* stop when carry bits are gone */</span><span class="operator"><br /> {</span><span class="operator"><br /> and</span><span class="operator"> <<=</span><span class="int"> 1</span><span class="operator">;</span><span class="comment"> /* shifting the carry bits one space */</span><br /> temp<span class="operator"> =</span><span class="operator"> xor</span><span class="operator"> ^</span><span class="operator"> and</span><span class="operator">;</span><span class="comment"> /* hold the new xor result bits*/</span><span class="operator"><br /> and</span><span class="operator"> &=</span><span class="operator"> xor</span><span class="operator">;</span><span class="comment"> /* clear the previous carry bits and assign the new carry bits */</span><span class="operator"><br /> xor</span><span class="operator"> =</span> temp<span class="operator">;</span><span class="comment"> /* resulting bits */</span><span class="operator"><br /> }</span><span class="flow"><br /> return</span><span class="operator"> xor</span><span class="operator">;</span><span class="comment"> /* final result */</span><span class="operator"><br />}</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> num1<span class="operator"> =</span><span class="int"> 13</span><span class="operator">,</span> num2<span class="operator"> =</span><span class="int"> 27</span><span class="operator">;</span><br /><br /> cout<span class="operator"> <<</span> num1<span class="operator"> <<</span><span class="string"> " + "</span><span class="operator"> <<</span> num2<span class="operator"> <<</span><span class="string"> " = "</span><span class="operator"> <<</span>add<span class="operator">(</span>num1<span class="operator">,</span> num2<span class="operator">) <<</span> endl<span class="operator">;</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div><br /><div>The output is:</div><div><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="color:#000099;">13 + 27 = 40</span></span></div><div><br /></div><div>See the original discussion <a href="http://www.daniweb.com/forums/thread84950.html">here</a>.</div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-40849425208744618662011-02-02T06:42:00.005+00:002011-02-02T08:33:20.950+00:00Consequences of Ignoring Compiler Warnings<div>Though this is a fictional program that I have picked up from <a href="http://www.velocityreviews.com/forums/t645621-c-puzzle.html">here</a>, I have seen similar problems in real life.</div><div><br /></div><div>Lets say my program (below) was expected to return this</div><div><br /></div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIzKbyYNVrmmgMhwsyruxT0rtIPvOdNfRCd61EeMZYc8_yuQfOezXYDjmAuKqvZjgyB31RPAbp42MAEwe0yDGmMd1OGFaDE5ENiQf5GS5kVCZQSUY40TeYPL7GDf22DxxTzp56WHgwMmgf/s1600/zg_labels2_expected.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 389px; height: 153px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIzKbyYNVrmmgMhwsyruxT0rtIPvOdNfRCd61EeMZYc8_yuQfOezXYDjmAuKqvZjgyB31RPAbp42MAEwe0yDGmMd1OGFaDE5ENiQf5GS5kVCZQSUY40TeYPL7GDf22DxxTzp56WHgwMmgf/s400/zg_labels2_expected.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5565702256618767522" /></a><br /><div>but instead returned:<br /><div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid9lqxQ8ETbu_f2WcftTF_pZhn0JeQK66juH9ViUFYkRYf0XAl-e9dhmUA4eTHHeNP1QHTE55JMOsdtKaUrE1Wm7DKbdmdlI3Ufzkg-zDLWBx-v9v-T7vF6dhyVUL3xS4-rv-xPGY3MdMr/s1600/zg_labels2_unexpected.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 357px; height: 321px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid9lqxQ8ETbu_f2WcftTF_pZhn0JeQK66juH9ViUFYkRYf0XAl-e9dhmUA4eTHHeNP1QHTE55JMOsdtKaUrE1Wm7DKbdmdlI3Ufzkg-zDLWBx-v9v-T7vF6dhyVUL3xS4-rv-xPGY3MdMr/s400/zg_labels2_unexpected.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5565702254966677698" /></a>Program as follows:</div></div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="keyword"><br /><br />class</span> Bclass<span class="operator"><br />{</span><span class="keyword"><br />public</span><span class="operator">:</span><br /> Bclass<span class="operator">() {}</span><span class="keyword"><br /> virtual</span><span class="type"> void</span> func<span class="operator">()<br /> {</span><br /> cout<span class="operator"><<</span><span class="string">"In Bclass::func()"</span><span class="operator"><<</span>endl<span class="operator">;<br /> }<br />};</span><span class="keyword"><br /><br />class</span> Dclass<span class="operator"> :</span><span class="keyword"> public</span> Bclass<span class="operator"><br />{</span><span class="keyword"><br />public</span><span class="operator">:</span><br /> Dclass<span class="operator">() {}</span><span class="keyword"><br /> virtual</span><span class="type"> void</span> func<span class="operator">()<br /> {</span><br /> cout<span class="operator"><<</span><span class="string">"In Dclass::func()"</span><span class="operator"><<</span>endl<span class="operator">;</span><br /> Bclass<span class="operator">:</span>func<span class="operator">();<br /> }<br />};</span><span class="type"><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> Dclass d<span class="operator">;</span><br /> d<span class="operator">.</span>func<span class="operator">();</span><span class="comment"><br /> //...<br /></span><span class="flow"> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre><br /></div><br /><div>The clue of the problem was given by the compiler that generated the following warning:</div><div><br /></div><div><span class="Apple-style-span" style="color:#CC0000;">main.cpp(23) : warning C4102: 'Bclass' : unreferenced label</span></div><div><br /></div><div>pointing to the line</div><div><br /></div><div><span class="Apple-style-span" style="color:#000099;">Bclass:func();</span></div><div><br /></div><div>The problem lies in the fact that due to a single : rather than :: the line above is being treated as label and since its an unreferenced label it goes back to the start of the same function.</div><div><br /></div><div>You can read the complete discussion <a href="http://www.velocityreviews.com/forums/t645621-c-puzzle.html">here</a>. Make sure to check the warnings the next time your program behaves unexpectedly.</div><div><br /></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0tag:blogger.com,1999:blog-2349434231090974738.post-20421964311145666912011-01-26T06:28:00.001+00:002011-01-26T06:28:00.361+00:00Swap two variables without using third and in one line<div>Couple of weeks back I was interviewing a fresh graduate. Even though they are taught programming, I am not sure if they take it seriously and learn or practice it well. One of the questions I asked was to swap 2 numbers without using a temp variable.</div><div><br /></div><div>Looking back now, I think it may be a bigger challenge to ask to swap numbers without using a temp variable and in one line. Below are my three different approaches but I would advise you to try it yourself before looking at the answer.</div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program to swap 2 numbers without using 3rd variable and in one line<br />//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="type"><br /><br />void</span> approach1<span class="operator">(</span><span class="type">int</span><span class="operator">&</span> a<span class="operator">,</span><span class="type"> int</span><span class="operator">&</span> b<span class="operator">)<br />{</span><br /> cout<span class="operator"><<</span><span class="string">"\nApproach 1"</span><span class="operator"><<</span>endl<span class="operator">;</span><br /> a<span class="operator">^=</span>b<span class="operator">^=</span>a<span class="operator">^=</span>b<span class="operator">;<br />}</span><span class="type"><br /><br />void</span> approach2<span class="operator">(</span><span class="type">int</span><span class="operator">&</span> a<span class="operator">,</span><span class="type"> int</span><span class="operator">&</span> b<span class="operator">)<br />{</span><br /> cout<span class="operator"><<</span><span class="string">"\nApproach 2"</span><span class="operator"><<</span>endl<span class="operator">;</span><span class="comment"><br /> //b=(a+b)-(a=b); - This should work but doesnt, why?<br /></span> a<span class="operator"> =((</span>a<span class="operator"> =</span> a<span class="operator"> +</span> b<span class="operator">) - (</span>b<span class="operator"> =</span> a<span class="operator"> -</span> b<span class="operator">)); <br />}</span><span class="type"><br /><br />void</span> approach3<span class="operator">(</span><span class="type">int</span><span class="operator">&</span> a<span class="operator">,</span><span class="type"> int</span><span class="operator">&</span> b<span class="operator">)<br />{</span><br /> cout<span class="operator"><<</span><span class="string">"\nApproach 3"</span><span class="operator"><<</span>endl<span class="operator">;</span><br /> a<span class="operator"> = ((</span>a<span class="operator"> =</span> a<span class="operator"> *</span> b<span class="operator">) / (</span>b<span class="operator"> =</span> a<span class="operator"> /</span> b<span class="operator">));<br />}</span><span class="type"><br /><br /><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><span class="type"><br /> int</span> a<span class="operator"> =</span><span class="int"> 13</span><span class="operator">,</span> b<span class="operator"> =</span><span class="int"> 29</span><span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"\nOriginal"</span><span class="operator"><<</span>endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"a = "</span><span class="operator"><<</span>a<span class="operator"><<</span><span class="string">", b = "</span><span class="operator"><<</span>b<span class="operator"><<</span>endl<span class="operator">;</span><br /><br /> approach1<span class="operator">(</span>a<span class="operator">,</span> b<span class="operator">);</span><br /> cout<span class="operator"><<</span><span class="string">"a = "</span><span class="operator"><<</span>a<span class="operator"><<</span><span class="string">", b = "</span><span class="operator"><<</span>b<span class="operator"><<</span>endl<span class="operator">;</span><br /><br /> a<span class="operator"> =</span><span class="int"> 13</span><span class="operator">,</span> b<span class="operator"> =</span><span class="int"> 29</span><span class="operator">;</span><br /> approach2<span class="operator">(</span>a<span class="operator">,</span> b<span class="operator">);</span><br /> cout<span class="operator"><<</span><span class="string">"a = "</span><span class="operator"><<</span>a<span class="operator"><<</span><span class="string">", b = "</span><span class="operator"><<</span>b<span class="operator"><<</span>endl<span class="operator">;</span><br /><br /> a<span class="operator"> =</span><span class="int"> 13</span><span class="operator">,</span> b<span class="operator"> =</span><span class="int"> 29</span><span class="operator">;</span><br /> approach3<span class="operator">(</span>a<span class="operator">,</span> b<span class="operator">);</span><br /> cout<span class="operator"><<</span><span class="string">"a = "</span><span class="operator"><<</span>a<span class="operator"><<</span><span class="string">", b = "</span><span class="operator"><<</span>b<span class="operator"><<</span>endl<span class="operator">;</span><span class="flow"><br /><br /> return</span><span class="int"> 0</span><span class="operator">;<br />}</span><br /></pre></div><br /></div><div>The output is as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv_kcHGy6WmkbLo7hl_gsexwbWwJoTwWs5Xwh6hMp3PjV6OHTxtdxgRd1F5ncdpLpjVmwYXjOZELvAh-MeMWzuNqdtZbJAS9wC0ueP9yX_woWrLZDdXOFdiBIMUtsKAU4sRMZAU1QQU54I/s1600/zg_swap.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 249px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv_kcHGy6WmkbLo7hl_gsexwbWwJoTwWs5Xwh6hMp3PjV6OHTxtdxgRd1F5ncdpLpjVmwYXjOZELvAh-MeMWzuNqdtZbJAS9wC0ueP9yX_woWrLZDdXOFdiBIMUtsKAU4sRMZAU1QQU54I/s400/zg_swap.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5565698514500182594" /></a>Agreed that the above would be applicable only for integers.<div><br /></div>Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com9tag:blogger.com,1999:blog-2349434231090974738.post-73238300249206767832011-01-19T06:25:00.003+00:002011-01-19T06:25:00.443+00:00'sizeof' a class<div>Continuation from last week. What is the sizeof of a class? Wrote a simple program as follows:<br /></div><div><br /><div style="background:#DDDDDD"><br /><pre><span class="comment">//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy<br /></span><span class="pre">#include<iostream><br /></span><span class="keyword"><br />using namespace</span> std<span class="operator">;</span><span class="keyword"><br /><br />class</span> A<span class="operator"><br />{</span><span class="type"><br /> int</span> a<span class="operator">;<br />};</span><span class="keyword"><br /><br />class</span> B<span class="operator"><br />{</span><span class="type"><br /> int</span> b<span class="operator">;</span><span class="type"><br /> int</span> someFunc<span class="operator">(</span><span class="type">void</span><span class="operator">) {</span><span class="flow">return</span> b<span class="operator">;}<br />};</span><span class="keyword"><br /><br />class</span> C<span class="operator"><br />{</span><span class="type"><br /> void</span> someFunc1<span class="operator">(</span><span class="type">void</span><span class="operator">) {};</span><span class="type"><br /> void</span> someFunc2<span class="operator">(</span><span class="type">void</span><span class="operator">) {};<br />};</span><span class="keyword"><br /><br />class</span> D<span class="operator"> :</span><span class="keyword"> public</span> A<span class="operator"><br />{</span><span class="type"><br /> void</span> someFunc<span class="operator">(</span><span class="type">void</span><span class="operator">) {};<br />};</span><span class="type"><br /><br /><br />int</span><span class="keyword"> main</span><span class="operator">()<br />{</span><br /> cout<span class="operator"><<</span><span class="string">"Size of class A = "</span><span class="operator"><<</span><span class="keyword">sizeof</span><span class="operator">(</span>A<span class="operator">)<<</span>endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Size of class B = "</span><span class="operator"><<</span><span class="keyword">sizeof</span><span class="operator">(</span>B<span class="operator">)<<</span>endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Size of class C = "</span><span class="operator"><<</span><span class="keyword">sizeof</span><span class="operator">(</span>C<span class="operator">)<<</span>endl<span class="operator">;</span><br /> cout<span class="operator"><<</span><span class="string">"Size of class D = "</span><span class="operator"><<</span><span class="keyword">sizeof</span><span class="operator">(</span>D<span class="operator">)<<</span>endl<span class="operator">;<br />}</span><br /><br /></pre></div><br /></div><div>The output is as follows:</div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHBEkUqHK75zdYnH9PdBpGW2SHupO20nx8OdTFyefrwxMEEO5cQ9Z3CVwSFweUaA2HkvCWnHgaartcvcHulcRWKViVxA4VazeScux_XJ4V04SqSP5wP0ggl1SgEE28JzFsG_-l92U5E9Ue/s1600/zg_sizeof_class.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 317px; height: 181px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHBEkUqHK75zdYnH9PdBpGW2SHupO20nx8OdTFyefrwxMEEO5cQ9Z3CVwSFweUaA2HkvCWnHgaartcvcHulcRWKViVxA4VazeScux_XJ4V04SqSP5wP0ggl1SgEE28JzFsG_-l92U5E9Ue/s400/zg_sizeof_class.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5560933655112510882" /></a><br />After finishing this, I found this interesting article <a href="http://www.cprogramming.com/tutorial/size_of_class_object.html">here</a>.Zahid Ghadialyhttp://www.blogger.com/profile/11618208626682295272noreply@blogger.com0