<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Functions returning NULL pointers when I expect otherwise</title>
		<link>http://www.allegro.cc/forums/view/617888</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 26 Jul 2019 23:33:31 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi guys,</p><p>Sorry for the silly question, but I can&#39;t figure it out what&#39;s going on.<br />I&#39;m following this <a href="https://github.com/liballeg/allegro_wiki/wiki/Allegro-Vivace%3A-Basic-game-structure">great tutorial</a> and decided to split the code into separate files to be more organized.</p><p>But my MS Visual Studio debugger is showing that all my <b>timer</b>, <b>queue</b>, <b>disp</b> and <b>font</b> pointers are NULL when reaching the main loop. I am mostly a begginer in C, so sorry if I missed something.</p><p>Code are in the attachments.</p><p>Can you guys help?<br />Thank you.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (NeoFahrenheit)</author>
		<pubDate>Thu, 25 Jul 2019 04:45:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just posting the code so we can read it easier...</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><div class="source-code"><div class="toolbar"><span class="name">init.c</span><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="p">#include &lt;allegro5/allegro5.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">void</span> init_all<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> timer, <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> queue, <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> disp, <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a><span class="k3">*</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span>
<span class="number">  6</span><span class="k2">{</span>
<span class="number">  7</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  8</span>  <span class="k2">{</span>
<span class="number">  9</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"couldn't initialize allegro\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</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">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</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">"couldn't initialize keyboard\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>  <span class="k2">}</span>
<span class="number"> 18</span>
<span class="number"> 19</span>  timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">60</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span>
<span class="number"> 21</span>  <span class="k2">{</span>
<span class="number"> 22</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"couldn't initialize timer\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>  <span class="k2">}</span>
<span class="number"> 25</span>
<span class="number"> 26</span>  queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>queue<span class="k2">)</span>
<span class="number"> 28</span>  <span class="k2">{</span>
<span class="number"> 29</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"couldn't initialize queue\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>  <span class="k2">}</span>
<span class="number"> 32</span>
<span class="number"> 33</span>  disp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>disp<span class="k2">)</span>
<span class="number"> 35</span>  <span class="k2">{</span>
<span class="number"> 36</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"couldn't initialize display\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>  <span class="k2">}</span>
<span class="number"> 39</span>
<span class="number"> 40</span>  <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> al_create_builtin_font<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span>
<span class="number"> 42</span>  <span class="k2">{</span>
<span class="number"> 43</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"couldn't initialize font\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>  <span class="k2">}</span>
<span class="number"> 46</span>
<span class="number"> 47</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue, <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>disp<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span><span class="k2">}</span>
</div></div><p>

</p><div class="source-code"><div class="toolbar"><span class="name">init.h</span><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">#pragma once</span>
<span class="number"> 2</span>
<span class="number"> 3</span><span class="c">// Inicialize all basic essentials. </span>
<span class="number"> 4</span><span class="k1">void</span> init_all<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span>, <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span>, <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span>, <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a><span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>

</p><div class="source-code"><div class="toolbar"><span class="name">main.c</span><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="p">#include &lt;allegro5/allegro5.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">  4</span><span class="p">#include "init.h"</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> timer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  9</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 10</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> disp <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 11</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a><span class="k3">*</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>  init_all<span class="k2">(</span><span class="k3">&amp;</span>timer, <span class="k3">&amp;</span>queue, <span class="k3">&amp;</span>disp, <span class="k3">&amp;</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>  <span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 16</span>  <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 17</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>  <span class="k1">while</span> <span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 21</span>  <span class="k2">{</span>
<span class="number"> 22</span>    <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>queue, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    <span class="k1">switch</span> <span class="k2">(</span>event.type<span class="k2">)</span>
<span class="number"> 25</span>    <span class="k2">{</span>
<span class="number"> 26</span>    <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number"> 27</span>      <span class="c">// game logic goes here.</span>
<span class="number"> 28</span>      redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 29</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</span>    <span class="k1">case</span> ALLEGRO_EVENT_KEY_DOWN:
<span class="number"> 32</span>    <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 33</span>      done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 34</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 35</span>    <span class="k2">}</span>
<span class="number"> 36</span>
<span class="number"> 37</span>    <span class="k1">if</span> <span class="k2">(</span>done<span class="k2">)</span>
<span class="number"> 38</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 39</span>
<span class="number"> 40</span>    <span class="k1">if</span> <span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>queue<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 41</span>    <span class="k2">{</span>
<span class="number"> 42</span>      <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</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="number"> 43</span>      <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="s">"Hello world!"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>      <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>
<span class="number"> 46</span>      redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 47</span>    <span class="k2">}</span>
<span class="number"> 48</span>  <span class="k2">}</span>
<span class="number"> 49</span>
<span class="number"> 50</span>  <a href="http://www.allegro.cc/manual/al_destroy_font"><span class="a">al_destroy_font</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 51</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>disp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 52</span>  <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>  <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 54</span>
<span class="number"> 55</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 56</span><span class="k2">}</span>
</div></div><p>
</p></div></div><p>

You appear to be passing a pointer-to-a-pointer, but the function is accepting just a pointer here:</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> timer <span class="k3">=</span> NULL<span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> queue <span class="k3">=</span> NULL<span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> disp <span class="k3">=</span> NULL<span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a><span class="k3">*</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> NULL<span class="k2">;</span>

  init_all<span class="k2">(</span><span class="k3">&amp;</span>timer, <span class="k3">&amp;</span>queue, <span class="k3">&amp;</span>disp, <span class="k3">&amp;</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div></div><p>

Which means instead of assigning to the variables in main you&#39;re just overwriting your own local variables (throwing away the parameter value).</p><p>You probably want to change the signature of init_all to accept pointer-to-pointer instead.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Thu, 25 Jul 2019 05:56:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the help <b>bamcaig</b>, but I don&#39;t know how to do that. I tried modifying the function all the ways I could, but I&#39;m terrible using pointer-to-pointer.</p><p>If it isn&#39;t too much trouble for you, could you help me with code examples?<br />Also, I&#39;m accepting tips in to know how and when to use pointer-to-pointer. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /></p><p>Thanks!</p><p><i>EDIT: I have made it work, but it was only luck and a lot of try and error. If you guys could enlighten me, It would be awesome. My updated code are in the attachments.</i>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (NeoFahrenheit)</author>
		<pubDate>Thu, 25 Jul 2019 06:38:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Instead of attaching a few files it is much nicer to just embed the code in your post so we don&#39;t have to download the files (if it&#39;s more than 3 files then probably zipping them is preferred).</p><p>You can format code by posting it in an XML tag: <tt>&lt;code name=&quot;foo.c&quot;&gt;teh codes&lt;/code&gt;</tt>. The name attribute is optional.</p><p>It&#39;s actually really impressive if you figured that out just with trial and error. But pointers to pointers work the same way that regular pointers do, except that the data they point to is another pointer. In your example, you allocated variables in <span class="source-code">main</span> to hold the pointers to the structures, and then passed a pointer to those variables to a function to allow you to modify them from within the function.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> x<span class="k2">;</span>
<span class="k1">int</span> <span class="k3">*</span> x_pointer <span class="k3">=</span> <span class="k3">&amp;</span>x<span class="k2">;</span>

<span class="k1">int</span> <span class="k3">*</span> y_pointer <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">int</span> <span class="k3">*</span><span class="k3">*</span> y_pointer_to_pointer <span class="k3">=</span> <span class="k3">&amp;</span>y_pointer<span class="k2">;</span>
</pre></div></div><p>

When you dereference (`*varname`) a pointer-to-a-pointer you reference the original pointer.</p><p>For example, *y_pointer_to_pointer would return the address stored at y_pointer. First it looks up the address of y_pointer, and then it loads <span class="source-code">size <span class="k1">int</span></span> bytes) starting there, which we&#39;ve promised will hold a pointer to another integer.</p><p>By passing pointers to local variables you can allow a function to modify those local variables. This can be utilized for multiple return values, for example. It&#39;s a common pattern for initialization functions if you&#39;re trying to avoid globals, though storing those values all in a structure can simplify the interface.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Thu, 25 Jul 2019 09:25:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the explanation, <b>bamccaig</b>. I&#39;m afraid I will ask a bit more of you. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /><br />Sorry for not posting my code here directly. I was thinking I was going to make my post too big and people would complain.</p><p>So, I have made a example code showing my doubts:
</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> swap<span class="k2">(</span><span class="k1">int</span><span class="k3">*</span> a, <span class="k1">int</span><span class="k3">*</span> b<span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>  <span class="k1">int</span> temp <span class="k3">=</span> <span class="k3">*</span>a<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>  <span class="k3">*</span>a <span class="k3">=</span> <span class="k3">*</span>b<span class="k2">;</span>
<span class="number">  8</span>  <span class="k3">*</span>b <span class="k3">=</span> <span class="k3">*</span>a<span class="k2">;</span>
<span class="number">  9</span><span class="k2">}</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="number"> 12</span><span class="k2">{</span>
<span class="number"> 13</span>  <span class="k1">int</span> x <span class="k3">=</span> <span class="n">10</span>, y <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 14</span>  swap<span class="k2">(</span><span class="k3">&amp;</span>x, <span class="k3">&amp;</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 17</span><span class="k2">}</span>
<span class="number"> 18</span>
<span class="number"> 19</span><span class="c">/* The example above shows the avarage use of a pointer function. That I can understand.</span>
<span class="number"> 20</span><span class="c">But I remember when I was in my first semester in university, I had to pass pointer-to-pointer</span>
<span class="number"> 21</span><span class="c">to functions dealing with trees or graphs if I want to modify them without returning the pointer.</span>
<span class="number"> 22</span><span class="c"></span>
<span class="number"> 23</span><span class="c">Why?</span>
<span class="number"> 24</span><span class="c"></span>
<span class="number"> 25</span><span class="c">The explanation that I have always got is that x and y variables are restricted to the main function.</span>
<span class="number"> 26</span><span class="c">swap can't acess them directly, so we need to pass their adresses. But with data structures or with that</span>
<span class="number"> 27</span><span class="c">allegro5 case, I was already sending (or so I tought) the pointers to init_all(), so why can't the main</span>
<span class="number"> 28</span><span class="c">function retrieve them? Why do we need to use pointer-to-pointer in some cases? */</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (NeoFahrenheit)</author>
		<pubDate>Thu, 25 Jul 2019 16:50:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://www.cplusplus.com/doc/tutorial/pointers/">http://www.cplusplus.com/doc/tutorial/pointers/</a></p><p>Do some reading and be enlightened.</p><p>Pointers are normal variables, except they hold an address.</p><p>Now to modify a variable, you need its address. (<span class="source-code"><span class="k3">&amp;</span>var</span>).</p><p>So if you want to modify a pointer outside of its scope, you need it&#39;s address.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> a <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="k1">int</span><span class="k3">*</span> pa <span class="k3">=</span> <span class="k3">&amp;</span>a<span class="k2">;</span>
<span class="k1">int</span><span class="k3">*</span><span class="k3">*</span> ppa <span class="k3">=</span> <span class="k3">&amp;</span>pa<span class="k2">;</span>
</pre></div></div><p>

So to modify pa indirectly, you need to pass ppa. Which is a pointer to pointer. All that means is that it holds the address of a pointer, so it can be modified.</p><p><b>EDIT</b><br />Your swap function is incorrect. You need to assign *b the value of temp, not *a.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 25 Jul 2019 18:23:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>A pointer allows you to modify the data that it points at.</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> triplei<span class="k2">(</span><span class="k1">int</span> n<span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>    n <span class="k3">=</span> n <span class="k3">*</span> <span class="n">3</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> triplep<span class="k2">(</span><span class="k1">int</span> <span class="k3">*</span> n<span class="k2">)</span>
<span class="number">  9</span><span class="k2">{</span>
<span class="number"> 10</span>    <span class="k3">*</span>n <span class="k3">=</span> <span class="k3">*</span>n <span class="k3">*</span> <span class="n">3</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">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span>argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span>    <span class="k1">int</span> x <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> % <span class="n">100</span><span class="k2">;</span>
<span class="number"> 16</span>    <span class="k1">int</span> y <span class="k3">=</span> x<span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    triplei<span class="k2">(</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Triple %d is %d? (fail)\n"</span>, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>    y <span class="k3">=</span> x<span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    triplep<span class="k2">(</span><span class="k3">&amp;</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>
<span class="number"> 26</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Triple %d is %d? (win)\n"</span>, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>
<span class="number"> 28</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 29</span><span class="k2">}</span>
</div></div><p>

In the above example, <span class="source-code">triplei</span> has no effect on y. The reason is because it accepted a <i>copy</i> of y&#39;s value. It has no way to modify <span class="source-code">y</span> itself. When we assign a new value to <span class="source-code">n</span> in <span class="source-code">triplei</span> it has no effect on <span class="source-code">y</span>.</p><p>Contrarily, <span class="source-code">triplep</span> works. Instead of accepting a copy of <span class="source-code">y</span> it accepts a copy of y&#39;s memory address. By dereferencing the memory address we can read the value stored there, and we can also write to it! First we read the value, then multiply it by 3, and then overwrite the value stored at the memory address with the result. This <i>does</i> modify <span class="source-code">y</span>.</p><p>In this example, our data was just a simple integer, but it works exactly the same way with a more complicated structure.</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="p">#include &lt;stdlib.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;time.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;unistd.h&gt;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">struct</span> my_timer_
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>    <span class="k1">int</span> _start<span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">int</span> _current<span class="k2">;</span>
<span class="number"> 10</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">typedef</span> <span class="k1">struct</span> my_timer_ my_timer_t<span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>my_timer_t <span class="k3">*</span> create_my_timer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 15</span><span class="k2">{</span>
<span class="number"> 16</span>    <span class="c">// Allocating memory on the heap so it will still exist when we return.</span>
<span class="number"> 17</span>    my_timer_t <span class="k3">*</span> ptr <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>my_timer_t<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    <span class="k1">if</span> <span class="k2">(</span>ptr <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number"> 20</span>    <span class="k2">{</span>
<span class="number"> 21</span>        <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 22</span>    <span class="k2">}</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    ptr-&gt;_start <span class="k3">=</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span> <span class="c">// Contrived implementation.</span>
<span class="number"> 25</span>    ptr-&gt;_current <span class="k3">=</span> ptr-&gt;_start<span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>    <span class="k1">return</span> ptr<span class="k2">;</span>
<span class="number"> 28</span><span class="k2">}</span>
<span class="number"> 29</span>
<span class="number"> 30</span><span class="k1">void</span> tick_my_timer<span class="k2">(</span>my_timer_t <span class="k3">*</span> timer<span class="k2">)</span>
<span class="number"> 31</span><span class="k2">{</span>
<span class="number"> 32</span>    timer-&gt;_current <span class="k3">=</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span><span class="k2">}</span>
<span class="number"> 34</span>
<span class="number"> 35</span><span class="k1">void</span> destroy_my_timer<span class="k2">(</span>my_timer_t <span class="k3">*</span><span class="k3">*</span> timer<span class="k2">)</span>
<span class="number"> 36</span><span class="k2">{</span>
<span class="number"> 37</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span><span class="k3">*</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>    <span class="k3">*</span>timer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 39</span><span class="k2">}</span>
<span class="number"> 40</span>
<span class="number"> 41</span><span class="k1">void</span> initializep<span class="k2">(</span>my_timer_t <span class="k3">*</span> timer<span class="k2">)</span>
<span class="number"> 42</span><span class="k2">{</span>
<span class="number"> 43</span>    timer <span class="k3">=</span> create_my_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span><span class="k2">}</span>
<span class="number"> 45</span>
<span class="number"> 46</span><span class="k1">void</span> initializepp<span class="k2">(</span>my_timer_t <span class="k3">*</span><span class="k3">*</span> timer<span class="k2">)</span>
<span class="number"> 47</span><span class="k2">{</span>
<span class="number"> 48</span>    <span class="k3">*</span>timer <span class="k3">=</span> create_my_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span><span class="k2">}</span>
<span class="number"> 50</span>
<span class="number"> 51</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span> argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number"> 52</span><span class="k2">{</span>
<span class="number"> 53</span>    my_timer_t <span class="k3">*</span> timer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 54</span>
<span class="number"> 55</span>    initializep<span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>
<span class="number"> 57</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Timer is initialized by initializep? %s\n"</span>,
<span class="number"> 58</span>            timer <span class="k3">=</span><span class="k3">=</span> NULL ? <span class="s">"no"</span> <span class="k2">:</span> <span class="s">"yes"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span>
<span class="number"> 60</span>    initializepp<span class="k2">(</span><span class="k3">&amp;</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>
<span class="number"> 62</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Timer is initialized by initializepp? %s\n"</span>,
<span class="number"> 63</span>            timer <span class="k3">=</span><span class="k3">=</span> NULL ? <span class="s">"no"</span> <span class="k2">:</span> <span class="s">"yes"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 64</span>
<span class="number"> 65</span>    <span class="k1">if</span> <span class="k2">(</span>timer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number"> 66</span>    <span class="k2">{</span>
<span class="number"> 67</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 68</span>
<span class="number"> 69</span>        tick_my_timer<span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 70</span>
<span class="number"> 71</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Timer has ticked? %s\n"</span>,
<span class="number"> 72</span>                timer-&gt;_current <span class="k3">-</span> timer-&gt;_start ? <span class="s">"yes"</span> <span class="k2">:</span> <span class="s">"no"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 73</span>
<span class="number"> 74</span>        destroy_my_timer<span class="k2">(</span><span class="k3">&amp;</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 75</span>    <span class="k2">}</span>
<span class="number"> 76</span>
<span class="number"> 77</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 78</span><span class="k2">}</span>
</div></div><p>

Similarly, <span class="source-code">initializep</span> does not work to initialize <span class="source-code">timer</span> in main. And it also leaks memory! The <span class="source-code">timer</span> variable in <span class="source-code">initializep</span> starts out as a copy of the value of <span class="source-code">timer</span> in main (i.e., <span class="source-code">NULL</span>). When we allocate memory and assign it to <span class="source-code">timer</span> in <span class="source-code">initializep</span> all it does is store the new memory address in <span class="source-code">initializep</span>. It doesn&#39;t affect <span class="source-code">main</span>.</p><p>Whereas <span class="source-code">initializepp</span> is able to actually assign to <span class="source-code">timer</span> in <span class="source-code">main</span> because we passed a copy of the memory addresss of <span class="source-code">timer</span> in <span class="source-code">main</span>. By dereferencing the pointer-to-a-pointer we can read the timer pointer value, but we can also write to it because we&#39;re actually pointing at the pointer! For the same reason, <span class="source-code">destroy_timer</span> is able to actually assign <span class="source-code">NULL</span> back to <span class="source-code">timer</span> in <span class="source-code">main</span> because we passed a pointer to it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Thu, 25 Jul 2019 20:15:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Things are more clearer now. I think my mistake was assuming functions that takes pointers as arguments creates it&#39;s local variable with the adresses it recevies. This is how I was doing in 1.jpeg.</p><p>But I tought, maybe, all variables inside functions has it&#39;s own unique adresses. That made a lot more sense. Besides, all the variables must be allocated before runtime. Using this tought, I made 2.jpeg. I&#39;m not really sure if I was really getting it or just wanting and manipulating my hand and pencil to get it.</p><p>I think a little bit of more time and revisiting my notes will be enough to the knowlogde to stick.</p><p>Thanks a lot for your help, <b>bamccaig</b>. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /><br />Thanks for the link, <b>Edgar Reynaldo</b>. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (NeoFahrenheit)</author>
		<pubDate>Fri, 26 Jul 2019 19:46:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Actually not all variables are allocated before runtime. Only global/static variables that exist always get allocated in that way (technically they&#39;re still allocated at runtime, but I&#39;m speculating that they&#39;re allocated as part of the memory that holds the actual program; I&#39;m not sure about that though).</p><p>Local variables in functions are allocated when the function is called. There are generally two memory sources for programs: the stack and the heap. The stack is where your function calls and variables and return values are stored. The heap is where dynamic memory is allocated (e.g., <span class="source-code">my_timer_t</span> example above uses <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a></span> to allocate memory on the heap for a timer structure).</p><p>The program always has a pointer to the top of the stack. When a function is called the program jumps to some code that sets up the function call by allocating a fixed amount of memory based on how many and how big the parameters, variables, and return types are, with a few extra slots for housekeeping. Then it jumps to the actual code for the function and begins executing it. The code is executing in reference to where the function call was allocated on the stack. It generally knows that <span class="source-code">variable1</span> is X bytes from the reference point. It can access the variable location in memory by doing pointer arithmetic with that reference point. When the function returns there is code injected into the program to copy the return value back to the calling function and effectively unallocate/free the stack memory used for the previous function call.</p><p>So the location of local variables in memory varies depending on where it&#39;s stack was allocated and when the function is called in the program. If it&#39;s called from many different places in the call stack then its variables will exist at different places in memory depending on which call is executing. That call will know where they are, but the rest of the program doesn&#39;t.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Fri, 26 Jul 2019 23:33:31 +0000</pubDate>
	</item>
</rss>
