<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Bitmap pointer array + randomiser</title>
		<link>http://www.allegro.cc/forums/view/558930</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 12 Jan 2006 20:39:50 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi all,<br />I&#39;m working in Dev-C++ using C. I&#39;ve got a problem with my array of Bitmap pointers. They are pointing to different bitmap images loaded through datafiles. I&#39;ve got a function that randomises which pointer array element is pointing to which bitmap image, and its randomising fine with proper results. However, this is causing my program to crash at unload_datafile(data). Any idea why? Partial code below:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>face<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">2</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>mouth<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>eye<span class="k2">[</span><span class="n">3</span><span class="k2">]</span><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">void</span> randomize_elements<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span><span class="k3">*</span>ptr_in, <span class="k1">int</span> array_len<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>temp_ptr<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>    <span class="k1">int</span> rand1, rand2<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">int</span> i <span class="k3">=</span> array_len<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    </td></tr><tr><td class="number">10</td><td>    <span class="k1">while</span> <span class="k2">(</span>i<span class="k2">)</span>   <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>        rand1 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%array_len<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>        rand2 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%array_len<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>        temp_ptr <span class="k3">=</span> ptr_in<span class="k2">[</span>rand1<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>        ptr_in<span class="k2">[</span>rand1<span class="k2">]</span> <span class="k3">=</span> ptr_in<span class="k2">[</span>rand2<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>        ptr_in<span class="k2">[</span>rand2<span class="k2">]</span> <span class="k3">=</span> temp_ptr<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>        i--<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="c">// in main function:</span></td></tr><tr><td class="number">21</td><td>    data <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_datafile" target="_blank"><span class="a">load_datafile</span></a><span class="k2">(</span><span class="s">"data.dat"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    face<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_face<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    mouth<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_mouth_0<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    mouth<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_mouth_1<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    mouth<span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_mouth_2<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    mouth<span class="k2">[</span><span class="n">3</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_mouth_3<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>    eye<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_eye_0<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    eye<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_eye_1<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>    eye<span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_eye_2<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>    <span class="k1">for</span> <span class="k2">(</span>n<span class="k3">=</span><span class="n">1</span><span class="k2">;</span> n<span class="k3">&lt;</span><span class="n">5</span><span class="k2">;</span> n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>    <span class="k2">{</span></td></tr><tr><td class="number">32</td><td>        face<span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span>FACE_SIZE, FACE_SIZE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>        <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>face<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, face<span class="k2">[</span>n<span class="k2">]</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, FACE_SIZE, FACE_SIZE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">35</td><td>    </td></tr><tr><td class="number">36</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>face<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, GREENCOL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>face<span class="k2">[</span><span class="n">2</span><span class="k2">]</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, BLUECOL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>face<span class="k2">[</span><span class="n">3</span><span class="k2">]</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, REDCOL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>face<span class="k2">[</span><span class="n">4</span><span class="k2">]</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, FACE_SIZE<span class="k3">/</span><span class="n">2</span>, YELLOWCOL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>    randomize_elements<span class="k2">(</span>face, <span class="n">5</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    randomize_elements<span class="k2">(</span>mouth, <span class="n">4</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>    randomize_elements<span class="k2">(</span>eye, <span class="n">3</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>&#160;</td></tr><tr><td class="number">45</td><td>    <a href="http://www.allegro.cc/manual/unload_datafile" target="_blank"><span class="a">unload_datafile</span></a><span class="k2">(</span>data<span class="k2">)</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ju-Han Soon)</author>
		<pubDate>Wed, 11 Jan 2006 13:19:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Dunno.  Perhaps you should try commenting out things until it stops crashing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Wed, 11 Jan 2006 14:41:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>First of all, you ought to view if <i>data</i>&#39;s NULL; I would even do a cast in:</p><div class="source-code snippet"><div class="inner"><pre> face<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span><span class="k2">)</span> data<span class="k2">[</span>D_face<span class="k2">]</span>.dat
 ...
</pre></div></div><p>
To ensure it makes a good conversion.</p><p>However I think here&#39;s the problem: although Allegro stores every datum in dynamic memory, you should not move his pointers as you&#39;re doing in:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td> face<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_face<span class="k2">]</span>.dat<span class="k2">;</span>      </td></tr><tr><td class="number">2</td><td> mouth<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_mouth_0<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">3</td><td> ...</td></tr><tr><td class="number">4</td><td> eye<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> data<span class="k2">[</span>D_eye_0<span class="k2">]</span>.dat<span class="k2">;</span></td></tr><tr><td class="number">5</td><td> ...</td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td> <span class="c">// Now they point to somewhere of data, except face[1],</span></td></tr><tr><td class="number">8</td><td> <span class="c">// face[2], ...,face[4], which have their own memory. Then, in</span></td></tr><tr><td class="number">9</td><td> <span class="c">// randomize_elements(), you assign pointers reffered to data space.</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td> <span class="k1">void</span> randomize_elements<span class="k2">(</span>...<span class="k2">)</span></td></tr><tr><td class="number">12</td><td> <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>  <span class="k1">while</span> <span class="k2">(</span>i<span class="k2">)</span>   <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>        ...</td></tr><tr><td class="number">15</td><td>        temp_ptr <span class="k3">=</span> ptr_in<span class="k2">[</span>rand1<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>        ptr_in<span class="k2">[</span>rand1<span class="k2">]</span> <span class="k3">=</span> ptr_in<span class="k2">[</span>rand2<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>        ptr_in<span class="k2">[</span>rand2<span class="k2">]</span> <span class="k3">=</span> temp_ptr<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">19</td><td> <span class="k2">}</span></td></tr></tbody></table></div></div><p>

 Maybe Allegro crashes because some faces[...] will point out of his datafile. I recommend you to load ALL data into your own memory; that has never failed me
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Maikol)</author>
		<pubDate>Wed, 11 Jan 2006 16:38:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
First of all, you ought to view if data&#39;s NULL; I would even do a cast in:</p><p> face[0] = (BITMAP *) data[D_face].dat<br /> ...</p><p>To ensure it makes a good conversion.
</p></div></div><p>
Double checking the type is probably a good idea, but a cast like that is strictly a static, compile time thing - the only thing it could effect is compile time errors or warnings.  To double-check the validity of those pointers, you need to check (data[whatever].type == DAT_BITMAP) instead.  </p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
However I think here&#39;s the problem: although Allegro stores every datum in dynamic memory, you should not move his pointers as you&#39;re doing in:<br /><b>snip</b><br />Maybe Allegro crashes because some faces[...] will point out of his datafile. I recommend you to load ALL data into your own memory; that has never failed me
</p></div></div><p>
There are potential issues with the datafiles allocations yes, but in the code he showed, he never modifies anything that came out of a data file, only pointers at them.  Unless I&#39;m missing something.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Wed, 11 Jan 2006 17:20:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Does it really crash at unload_datafile or perhaps at some point later, when you try to access any of face,mouth,eye?<br />(that would be nothing unusual then, because after unload_datafile all pointers in face,mouth,eye would just point to any memory garbage)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dennis)</author>
		<pubDate>Wed, 11 Jan 2006 19:18:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My workaround solution would be to load a single bitmap that has all the face, mouth and eye as tiles and grab them. That should turn out good. But its just stumping to have a problem like this with a simple construct but yet seems buggy.</p><p>And unload_datafile is the 2nd last command in my main(), before set_gfx_mode(GFX_TEXT...)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ju-Han Soon)</author>
		<pubDate>Wed, 11 Jan 2006 20:52:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It really is simple enough that commenting out pieces ought to be informative.  Does it crash with just load/unload datafile?  Perhaps you could upload enough to compile and run?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Thu, 12 Jan 2006 05:04:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The reason I know that its the randomizer function thats causing problems is that commenting it out solves my problem.</p><p>Right now, I&#39;m loading the pictures into memory and removing the datafile. All is well.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ju-Han Soon)</author>
		<pubDate>Thu, 12 Jan 2006 20:39:50 +0000</pubDate>
	</item>
</rss>
