<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>al_destroy_bitmap() crashes when called</title>
		<link>http://www.allegro.cc/forums/view/612930</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 10 Jul 2013 22:20:12 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello.</p><p>In my Player class, when the destructor is called to destroy its bitmap, it causes the game to become unresponsive and ultimately crash.</p><p><b>player.hpp</b>
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef PLAYER_HPP</span>
<span class="number">  2</span><span class="p">#define PLAYER_HPP</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  5</span><span class="p">#include &lt;fstream&gt;</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  8</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">class</span> Player <span class="k2">{</span>
<span class="number"> 13</span>
<span class="number"> 14</span>   private:
<span class="number"> 15</span>   
<span class="number"> 16</span>      <span class="k1">int</span> height<span class="k2">;</span>
<span class="number"> 17</span>      <span class="k1">int</span> width<span class="k2">;</span>
<span class="number"> 18</span>      <span class="k1">int</span> dir_x<span class="k2">;</span>
<span class="number"> 19</span>      <span class="k1">int</span> dir_y<span class="k2">;</span>
<span class="number"> 20</span>      <span class="k1">int</span> speed<span class="k2">;</span>
<span class="number"> 21</span>      <span class="k1">int</span> ticks<span class="k2">;</span>
<span class="number"> 22</span>      
<span class="number"> 23</span>      <span class="k1">bool</span> up<span class="k2">;</span>
<span class="number"> 24</span>      <span class="k1">bool</span> down<span class="k2">;</span>
<span class="number"> 25</span>      <span class="k1">bool</span> left<span class="k2">;</span>
<span class="number"> 26</span>      <span class="k1">bool</span> right<span class="k2">;</span>
<span class="number"> 27</span>      
<span class="number"> 28</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>player_bitmap<span class="k2">;</span>
<span class="number"> 29</span>      
<span class="number"> 30</span>   public:
<span class="number"> 31</span>   
<span class="number"> 32</span>      <span class="k1">int</span> x<span class="k2">;</span>
<span class="number"> 33</span>      <span class="k1">int</span> y<span class="k2">;</span>
<span class="number"> 34</span>      <span class="k1">int</span> points<span class="k2">;</span>
<span class="number"> 35</span>   
<span class="number"> 36</span>      Player<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>      ~Player<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>      
<span class="number"> 39</span>      <span class="k1">void</span> init<span class="k2">(</span><span class="k1">int</span> screen_width, <span class="k1">int</span> screen_height<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>      <span class="k1">void</span> update<span class="k2">(</span><span class="k1">bool</span> move_up, <span class="k1">bool</span> move_down, <span class="k1">bool</span> move_left, <span class="k1">bool</span> move_right<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>      <span class="k1">void</span> draw<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>      <span class="k1">void</span> move<span class="k2">(</span><span class="k1">bool</span> move_up, <span class="k1">bool</span> move_down, <span class="k1">bool</span> move_left, <span class="k1">bool</span> move_right<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>      <span class="k1">void</span> collision<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>      <span class="k1">void</span> act_as_solid<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>      <span class="k1">void</span> slow_down<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span>      
<span class="number"> 47</span>      <span class="k1">bool</span> collided<span class="k2">(</span><span class="k1">float</span> a_x, <span class="k1">float</span> a_y, <span class="k1">float</span> b_x, <span class="k1">float</span> b_y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 49</span>
<span class="number"> 50</span><span class="p">#endif</span>
</div></div><p>

<b>player.cpp (the parts that matter)</b>
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include "player.hpp"</span>
<span class="number">  2</span><span class="p">#include "potato.hpp"</span>
<span class="number">  3</span><span class="p">#include "map.hpp"</span>
<span class="number">  4</span><span class="p">#include "box.hpp"</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">const</span> <span class="k1">int</span> number_of_potatoes  <span class="k3">=</span> <span class="n">25</span><span class="k2">;</span>
<span class="number">  7</span><span class="k1">const</span> <span class="k1">int</span> number_of_boxes     <span class="k3">=</span> <span class="n">30</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="c">// Objects</span>
<span class="number"> 10</span>Potato Potato<span class="k2">[</span>number_of_potatoes<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 11</span>Map Map<span class="k2">;</span>
<span class="number"> 12</span>Box Box<span class="k2">[</span>number_of_boxes<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>Player::Player<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 15</span>
<span class="number"> 16</span>   <span class="c">// Establish base values</span>
<span class="number"> 17</span>   
<span class="number"> 18</span>   x              <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 19</span>   y              <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 20</span>   height         <span class="k3">=</span> <span class="n">36</span><span class="k2">;</span>
<span class="number"> 21</span>   width          <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number"> 22</span>   dir_x          <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 23</span>   dir_y          <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 24</span>   speed          <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 25</span>   points         <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 26</span>   ticks          <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 27</span>   
<span class="number"> 28</span>   up             <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 29</span>   down           <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 30</span>   left           <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 31</span>   right          <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 32</span>   
<span class="number"> 33</span>   player_bitmap  <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 34</span><span class="k2">}</span>
<span class="number"> 35</span>
<span class="number"> 36</span>Player::~Player<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 37</span>
<span class="number"> 38</span>   <span class="c">// Deallocate player resources</span>
<span class="number"> 39</span>   <span class="c">//al_destroy_bitmap(player_bitmap); // Crashes game</span>
<span class="number"> 40</span><span class="k2">}</span>
<span class="number"> 41</span>
<span class="number"> 42</span><span class="k1">void</span> Player::init<span class="k2">(</span><span class="k1">int</span> screen_width, <span class="k1">int</span> screen_height<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 43</span>
<span class="number"> 44</span>   <span class="c">// Give the player a bitmap</span>
<span class="number"> 45</span>   player_bitmap <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"gfx/player.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span>   
<span class="number"> 47</span>   <span class="c">// Spawn at center of screen</span>
<span class="number"> 48</span>   x <span class="k3">=</span> screen_width <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 49</span>   y <span class="k3">=</span> screen_height <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 50</span>   
<span class="number"> 51</span>   <span class="c">// Initialize the map</span>
<span class="number"> 52</span>   Map.init<span class="k2">(</span><span class="s">"txt/map.txt"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>   
<span class="number"> 54</span>   <span class="c">// Initialize potatoes</span>
<span class="number"> 55</span>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> number_of_potatoes<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> Potato<span class="k2">[</span>i<span class="k2">]</span>.init<span class="k2">(</span>screen_width, screen_height<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>   
<span class="number"> 57</span>   <span class="c">// Initialize boxes</span>
<span class="number"> 58</span>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> number_of_boxes<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> Box<span class="k2">[</span>i<span class="k2">]</span>.init<span class="k2">(</span>screen_width, screen_height<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span><span class="k2">}</span>
</div></div><p>

For the time being, I have the destructor code commented out, to avoid crashing, but this potentially leads to memory leaks. <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /> My Player object is defined in main() and is initialized with Player.init(480, 360) (duh). I&#39;m not sure why this causes a crash. Any ideas?</p><p>I appreciate your feedback. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Fri, 05 Jul 2013 01:25:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Your player destructor will be called just before main returns.<br />You might possibly already have freed everything allegro related by then. Since you haven&#39;t posted your main function, I can merely make assumptions here.</p><p>Possible solutions are, create a destroy method, which might fit in your design, as you already use an init method; use new and delete; run the game (and create the player) in a different method; use a code block to limit the scope of your player.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>
<span class="number">  2</span><span class="k1">int</span> main<span class="k2">(</span>...<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  3</span>   <span class="c">// init allegro</span>
<span class="number">  4</span>   runGame<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>   <span class="c">// free allegro</span>
<span class="number">  6</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  7</span><span class="k2">}</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">or</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">int</span> main<span class="k2">(</span>...<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>   <span class="c">// init allegro</span>
<span class="number"> 13</span>   <span class="k2">{</span>
<span class="number"> 14</span>       Player player<span class="k2">;</span>
<span class="number"> 15</span>       ...
<span class="number"> 16</span>   <span class="k2">}</span> <span class="c">// player gets destroyed here</span>
<span class="number"> 17</span>   <span class="c">// free allegro</span>
<span class="number"> 18</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 19</span><span class="k2">}</span>
<span class="number"> 20</span>
<span class="number"> 21</span><span class="k1">or</span> ...
</div></div><p>


Also</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> Player::init<span class="k2">(</span><span class="k1">int</span> screen_width, <span class="k1">int</span> screen_height<span class="k2">)</span> <span class="k2">{</span>
   ...
   
   Map.init<span class="k2">(</span><span class="s">"txt/map.txt"</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> number_of_potatoes<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> Potato<span class="k2">[</span>i<span class="k2">]</span>.init<span class="k2">(</span>screen_width, screen_height<span class="k2">)</span><span class="k2">;</span>
   ...
<span class="k2">}</span>
</pre></div></div><p>

Very bad design, the player should not initialize the map or other game objects.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (l j)</author>
		<pubDate>Fri, 05 Jul 2013 05:05:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should post your main().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (torhu)</author>
		<pubDate>Fri, 05 Jul 2013 06:23:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, show us your whole program. No doubt, it will be a beautiful demonstration of the fact that C++&#39;s RAII idiom doesn&#39;t work in the general case. :p
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Fri, 05 Jul 2013 10:11:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey guys, thanks for the feedback--it is much appreciated! <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></p><p>Taron, I took your advice and incorporated a custom destructor function for my Player object, and called upon it once main was ready to die; it worked like a charm! Also, you mentioned my poor design choice; this I know, but was done on the fly so it&#39;s not too bad for just testing things. What would you suggest in the future? Should I define the objects in main next time and do their functions there?</p><p>Torhu and Beoran, thanks for your interest in my endeavors as well; I don&#39;t think I need to post my main anymore, as the above worked.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Fri, 05 Jul 2013 11:29:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You don&#39;t need to destroy or free anything before exiting, it&#39;s taken care of by Allegro and the operating system.  <span class="source-code"><a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a></span> gets called automatically after main returns, see <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_52.html" target="_blank">atexit</a></span>. When the process is done, any allocated memory, open files, etc. still left will be cleaned up by the OS.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (torhu)</author>
		<pubDate>Fri, 05 Jul 2013 12:47:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="https://www.allegro.cc/forums/thread/612930/986576#target">torhu</a> said:</div><div class="quote"><p>You don&#39;t need to destroy or free anything before exiting, it&#39;s taken care of by Allegro and the operating system.  al_uninstall_system gets called automatically after main returns, see atexit. When the process is done, any allocated memory, open files, etc. still left will be cleaned up by the OS.</p></div></div><p>

Interesting! I had always utilized <i>al_destroy_x</i> to deallocate things, because I thought that it would otherwise lead to memory leaks. This is great to know then! Now, what would happen in the event that the game crashes prior to a clean shut-down; would it result in memory issues then? Thanks for the input!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Fri, 05 Jul 2013 20:33:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, if a process crashes, modern operating systems will completely free all the memory the process requested.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (l j)</author>
		<pubDate>Fri, 05 Jul 2013 20:40:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;d like to note though that if you&#39;re using a memory checking tool, such as valgrind, that will complain if you don&#39;t deallocate your memory on exit manually. But yes, it&#39;s not strictly required since the OS takes care of that. </p><p>You still need to free the memory of anything that doesn&#39;t stay allocated for the whole time the program runs.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Fri, 05 Jul 2013 20:54:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just to make sure, the problem that was happening with the OP is the lack of rule of three, correct? C++ requires classes to have a... -- let&#39;s see if I still remember -- a default constructor, a copy constructor, and a destructor. ...Otherwise, destructors are just called when an instance is created. I&#39;m still not sure what that thing is all about, but oh well.</p><p>As for the design choices taron mention, pretty sure it was just about the fact that the map creation should be independent from the player creation. For your game, it probably doesn&#39;t matter, as you probably can&#39;t have the map without a player, but it&#39;s certainly not the most logical design choice.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (André Silva)</author>
		<pubDate>Sat, 06 Jul 2013 16:58:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No the problem is that because of RAII, his destructor was most likely called AFTER allegro had been shut down, hence the unloading failed. That&#39;s what I ment with RAII being useless in the general case. </p><p>In this case you need to implement a custom destroy() method anyway, since RAII doesn&#39;t give you much control over when the destructor will be called exactly, since C++ arranges for it to be called behind your back. </p><p>Or you need to do as taron said and add a block around the usage of the object that uses the RAII destructor to force the compiler from calling the destructor sooner rather than at the end of the program / function...</p><p>Things like these are why I don&#39;t think C++ is to an improvement over C. I&#39;d rather call `{Player player = player_new() ; /* ... */ ; player_free(player); }` at the right time and place and be done with it, rather than having to remember the 13 pitfalls of RAII.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sat, 06 Jul 2013 18:44:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>atexit runs after main exits (and therefore, after objects local to main get destroyed) but before global destructors run, hence the problem. Allegro was shut down by the time al_destroy_bitmap was called.</p><p>Solution : Make player a global pointer and new it when you enter main and delete it before you leave main. This way your object is still global (if you really need it to be, which you don&#39;t). Or make player local to main.</p><p>And your player class looks more like a game class, since it contains game or world objects.</p><p>And there are only 3 times when a destructor is called. When a block goes out of scope. When you call delete. Or when global destructors run after atexit.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 06 Jul 2013 21:54:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edgar Reynaldo,</p><p>Sure, but if you use a pointer together with  new/delete, you are not using the famous C++  RAII idiom anymore. Which is exactly the point I was making: RAII isn&#39;t useful in he general case. What you suggest is equivalent to malloc()/free(),  or wrapped versions of them, in C. </p><p>Why not use C then and save yourself the complexity? C isn&#39;t going to coddle you, but it just means that we have to remember one rule: &quot;close every resource you open and free all memory you allocate&quot; in stead of 37 rules in C++ like &quot;destructors are called when...&quot; , &quot;rule of three...&quot;, &quot;don&#39;t raise exceptions in...&quot;, etc...  . As long as you&#39;re clear about the ownership policies of the resources, it&#39;s as easy as opening a door, going through it, and then remembering to close the door behind you. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 07 Jul 2013 02:26:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If both Allegro and the operating system purges resources upon shutdown, what purpose then would Allegro&#39;s <span class="source-code"><a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a></span> function offer? Considering how the system handles it for you, it seems to reason that the function itself is moot in the eyes of the programmer. No? Better yet, in what instance <i>would</i> it be a good idea to use the function? </p><h5>This new information has perplexed me as to why the function exists to you and I <i>if</i> the system manages deletion for you. <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></h5><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Sun, 07 Jul 2013 02:33:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you had a utility to view bitmaps, then each additional viewed bitmap would take up more memory and eventually you&#39;d run out.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Sun, 07 Jul 2013 02:36:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="https://www.allegro.cc/forums/thread/612930/986736#target">Arthur Kalliokoski</a> said:</div><div class="quote"><p>If you had a utility to view bitmaps, then each additional viewed bitmap would take up more memory and eventually you&#39;d run out.</p></div></div><p>

Could you elaborate on that a bit more? What exactly do you mean by &quot;<i>utility</i>&quot; (that&#39;s fairly ambiguous in my books, sorry.) <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Sun, 07 Jul 2013 02:44:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I just meant if your program loads lots of bitmaps, and doesn&#39;t need them for the entire run of the program, it should release the ones that aren&#39;t needed any more to free up memory for the next ones.  Memory leak.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Sun, 07 Jul 2013 02:46:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Shegoth, </p><p>The operating system does not &quot;manage&quot; the memory for you. The operating system just notices that your program hasn&#39;t deallocated memory or released certain resources when it exits and goes &quot;GRRRR! another badly written program that didn&#39;t clean up after itself! I&#39;ll better take care of that or other programs will be affected by it!&quot; And then the OS deallocates all that left-over memory and releases the resources that program uses. </p><p>While the program is running, you are responsible for releasing resources and memory. In C, this is done manually. In C++, there are destructors that may or may not help you to do this behind your back. </p><p>For example, suppose you have a level background that gets loaded every time the level changes. </p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> background <span class="k3">=</span> NULL<span class="k2">;</span>

<span class="k1">bool</span> background_load<span class="k2">(</span><span class="k1">int</span> level<span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">char</span> background_name<span class="k2">[</span><span class="n">100</span><span class="k2">]</span><span class="k2">;</span>
   <a href="http://www.delorie.com/djgpp/doc/libc/libc_737.html" target="_blank">sprintf</a><span class="k2">(</span>background_name, <span class="s">"background_%d.png"</span>, level<span class="k2">)</span><span class="k2">;</span>
   background <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span>background_name<span class="k2">)</span><span class="k2">;</span>
   <span class="k1">return</span> <span class="k2">(</span>background <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

The function background_load above has a memory leak. When you load the background, the reference to allocated memory you had in background  is lost and overwritten, without freeing it. </p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> background_load<span class="k2">(</span><span class="k1">int</span> level<span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">char</span> background_name<span class="k2">[</span><span class="n">100</span><span class="k2">]</span><span class="k2">;</span>
   <a href="http://www.delorie.com/djgpp/doc/libc/libc_737.html" target="_blank">sprintf</a><span class="k2">(</span>background_name, <span class="s">"background_%d.png"</span>, level<span class="k2">)</span><span class="k2">;</span>
   <span class="k1">if</span> <span class="k2">(</span>background<span class="k2">)</span> <span class="k2">{</span> 
     <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>background<span class="k2">)</span><span class="k2">;</span>
     background <span class="k3">=</span> NULL<span class="k2">;</span>  
   <span class="k2">}</span>
   background <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span>background_name<span class="k2">)</span><span class="k2">;</span>
   <span class="k1">return</span> <span class="k2">(</span>background <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

This is already a bit better. Now, the old background will be freed, and the memory it used released, before the new background is loaded. </p><p>Open the door, go though it, and close it again. Load the resource, use it and then destroy it. It&#39;s as simple as that. </p><p>Edit: I forgot two ; in the return statements.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 07 Jul 2013 02:50:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="https://www.allegro.cc/forums/thread/612930/986738#target">Arthur Kalliokoski</a> said:</div><div class="quote"><p>I just meant if your program loads lots of bitmaps, and doesn&#39;t need them for the entire run of the program, it should release the ones that aren&#39;t needed any more to free up memory for the next ones. Memory leak.</p></div></div><p>

Aah okay, that makes sense; thank you.</p><p><b>Edit</b><br />Beautiful example, beoran! I think that pretty much clears that up now. I was confused with memory leaks between run-time and exiting... But have a good idea now. Thanks!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Sun, 07 Jul 2013 02:51:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612930/986734#target">beoran</a> said:</div><div class="quote"><p>
Edgar Reynaldo,</p><p>Sure, but if you use a pointer together with  new/delete, you are not using the famous C++  RAII idiom anymore. Which is exactly the point I was making: RAII isn&#39;t useful in he general case. What you suggest is equivalent to malloc()/free(),  or wrapped versions of them, in C. </p><p>Why not use C then and save yourself the complexity?
</p></div></div><p>
I recommended a global pointer because it looked like his program depended on global access. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> Not because it was a better practice.</p><p>And Resource Acquisition Is Initialization is useful to a degree. It means when you create a resource, initialize something that will take care of freeing it for you.</p><p>And if you&#39;re gonna argue theres more reason to use C I will counter with the fact that you have to free the resources you create whether it is in C or C++, but C++ can be nicer because you don&#39;t have to remember to do it for every object, just to take care of it properly in the destructor. No C/C++ flame war please. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 08 Jul 2013 02:46:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey I&#39;m cool! <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>No the global pointer is fine. The rage against globals is overrated. </p><p>And of course, I don&#39;t want to start any flame war. I&#39;m just griping about C++. If you like it, then be my guest in using it. </p><p>However, I remain convinced, that for the beginning programmers, it would be best if they started learning plain C first, and only then C++. You&#39;ll learn both languages much better that way. Learn to walk before you learn to run (into trouble?).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Mon, 08 Jul 2013 20:04:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Meh. I learned both at the same time as I went along. But there were some nice resources for C++ online that I took advantage of like cplusplus.com and the sgi stl reference.</p><p>Classes aren&#39;t all that complex, but there are some caveats to creating one, and operator overloading can be confusing at first if you don&#39;t have a good reference. I don&#39;t know, I just learned C as I was learning C++. C is the base of C++ anyway. So by learning C++ you are also learning C. Meh IDK w/e.</p><p>Oh, and you can still use a global pointer with a local object. Just don&#39;t use it outside of main! <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 08 Jul 2013 23:24:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612930/986814#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>
Meh. I learned both at the same time as I went along.
</p></div></div><p>

Then let us test your C skills.</p><div class="source-code snippet"><div class="inner"><pre>
<span class="k1">int</span> function1<span class="k2">(</span> <span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span>ptr<span class="k2">)</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k2">)</span>
</pre></div></div><p>

Valid C / Invalid C ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Tue, 09 Jul 2013 03:52:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Looks invalid - the function pointer parameter doesn&#39;t have any parameters of its own. It should either be <span class="source-code"><span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span>ptr<span class="k2">)</span><span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span></span> or have some other kind of input parameter. Otherwise it is not a valid function signature. I don&#39;t remember the exact syntax for an array of function pointers though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 09 Jul 2013 09:10:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s actually valid.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro5.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">  5</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">  6</span><span class="p">#include "shared.h"</span>
<span class="number">  7</span><span class="p">#include "structs.h"</span>
<span class="number">  8</span><span class="p">#include "helper_functions.h"</span>
<span class="number">  9</span><span class="p">#include "tesselating_pattern.h"</span>
<span class="number"> 10</span><span class="p">#include "torus_code.h"</span>
<span class="number"> 11</span><span class="p">#include "north_code_west.h"</span>
<span class="number"> 12</span><span class="p">#include "south_code_westwards.h"</span>
<span class="number"> 13</span><span class="p">#define MAX_TILES_ACROSS 1000</span>
<span class="number"> 14</span><span class="p">#define ROWS_PER_SQUARE 16</span>
<span class="number"> 15</span><span class="p">#define DEBUG_MAKE_ANOTHER_ROW 0</span>
<span class="number"> 16</span><span class="p">#define CHECK_PATTERN_NUMBERS 0</span>
<span class="number"> 17</span><span class="p">#define TEST_NORTH 0</span>
<span class="number"> 18</span><span class="p">#define TEST_SOUTH 0</span>
<span class="number"> 19</span><span class="p">#define TEST_GOING_NORTH_AND_GOING_WEST 0</span>
<span class="number"> 20</span><span class="p">#define SOUTH_TEST_PRINTFS 0</span>
<span class="number"> 21</span><span class="p">#define NORTH_WEST_TEST_PRINTFS 0</span>
<span class="number"> 22</span>
<span class="number"> 23</span>
<span class="number"> 24</span><span class="c">/*</span>
<span class="number"> 25</span><span class="c">static void first_line(int *line1, int (*across)[MAX_ACROSS_OPTIONS], int priority[],</span>
<span class="number"> 26</span><span class="c">                       int number_of_tiles_across);</span>
<span class="number"> 27</span><span class="c"></span>
<span class="number"> 28</span><span class="c">*/</span>
<span class="number"> 29</span>
<span class="number"> 30</span><span class="k1">static</span> <span class="k1">void</span> first_line_e_to_w<span class="k2">(</span><span class="k1">int</span> <span class="k3">*</span>line_data, <span class="k1">const</span> <span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span>wo<span class="k2">)</span><span class="k2">[</span>MAX_ACROSS_OPTIONS<span class="k2">]</span>, <span class="k1">int</span> priority<span class="k2">[</span><span class="k2">]</span>, <span class="k1">int</span> w<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

Taken from a program I wrote.</p><p>Now you might think I set a trap for you there to create the impression that I&#39;m an C master. I&#39;ll understand if you feel pissed, but I must say I&#39;m not a C master.<br />My C++ skills are &lt;10% of yours but I do think it&#39;s a mistake to underestimate the difficulty of C. Timorg knows why it&#39;s valid, he taught me it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Tue, 09 Jul 2013 17:16:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey, William, even I I had to break out cdecl for that one, but now I understand too. Arguably it&#39;s not that useful except in cases where you happen to have a constant size array you want to pass to a function.</p><p>And that&#39;s what I mean with &quot;learn C first&quot;. If you learn C from learning C++, you won&#39;t learn C well. And if you don&#39;t know C well, then there&#39;s many fine points of C++ you won&#39;t be able to learn well either. Even Stoustrup learned C first. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Tue, 09 Jul 2013 21:48:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s one that cost me probably days of tedious debugging.</p><div class="source-code snippet"><div class="inner"><pre>variable <span class="k3">=</span> a <span class="k3">+</span> b <span class="k3">+</span> c <span class="k3">+</span> get_some_variable<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">5</span> ? <span class="n">10</span> <span class="k2">:</span> <span class="n">20</span><span class="k2">;</span>
</pre></div></div><p>

Call me a dunce but I made that mistake many times.</p><div class="source-code snippet"><div class="inner"><pre>variable <span class="k3">=</span> a <span class="k3">+</span> b <span class="k3">+</span> c <span class="k3">+</span> <span class="k2">(</span>get_some_variable<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">5</span> ? <span class="n">10</span> <span class="k2">:</span> <span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Is what I mean.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Tue, 09 Jul 2013 23:27:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m guessing that&#39;s only valid in C becase C is retarded sometimes, allowing you to declare functions without any input parameters. C++ would never let you get away with that.</p><p>Edit<br />Ah, I see. That is an integer pointer, not a function pointer. Why does it use a function pointer syntax <span class="source-code"><span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span>ptr<span class="k2">)</span><span class="k2">;</span></span> though? That&#39;s one of the odder things that I didn&#39;t know about C.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 10 Jul 2013 07:18:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Parenthesis are probably ignored if there&#39;s not a second set like int (*ptr)().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Wed, 10 Jul 2013 07:28:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was thinking it was the same as how
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> array<span class="k2">[</span><span class="n">10</span><span class="k2">]</span><span class="k2">;</span>
<a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%d\n"</span>,array<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
is equal to
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> array<span class="k2">[</span><span class="n">10</span><span class="k2">]</span><span class="k2">;</span>
<a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%d\n"</span>,<span class="n">5</span><span class="k2">[</span>array<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

For what it&#39;s worth, all three of these functions print the value in the offset passed.
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="k1">void</span> function1<span class="k2">(</span> <span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span>ptr<span class="k2">)</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%d\n"</span>,ptr<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span><span class="k2">}</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">void</span> function2<span class="k2">(</span> <span class="k1">int</span> <span class="k3">*</span> ptr<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k2">)</span>
<span class="number">  9</span><span class="k2">{</span>
<span class="number"> 10</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%d\n"</span>,ptr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">void</span> function3<span class="k2">(</span> <span class="k1">int</span> ptr<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k2">)</span>
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%d\n"</span>,ptr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span><span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="k1">int</span> array<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span> <span class="n">10</span>, <span class="n">20</span>, <span class="n">30</span>, <span class="n">40</span>, <span class="n">50</span>, <span class="n">60</span>, <span class="n">70</span>, <span class="n">80</span>, <span class="n">90</span>, <span class="n">100</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 21</span><span class="k2">{</span>
<span class="number"> 22</span>  function1<span class="k2">(</span>array<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>  function2<span class="k2">(</span>array<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>  function3<span class="k2">(</span>array<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 26</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Wed, 10 Jul 2013 07:46:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, yes, Arthur, but the program should give you warnings when compiled because you&#39;re converting an integer to a pointer and then back to an integer when you use printf().</p><p>Maybe the following modification would be instructive: 
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="k1">void</span> function1<span class="k2">(</span> <span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span>ptr<span class="k2">)</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%p %p %d\n"</span>, ptr, <span class="k2">(</span><span class="k3">*</span>ptr<span class="k2">)</span>, <span class="k2">(</span><span class="k3">*</span>ptr<span class="k2">)</span><span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span><span class="k2">}</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">void</span> function2<span class="k2">(</span> <span class="k1">int</span> <span class="k3">*</span> ptr<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k2">)</span>
<span class="number">  9</span><span class="k2">{</span>
<span class="number"> 10</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%p %p\n"</span>, ptr, ptr<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">void</span> function3<span class="k2">(</span> <span class="k1">int</span> ptr<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k2">)</span>
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%p %d\n"</span>, ptr, ptr<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span><span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="k1">int</span> array<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span> <span class="n">10</span>, <span class="n">20</span>, <span class="n">30</span>, <span class="n">40</span>, <span class="n">50</span>, <span class="n">60</span>, <span class="n">70</span>, <span class="n">80</span>, <span class="n">90</span>, <span class="n">100</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 19</span><span class="k1">int</span> <span class="k3">*</span> array2<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span> NULL <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>
<span class="number"> 22</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 23</span><span class="k2">{</span>
<span class="number"> 24</span>  function1<span class="k2">(</span><span class="k3">&amp;</span>array<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>  function2<span class="k2">(</span>array2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>  function3<span class="k2">(</span>array<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 28</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Wed, 10 Jul 2013 22:20:12 +0000</pubDate>
	</item>
</rss>
