<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>The Mystery of the Newb&#39;s for Loop.</title>
		<link>http://www.allegro.cc/forums/view/589991</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 12 Feb 2007 05:15:30 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Messing around yesterday, I decided to make my first &#39;game&#39; (essentially just a dot moved by the player to avoid other dots).  Anyways, I used a for loop to have it create and update new enemies whenever appropriate.</p><div class="source-code snippet"><div class="inner"><pre>            <span class="k1">if</span><span class="k2">(</span> iEnemy <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span> <span class="k2">)</span>   <span class="c">//Checks to see if it's time for enemies to exist.</span>
            <span class="k2">{</span>
                <span class="k1">for</span><span class="k2">(</span> iRe2 <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> iRe2 <span class="k3">=</span><span class="k3">=</span> n<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iRe2<span class="k2">)</span>  <span class="c">//Runs through all enemy coordinates.</span>
                <span class="k2">{</span>
                    <span class="k1">if</span><span class="k2">(</span> <a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a> <span class="k3">&gt;</span> iEnemyX<span class="k2">[</span>iRe2<span class="k2">]</span> <span class="k2">)</span> <span class="k3">+</span><span class="k3">+</span>iEnemyX<span class="k2">[</span>iRe2<span class="k2">]</span><span class="k2">;</span>
                    <span class="k1">if</span><span class="k2">(</span> <a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a> <span class="k3">&lt;</span> iEnemyX<span class="k2">[</span>iRe2<span class="k2">]</span> <span class="k2">)</span> <span class="k3">-</span><span class="k3">-</span>iEnemyX<span class="k2">[</span>iRe2<span class="k2">]</span><span class="k2">;</span>
                    <span class="k1">if</span><span class="k2">(</span> <a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a> <span class="k3">&gt;</span> iEnemyY<span class="k2">[</span>iRe2<span class="k2">]</span> <span class="k2">)</span> <span class="k3">+</span><span class="k3">+</span>iEnemyY<span class="k2">[</span>iRe2<span class="k2">]</span><span class="k2">;</span>
                    <span class="k1">if</span><span class="k2">(</span> <a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a> <span class="k3">&lt;</span> iEnemyY<span class="k2">[</span>iRe2<span class="k2">]</span> <span class="k2">)</span> <span class="k3">-</span><span class="k3">-</span>iEnemyY<span class="k2">[</span>iRe2<span class="k2">]</span><span class="k2">;</span>

                    <a href="http://www.allegro.cc/manual/circle" target="_blank"><span class="a">circle</span></a><span class="k2">(</span> buffer, iEnemyX<span class="k2">[</span>iRe2<span class="k2">]</span>, iEnemyY<span class="k2">[</span>iRe2<span class="k2">]</span>, <span class="n">5</span>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span> <span class="n">255</span>, <span class="n">0</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//Draws all enemies.</span>
                <span class="k2">}</span>
            <span class="k2">}</span>
</pre></div></div><p>

I know for a fact that the issue is with the for loop, and I can comment it out and everthing works fine. Once.</p><p>The integer &#39;n&#39; is increased whenever a new enemy should be added.  In my head, this loop should create and update enemies as necessary, but as it is (without commenting anything out ) it seems to keep anything from happening.  No enemies are created.</p><p>If anyone could help me out, that&#39;d be great.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Cerpin Taxt)</author>
		<pubDate>Sat, 10 Feb 2007 04:43:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The second term of for() is the required condition to run the body {}. As soon as it evaluates to false, the body is skipped and the program continues.</p><p>You probably want iRe2&lt;n or iRe2&lt;=n
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Sat, 10 Feb 2007 04:59:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well I feel dumb.  I thought it was the exit condition.</p><p>Works perfectly.  All thanks to the magic of basic knowledge.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Cerpin Taxt)</author>
		<pubDate>Sat, 10 Feb 2007 05:01:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, it&#39;s the &quot;positive&quot; condition to meet, so it&#39;s consistent with while()
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Sat, 10 Feb 2007 05:16:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve always hated &quot;for&quot; loops, they&#39;re just while loops with some inbuilt comfortable extra stuff... but then again, that&#39;s what it all is..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Sat, 10 Feb 2007 10:57:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" /></p><p>But for loops are amazing! They&#39;re like using <tt>switch()</tt> &amp;&amp; <tt>case</tt> rather than a bunch of if conditions.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Sat, 10 Feb 2007 11:36:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I believe it&#39;s a matter of taste <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Sun, 11 Feb 2007 01:36:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Guess so hehe
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Sun, 11 Feb 2007 01:39:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You don&#39;t really appreciate the comfort of C for loops until you&#39;ve had to use FORTRAN DO loops. Personally I&#39;ve lately become a big fan of Perl&#39;s foreach loop.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Sun, 11 Feb 2007 02:49:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Personally I&#39;ve lately become a big fan of Perl&#39;s foreach loop.
</p></div></div><p>And the &quot;foreach&quot; style is mostly dpereciated. the for loop does the same thing. one keyword, multiple syntaxes <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 11 Feb 2007 13:22:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You mean I can write &quot;for&quot; instead of &quot;foreach&quot;? I know, but I find &quot;foreach&quot; easier to read when I want a &quot;foreach&quot; loop. I don&#39;t mind typing the extra four characters at all, unlike Larry (according to my llama).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Sun, 11 Feb 2007 15:59:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Ceagon Xylas said:</div><div class="quote"><p>
But for loops are amazing! They&#39;re like using switch() &amp;&amp; case rather than a bunch of if conditions.
</p></div></div><p>

On the note of &quot;switch()&quot; statements, I learned in my class that they can actually be more optimized than a bunch of if..then()&#39;s!</p><p>Using gcc/g++, if you look at (and understand) the disassembled code for your program, it actually tweaks your code to use a lookup table if you have a lot of case... conditions:</p><p>Example 1
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">int</span> switch_example<span class="k2">(</span><span class="k1">int</span> x<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>  <span class="k1">int</span> result <span class="k3">=</span> x<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  </td></tr><tr><td class="number">5</td><td>  <span class="k1">switch</span><span class="k2">(</span>x<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>    <span class="k1">case</span> <span class="n">100</span><span class="k2">:</span></td></tr><tr><td class="number">8</td><td>      result <span class="k3">*</span><span class="k3">=</span> <span class="n">13</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>    <span class="k1">case</span> <span class="n">102</span><span class="k2">:</span></td></tr><tr><td class="number">12</td><td>      result <span class="k3">*</span><span class="k3">=</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>      <span class="c">/* Fall through */</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>    <span class="k1">case</span> <span class="n">103</span><span class="k2">:</span></td></tr><tr><td class="number">16</td><td>      result <span class="k3">+</span><span class="k3">=</span> <span class="n">11</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>    <span class="k1">case</span> <span class="n">104</span><span class="k2">:</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">case</span> <span class="n">106</span><span class="k2">:</span></td></tr><tr><td class="number">21</td><td>      result <span class="k3">*</span><span class="k3">=</span> result<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>    default:</td></tr><tr><td class="number">25</td><td>      result <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">27</td><td>  <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">28</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

...gets translated into...
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">/* Next line is not legal C */</span></td></tr><tr><td class="number">2</td><td>code <span class="k3">*</span>jumpTable<span class="k2">[</span><span class="n">7</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  loc_A, loc_def, loc_B, loc_C,</td></tr><tr><td class="number">4</td><td>  loc_D, loc_def, loc_D</td></tr><tr><td class="number">5</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">int</span> switch_example_implicit<span class="k2">(</span><span class="k1">int</span> x<span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">unsigned</span> temp <span class="k3">=</span> x <span class="k3">-</span> <span class="n">100</span><span class="k2">;</span>     <span class="c">// &lt;-- The 'unsigned' is an important factor here</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">int</span> result <span class="k3">=</span> x<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>  <span class="k1">if</span> <span class="k2">(</span>temp <span class="k3">&gt;</span> <span class="n">6</span><span class="k2">)</span></td></tr><tr><td class="number">13</td><td>    <span class="k1">goto</span> loc_def<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>  <span class="c">/* This goto is not local C */</span></td></tr><tr><td class="number">16</td><td>  <span class="k1">goto</span> jumpTable<span class="k2">[</span>temp<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  loc_A:  <span class="c">/* case 100 */</span></td></tr><tr><td class="number">19</td><td>    result <span class="k3">*</span><span class="k3">=</span> <span class="n">13</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">goto</span> done<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>  loc_B:  <span class="c">/* case 102 */</span></td></tr><tr><td class="number">23</td><td>    result <span class="k3">*</span><span class="k3">=</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <span class="c">/* Fall through */</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>  loc_C:  <span class="c">/* case 103 */</span></td></tr><tr><td class="number">27</td><td>    result <span class="k3">+</span><span class="k3">=</span> <span class="n">11</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    <span class="k1">goto</span> done<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>  loc_D:  <span class="c">/* cases 104, 106 */</span></td></tr><tr><td class="number">31</td><td>    result <span class="k3">*</span><span class="k3">=</span> result<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    <span class="k1">goto</span> done<span class="k2">;</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td>  loc_def:</td></tr><tr><td class="number">35</td><td>    result <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>  done:</td></tr><tr><td class="number">38</td><td>    <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">39</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

EDIT: Understand, that this isn&#39;t assembly that you&#39;re looking at, but rather a pseudo-code written in a &quot;kinda&quot; C format so those of a.cc who don&#39;t natively speak ASM could figure out what&#39;s going on. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>So if you put in a number &lt; 100, it overflows (underflows?) to become a very large value, which is &gt; 6 (which is how many &quot;case:&quot; statements you have in your code).  Also, notice that since there is no &quot;101&quot; or &quot;105&quot;, they are still accounted-for in the &quot;jumpTable&quot; (by putting in locations of &quot;loc_def&quot; -- which is at the end of the switch() statement).  It&#39;s that &quot;default:&quot; that turns everything else into &quot;result = 0&quot;, so that&#39;s where it jumps to.</p><p>Anyway, that&#39;s just something I picked up from one of these courses I&#39;m taking.  As I understand it, unless you only have one or two &quot;...else if...&quot;s in your code, a switch statement is more optimal to have.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (TeamTerradactyl)</author>
		<pubDate>Mon, 12 Feb 2007 00:27:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you use &amp;&amp;label in the jumptable, and <i>goto **table[index];</i>, it should work in GCC. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Mon, 12 Feb 2007 01:15:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I thought computed goto was a DJGPPism? great anyway.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Mon, 12 Feb 2007 05:15:30 +0000</pubDate>
	</item>
</rss>
