<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Generic programming (not really Allegro related)</title>
		<link>http://www.allegro.cc/forums/view/588169</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 24 Oct 2006 01:51:04 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In these attachments, I have a very simple program that simply takes command-line arguments and checks whether or not they are valid filenames.</p><p>It seems to work well, the debugger didn&#39;t report any SEGFAULTS, etc.  The only problem I have is when I pass &quot;invalid&quot; filenames to the program: it &quot;forgets&quot; the next &quot;valid&quot; filename(s).</p><p>Example:</p><p>program.exe file1 file2 file3 file4</p><p>file[134] exist, while &#39;file2&#39; does not.</p><p>My output SHOULD be:
</p><pre>Valid filenames found:
  file1
  file3
  file4</pre><p>

Instead, output is:
</p><pre>Valid filenames found:
  file1
  file4</pre><p>

Any idea why &#39;file3&#39; is not showing up after &#39;file2&#39; is NOT found?</p><p>Thanks for any ideas!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (TeamTerradactyl)</author>
		<pubDate>Sun, 22 Oct 2006 10:09:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><tt>Filename &amp;operator=</tt> is missing a <tt>return *this;</tt> statement.</p><p>Other than that, are you not allowed to use <tt>std::vector</tt> or <tt>std::list</tt>? Probably <tt>std::set</tt> would make even more sense, unless of course the order is important.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Indeterminatus)</author>
		<pubDate>Sun, 22 Oct 2006 15:58:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I added &lt;b&gt;return <b>this;</b> to the <b>&amp;operator=</b> as follows, but it did not seem to help:</p><div class="source-code snippet"><div class="inner"><pre>Filename <span class="k3">&amp;</span>Filename::operator<span class="k3">=</span><span class="k2">(</span><span class="k1">const</span> Filename <span class="k3">&amp;</span>orig<span class="k2">)</span>
<span class="k2">{</span>
   numFiles <span class="k3">=</span> orig.numFiles<span class="k2">;</span>
   array <span class="k3">=</span> <span class="k1">new</span> string<span class="k2">[</span>numFiles<span class="k2">]</span><span class="k2">;</span>
   
   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> curFilename <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> curFilename <span class="k3">&lt;</span> numFiles<span class="k2">;</span> curFilename<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
   <span class="k2">{</span>
      array<span class="k2">[</span>curFilename<span class="k2">]</span> <span class="k3">=</span> orig.array<span class="k2">[</span>curFilename<span class="k2">]</span><span class="k2">;</span>
   <span class="k2">}</span>
   
   <span class="k1">return</span> <span class="k3">*</span><span class="k1">this</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

I&#39;m thinking that the problem has to be lying within the &#39;filename.cpp&#39; instead of the &#39;filename.h&#39; file: The insertion and removal SEEMS to be working okay, but the &quot;checking whether file is valid&quot; loop would be where my guess is.</p><p>Instead of using </p><div class="source-code snippet"><div class="inner"><pre>ifstream fin<span class="k2">;</span>
fin.open<span class="k2">(</span>...<span class="k2">)</span><span class="k2">;</span>
<span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>fin <span class="k3">|</span><span class="k3">|</span> fin.fail<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="k2">{</span>
   ...
<span class="k2">}</span>
fin.close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p> I wouldn&#39;t mind using &quot;exist()&quot; (or is it &quot;exists()&quot; with an <b>s</b>?), but can&#39;t remember which library I need to include :-).</p><p>Indeterminatus: No real reason why I&#39;m avoiding std::<i>stuff</i> other than the fact that I just want to make sure I&#39;m understanding everything.  (Better to reinvent the wheel so I can learn in the process, right?)</p><p>Thanks for your feedback; you were right about forgetting to return that value.</p><p>Does anyone have any ideas why this is skipping those files?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (TeamTerradactyl)</author>
		<pubDate>Mon, 23 Oct 2006 09:09:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The problem is your usage of ifstream. </p><p>This works: 
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>Filename checkValidFilenames<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   Filename validFiles<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>   ifstream fin<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> currentFile <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> currentFile <span class="k3">&lt;</span> argc<span class="k2">;</span> currentFile<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">7</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">8</td><td>      fin.open<span class="k2">(</span>argv<span class="k2">[</span>currentFile<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>      <span class="k1">if</span> <span class="k2">(</span>fin.fail<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">12</td><td><span class="c">//         fin.ignore();</span></td></tr><tr><td class="number">13</td><td>         fin.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>      <span class="k1">else</span></td></tr><tr><td class="number">16</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">17</td><td>        validFiles.insert<span class="k2">(</span>argv<span class="k2">[</span>currentFile<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>        fin.close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">20</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>   </td></tr><tr><td class="number">22</td><td>   <span class="k1">return</span> validFiles<span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
Seems that the ifstream doesn&#39;t open a file correctly if closed after the failed open, or when ignore has been used. </p><p>Would be even better this way: 
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>Filename checkValidFilenames<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   Filename validFiles<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> currentFile <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> currentFile <span class="k3">&lt;</span> argc<span class="k2">;</span> currentFile<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>      ifstream fin<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>      fin.open<span class="k2">(</span>argv<span class="k2">[</span>currentFile<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>fin.fail<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>        validFiles.insert<span class="k2">(</span>argv<span class="k2">[</span>currentFile<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>        fin.close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>   </td></tr><tr><td class="number">17</td><td>   <span class="k1">return</span> validFiles<span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
ifstream.open just uses fopen inside (implementation dependent of course), so it might be more efficient to use fopen directly. </p><p>Another remark: Your Filename leaks memory. Look at operator=(). And, all the reallocation of memory is REALLY inefficient. Not that it matters with that tiny application, but handling memory like this can slow down your app to a halt.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (tobing)</author>
		<pubDate>Mon, 23 Oct 2006 12:05:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think I found the problem with the missing &quot;if file is valid&quot;:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>StringArray checkValidFilenames<span class="k2">(</span><span class="k1">const</span> <span class="k1">int</span> <span class="k3">&amp;</span>argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   StringArray validFiles<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>   ifstream fin<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> currentFile <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> currentFile <span class="k3">&lt;</span> argc<span class="k2">;</span> currentFile<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">7</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">8</td><td>      fin.open<span class="k2">(</span>argv<span class="k2">[</span>currentFile<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>      <span class="k1">if</span> <span class="k2">(</span>fin.is_open<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td>         validFiles.insert<span class="k2">(</span>argv<span class="k2">[</span>currentFile<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>      fin.close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>   <span class="k1">return</span> validFiles<span class="k2">;</span></td></tr><tr><td class="number">17</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Thanks for your feedback on that.</p><p>As far as the memory leak, tobing, I&#39;ll take a look at it.  I&#39;m not very good at assignment operators yet, so thanks for showing where the problem lies.</p><p>-TT
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (TeamTerradactyl)</author>
		<pubDate>Tue, 24 Oct 2006 01:51:04 +0000</pubDate>
	</item>
</rss>
