<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>AllegroTimer Class trouble</title>
		<link>http://www.allegro.cc/forums/view/586954</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 10 Aug 2006 20:38:41 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hi to all!</p><p>I&#39;m trying to organize the allegro timer in an unique class in order to speed up programming with allegro. the target is: create a class so i just have to instantiate an AllegroTimer object in main like this:<br />AllegroTimer timer(eventual_bps);</p><p>I declared static the <u>IncSpeedCounter</u> method and the <u>speed_counter</u> property to get rid of the function pointer requested by install_int_ex, but when i try to instantiate an object of this class the compiler can&#39;t misteriously resolve some links. I&#39;m using VC++8 and don&#39;t know if with other compilers this will work instead.</p><p>Suggestions, changes to the codes, ideas...are all welcome. Tnx!<br />P.S.: i&#39;m dealing with Allegro sice yesterday (I'm dumb!) so i don&#39;t know if this can be accomplished in a easier and more convenient way.</p><p>This is the class:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">class</span> AllegroTimer <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>public:</td></tr><tr><td class="number">3</td><td>  <span class="c">//constructor</span></td></tr><tr><td class="number">4</td><td>  AllegroTimer<span class="k2">(</span><span class="k1">int</span> beats <span class="k3">=</span> <span class="n">60</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">5</td><td>    this-&gt;bps <span class="k3">=</span> beats<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>    <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>    <a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span><span class="k3">&amp;</span>AllegroTimer::IncSpeedCounter, BPS_TO_TIMER<span class="k2">(</span>this-&gt;bps<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>    AllegroTimer::speed_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>AllegroTimer::speed_counter<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span><span class="k3">&amp;</span>AllegroTimer::IncSpeedCounter<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>private:</td></tr><tr><td class="number">14</td><td>  <span class="k1">int</span> bps<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">static</span> <span class="k1">volatile</span> <span class="k1">long</span> speed_counter<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k1">static</span> <span class="k1">void</span> IncSpeedCounter<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">17</td><td>    AllegroTimer::speed_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">19</td><td>  <a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span><span class="k3">&amp;</span>AllegroTimer::IncSpeedCounter<span class="k2">)</span></td></tr><tr><td class="number">20</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (iLSILENT)</author>
		<pubDate>Wed, 09 Aug 2006 22:09:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;m dumb! so i don&#39;t know if this can be accomplished in a easier and more convenient way.
</p></div></div><p>At least you&#39;re honest <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>First, please read <a href="http://www.allegro.cc/mockup.html">this</a> and use [code] tags.</p><p>About the code:</p><p>IIRC one may only have one timer interrupt per function. However, you may use the install_param_int_ex function to have mulitples, just use the this variable as the parameter.</p><p><span class="source-code"><a href="http://www.allegro.cc/manual/install_param_int_ex" target="_blank"><span class="a">install_param_int_ex</span></a></span></p><p>You will need to use an instance member (not a static member) to store the speed_counter, otherwise you will only be able to have one instance.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 09 Aug 2006 22:23:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you&#39;re using a class to run as a timer, you may want to think about using methods other than Allegro&#39;s timers, as they&#39;re rather innaccurate. For example, this timer class I have runs off gettimeofday on most systems, or timeGetTime on Windows (which is a bit more accurate than Allegro&#39;s timers). I could use QueryPerformanceFrequency/Counter, but I&#39;ve been lazy on properly using the LARGE_INTGETER type.
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#ifndef TIMER_H</span></td></tr><tr><td class="number">2</td><td><span class="p">#define TIMER_H</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="p">#ifndef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">7</td><td><span class="p">#include &lt;sys/time.h&gt;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="k1">class</span> Timer <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>protected:</td></tr><tr><td class="number">11</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> current_tic<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> usecs_per_tic<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  <span class="k1">struct</span> timeval now, last<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>public:</td></tr><tr><td class="number">16</td><td>  <span class="c">// Starts the timer, generating 'speed' tics per second</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">void</span> init<span class="k2">(</span><span class="k1">int</span> speed<span class="k2">)</span></td></tr><tr><td class="number">18</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>    current_tic <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    usecs_per_tic <span class="k3">=</span> <span class="n">1000000</span> <span class="k3">/</span> speed<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    reset<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>  <span class="c">// Resets the timer, leaving the tic count alone</span></td></tr><tr><td class="number">25</td><td>  <span class="k1">void</span> reset<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">26</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>last, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    now <span class="k3">=</span> last<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>  <span class="c">// Store the current tic in _tic, and return the number of tics since the</span></td></tr><tr><td class="number">32</td><td>  <span class="c">// last call</span></td></tr><tr><td class="number">33</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> get_tics<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k3">&amp;</span>_tic<span class="k2">)</span></td></tr><tr><td class="number">34</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>now, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    <span class="k1">unsigned</span> <span class="k1">long</span> c <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span><span class="k2">(</span>now.tv_sec-last.tv_sec<span class="k2">)</span><span class="k3">*</span><span class="n">1000000</span> <span class="k3">+</span></td></tr><tr><td class="number">37</td><td>                       <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span><span class="k2">(</span>now.tv_usec-last.tv_usec<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span></td></tr><tr><td class="number">38</td><td>                      usecs_per_tic<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td>    last.tv_usec <span class="k3">+</span><span class="k3">=</span> usecs_per_tic <span class="k3">*</span> c<span class="k2">;</span></td></tr><tr><td class="number">41</td><td>    last.tv_sec <span class="k3">+</span><span class="k3">=</span> last.tv_usec<span class="k3">/</span><span class="n">1000000</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    last.tv_usec %<span class="k3">=</span> <span class="n">1000000</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>    current_tic <span class="k3">+</span><span class="k3">=</span> c<span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    _tic <span class="k3">=</span> current_tic<span class="k2">;</span></td></tr><tr><td class="number">46</td><td>    <span class="k1">return</span> c<span class="k2">;</span></td></tr><tr><td class="number">47</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> get_tics<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">49</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">50</td><td>    <span class="k1">unsigned</span> <span class="k1">long</span> dummy<span class="k2">;</span></td></tr><tr><td class="number">51</td><td>    <span class="k1">return</span> get_tics<span class="k2">(</span>dummy<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">53</td><td>  <span class="k1">void</span> rewind_tics<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span> val<span class="k2">)</span></td></tr><tr><td class="number">54</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">55</td><td>    current_tic <span class="k3">-</span><span class="k3">=</span> val<span class="k2">;</span></td></tr><tr><td class="number">56</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">57</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>&#160;</td></tr><tr><td class="number">59</td><td><span class="p">#else</span></td></tr><tr><td class="number">60</td><td>&#160;</td></tr><tr><td class="number">61</td><td><span class="p">#include &lt;winalleg.h&gt;</span></td></tr><tr><td class="number">62</td><td><span class="p">#include &lt;mmsystem.h&gt;</span></td></tr><tr><td class="number">63</td><td>&#160;</td></tr><tr><td class="number">64</td><td><span class="k1">class</span> Timer <span class="k2">{</span></td></tr><tr><td class="number">65</td><td>protected:</td></tr><tr><td class="number">66</td><td>  DWORD current_tic<span class="k2">;</span></td></tr><tr><td class="number">67</td><td>  DWORD clocks_per_tic<span class="k2">;</span></td></tr><tr><td class="number">68</td><td>  DWORD now, last<span class="k2">;</span></td></tr><tr><td class="number">69</td><td>&#160;</td></tr><tr><td class="number">70</td><td>public:</td></tr><tr><td class="number">71</td><td>  <span class="k1">void</span> init<span class="k2">(</span><span class="k1">int</span> speed<span class="k2">)</span></td></tr><tr><td class="number">72</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">73</td><td>    current_tic <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>    clocks_per_tic <span class="k3">=</span> <span class="n">1000</span> <span class="k3">/</span> speed<span class="k2">;</span></td></tr><tr><td class="number">75</td><td>    reset<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>&#160;</td></tr><tr><td class="number">78</td><td>  <span class="k1">void</span> reset<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">79</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">80</td><td>    last <span class="k3">=</span> timeGetTime<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>    now <span class="k3">=</span> last<span class="k2">;</span></td></tr><tr><td class="number">82</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>&#160;</td></tr><tr><td class="number">84</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> get_tics<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k3">&amp;</span>_tic<span class="k2">)</span></td></tr><tr><td class="number">85</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">86</td><td>    now <span class="k3">=</span> timeGetTime<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>    DWORD c <span class="k3">=</span> <span class="k2">(</span>now-last<span class="k2">)</span> <span class="k3">/</span> clocks_per_tic<span class="k2">;</span></td></tr><tr><td class="number">88</td><td>&#160;</td></tr><tr><td class="number">89</td><td>    last <span class="k3">+</span><span class="k3">=</span> clocks_per_tic <span class="k3">*</span> c<span class="k2">;</span></td></tr><tr><td class="number">90</td><td>&#160;</td></tr><tr><td class="number">91</td><td>    current_tic <span class="k3">+</span><span class="k3">=</span> c<span class="k2">;</span></td></tr><tr><td class="number">92</td><td>    _tic <span class="k3">=</span> current_tic<span class="k2">;</span></td></tr><tr><td class="number">93</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span>c<span class="k2">;</span></td></tr><tr><td class="number">94</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> get_tics<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">96</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">97</td><td>    <span class="k1">unsigned</span> <span class="k1">long</span> dummy<span class="k2">;</span></td></tr><tr><td class="number">98</td><td>    <span class="k1">return</span> get_tics<span class="k2">(</span>dummy<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">99</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">100</td><td>&#160;</td></tr><tr><td class="number">101</td><td>  <span class="k1">void</span> rewind_tics<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span> val<span class="k2">)</span></td></tr><tr><td class="number">102</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">103</td><td>    current_tic <span class="k3">-</span><span class="k3">=</span> val<span class="k2">;</span></td></tr><tr><td class="number">104</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">105</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">106</td><td>&#160;</td></tr><tr><td class="number">107</td><td><span class="p">#endif // _WIN32</span></td></tr><tr><td class="number">108</td><td>&#160;</td></tr><tr><td class="number">109</td><td><span class="p">#endif</span></td></tr></tbody></table></div></div><p>
The init() method is used to start it ticking the specified amount of times per second. The reset() method is for if you&#39;ve neglected to read the ticks and don&#39;t want to deal with a jump in time (like after pausing, or switching levels or something). The get_tics method returns the the number of times it&#39;s ticked since the last call, and optionally storing the total number of times it&#39;s ticked in the supplied unsigned long variable. The rewind ticks method is used if you want to back up, say after getting an unexpectedly large return value from get_tics and not wanting to handle them all right now, or if you want to fully reset the timer to 0 (along with calling the reset method).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Wed, 09 Aug 2006 22:41:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>thank you for your replies!<br />p.s. i never wrote &quot;I&#39;m dumb&quot;, it is probably a joke of the moderator...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (iLSILENT)</author>
		<pubDate>Thu, 10 Aug 2006 02:47:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Any time you type I'm dumb! in this forum, it is converted to &quot;I&#39;m dumb!&quot;. Never, ever, use the expression &#39;I'm dumb!&#39;. It is terrible and will make everyone respectable hate you <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> Anyways, it was just terribly appropriate <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Thu, 10 Aug 2006 02:54:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
I'm dumb!</p><p>doh!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Thu, 10 Aug 2006 03:19:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>eheheheh!<br />I&#39;d suggest to make people read a disclaimer before subscrive this forum <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /><br />and maybe theese misunderstandigs won&#39;t happen.<br />Anyway.................. . .. . .I'm dumb! !</p><p>post continued:</p><p>ok, thanks for the help. i made it up with another timer class (quite good)<br />here is the code if anyone need it:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#ifndef TIMER_H</span></td></tr><tr><td class="number">2</td><td><span class="p">#define TIMER_H</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;ctime&gt;</span></td></tr><tr><td class="number">5</td><td><span class="p">#include &lt;iostream&gt;</span></td></tr><tr><td class="number">6</td><td><span class="p">#include &lt;iomanip&gt;</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="k1">class</span> Timer <span class="k2">{</span></td></tr><tr><td class="number">9</td><td> <span class="k1">friend</span> std::ostream<span class="k3">&amp;</span> <span class="k1">operator</span><span class="k3">&lt;</span><span class="k3">&lt;</span><span class="k2">(</span>std::ostream<span class="k3">&amp;</span> os, Timer<span class="k3">&amp;</span> t<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td> private:</td></tr><tr><td class="number">12</td><td>  <span class="k1">bool</span> running<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  clock_t start_clock<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  time_t start_time<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">double</span> acc_time<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  </td></tr><tr><td class="number">17</td><td> public:</td></tr><tr><td class="number">18</td><td>  <span class="c">// 'running' is initially false.  A timer needs to be explicitly started</span></td></tr><tr><td class="number">19</td><td>  <span class="c">// using 'start' or 'restart'</span></td></tr><tr><td class="number">20</td><td>  Timer<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span> running<span class="k2">(</span><span class="k1">false</span><span class="k2">)</span>, start_clock<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>, start_time<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>, acc_time<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span> <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>  </td></tr><tr><td class="number">23</td><td>  <span class="k1">void</span> Start<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg <span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k1">void</span> Restart<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg <span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  <span class="k1">void</span> Stop<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg <span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  <span class="k1">double</span> ElapsedTime<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  <span class="k1">void</span> PrintInfo<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg <span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td><span class="k2">}</span><span class="k2">;</span> <span class="c">// class timer</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td><span class="c">//===========================================================================</span></td></tr><tr><td class="number">32</td><td><span class="c">// Return the total time that the timer has been in the "running"</span></td></tr><tr><td class="number">33</td><td><span class="c">// state since it was first "started" or last "restarted".  For</span></td></tr><tr><td class="number">34</td><td><span class="c">// "short" time periods (less than an hour), the actual cpu time</span></td></tr><tr><td class="number">35</td><td><span class="c">// used is reported instead of the elapsed time.</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td><span class="k1">inline</span> <span class="k1">double</span> Timer::ElapsedTime<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">38</td><td>  time_t acc_sec <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span> <span class="k3">-</span> start_time<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>  <span class="k1">if</span> <span class="k2">(</span>acc_sec <span class="k3">&lt;</span> <span class="n">3600</span><span class="k2">)</span></td></tr><tr><td class="number">40</td><td>    <span class="k1">return</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> start_clock<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">*</span> CLOCKS_PER_SEC<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">42</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">*</span> acc_sec<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td><span class="k2">}</span> <span class="c">// Timer::ElapsedTime</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td><span class="c">//===========================================================================</span></td></tr><tr><td class="number">47</td><td><span class="c">// Start a timer.  If it is already running, let it continue running.</span></td></tr><tr><td class="number">48</td><td><span class="c">// Print an optional message.</span></td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td><span class="k1">inline</span> <span class="k1">void</span> Timer::Start<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">51</td><td>  <span class="c">// Print an optional message, something like "Starting timer t";</span></td></tr><tr><td class="number">52</td><td>  <span class="k1">if</span> <span class="k2">(</span>msg<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> msg <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span></td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td>  <span class="c">// Return immediately if the timer is already running</span></td></tr><tr><td class="number">55</td><td>  <span class="k1">if</span> <span class="k2">(</span>running<span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>&#160;</td></tr><tr><td class="number">57</td><td>  <span class="c">// Set timer status to running and set the start time</span></td></tr><tr><td class="number">58</td><td>  running <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>  start_clock <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">60</td><td>  start_time <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>&#160;</td></tr><tr><td class="number">62</td><td><span class="k2">}</span> <span class="c">// Timer::Start</span></td></tr><tr><td class="number">63</td><td>&#160;</td></tr><tr><td class="number">64</td><td><span class="c">//===========================================================================</span></td></tr><tr><td class="number">65</td><td><span class="c">// Turn the timer off and start it again from 0.  Print an optional message.</span></td></tr><tr><td class="number">66</td><td>&#160;</td></tr><tr><td class="number">67</td><td><span class="k1">inline</span> <span class="k1">void</span> Timer::Restart<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">68</td><td>  <span class="c">// Print an optional message, something like "Restarting timer t";</span></td></tr><tr><td class="number">69</td><td>  <span class="k1">if</span> <span class="k2">(</span>msg<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> msg <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span></td></tr><tr><td class="number">70</td><td>&#160;</td></tr><tr><td class="number">71</td><td>  <span class="c">// Set timer status to running, reset accumulated time, and set start time</span></td></tr><tr><td class="number">72</td><td>  running <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>  acc_time <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>  start_clock <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>  start_time <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>&#160;</td></tr><tr><td class="number">77</td><td><span class="k2">}</span> <span class="c">// Timer::Restart</span></td></tr><tr><td class="number">78</td><td>&#160;</td></tr><tr><td class="number">79</td><td><span class="c">//===========================================================================</span></td></tr><tr><td class="number">80</td><td><span class="c">// Stop the timer and print an optional message.</span></td></tr><tr><td class="number">81</td><td>&#160;</td></tr><tr><td class="number">82</td><td><span class="k1">inline</span> <span class="k1">void</span> Timer::Stop<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">83</td><td>  <span class="c">// Print an optional message, something like "Stopping timer t";</span></td></tr><tr><td class="number">84</td><td>  <span class="k1">if</span> <span class="k2">(</span>msg<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> msg <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span></td></tr><tr><td class="number">85</td><td>&#160;</td></tr><tr><td class="number">86</td><td>  <span class="c">// Compute accumulated running time and set timer status to not running</span></td></tr><tr><td class="number">87</td><td>  <span class="k1">if</span> <span class="k2">(</span>running<span class="k2">)</span> acc_time <span class="k3">+</span><span class="k3">=</span> ElapsedTime<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>  running <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>&#160;</td></tr><tr><td class="number">90</td><td><span class="k2">}</span> <span class="c">// Timer::Stop</span></td></tr><tr><td class="number">91</td><td>&#160;</td></tr><tr><td class="number">92</td><td><span class="c">//===========================================================================</span></td></tr><tr><td class="number">93</td><td><span class="c">// Print out an optional message followed by the current timer timing.</span></td></tr><tr><td class="number">94</td><td>&#160;</td></tr><tr><td class="number">95</td><td><span class="k1">inline</span> <span class="k1">void</span> Timer::PrintInfo<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">96</td><td>  <span class="c">// Print an optional message, something like "Checking timer t";</span></td></tr><tr><td class="number">97</td><td>  <span class="k1">if</span> <span class="k2">(</span>msg<span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> msg <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" : "</span><span class="k2">;</span></td></tr><tr><td class="number">98</td><td>&#160;</td></tr><tr><td class="number">99</td><td>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Elapsed time ["</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::setiosflags<span class="k2">(</span>std::ios::fixed<span class="k2">)</span></td></tr><tr><td class="number">100</td><td>            <span class="k3">&lt;</span><span class="k3">&lt;</span> std::setprecision<span class="k2">(</span><span class="n">2</span><span class="k2">)</span></td></tr><tr><td class="number">101</td><td>            <span class="k3">&lt;</span><span class="k3">&lt;</span> acc_time <span class="k3">+</span> <span class="k2">(</span>running ? ElapsedTime<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"] seconds\n"</span><span class="k2">;</span></td></tr><tr><td class="number">102</td><td>&#160;</td></tr><tr><td class="number">103</td><td><span class="k2">}</span> <span class="c">// Timer::PrintInfo</span></td></tr><tr><td class="number">104</td><td>&#160;</td></tr><tr><td class="number">105</td><td><span class="c">//===========================================================================</span></td></tr><tr><td class="number">106</td><td><span class="c">// Allow timers to be printed to ostreams using the syntax 'os &lt;&lt; t'</span></td></tr><tr><td class="number">107</td><td><span class="c">// for an ostream 'os' and a timer 't'.  For example, "cout &lt;&lt; t" will</span></td></tr><tr><td class="number">108</td><td><span class="c">// print out the total amount of time 't' has been "running".</span></td></tr><tr><td class="number">109</td><td>&#160;</td></tr><tr><td class="number">110</td><td><span class="k1">inline</span> std::ostream<span class="k3">&amp;</span> <span class="k1">operator</span><span class="k3">&lt;</span><span class="k3">&lt;</span><span class="k2">(</span>std::ostream<span class="k3">&amp;</span> os, Timer<span class="k3">&amp;</span> t<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">111</td><td>  os <span class="k3">&lt;</span><span class="k3">&lt;</span> std::setprecision<span class="k2">(</span><span class="n">2</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::setiosflags<span class="k2">(</span>std::ios::fixed<span class="k2">)</span></td></tr><tr><td class="number">112</td><td>    <span class="k3">&lt;</span><span class="k3">&lt;</span> t.acc_time <span class="k3">+</span> <span class="k2">(</span>t.running ? t.ElapsedTime<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">113</td><td>  <span class="k1">return</span> os<span class="k2">;</span></td></tr><tr><td class="number">114</td><td><span class="k2">}</span></td></tr><tr><td class="number">115</td><td>&#160;</td></tr><tr><td class="number">116</td><td><span class="c">//===========================================================================</span></td></tr><tr><td class="number">117</td><td>&#160;</td></tr><tr><td class="number">118</td><td><span class="p">#endif // TIMER_H</span></td></tr></tbody></table></div></div><p>


see ya!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (iLSILENT)</author>
		<pubDate>Thu, 10 Aug 2006 18:38:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[OT]CGamesPlay, how did YOU manage to write it then? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /> Even |o| is not quite the same...[/OT]
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Thu, 10 Aug 2006 19:07:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you take your member number and multiply it by two, then add 1000, then multiply this number by 3, then add 45 thousand, divide the whole thing by 6, and finally subtract 3738 plus your member number, you get your &quot;censorship index&quot; (I don&#39;t remember what exactly the moderator called it). Basically, if this number is within 3354 of your member number, you can use that phrase and all manner of swear words without being censored. The formula, once again:<br /><img class="math" src="http://www.allegro.cc/images/tex/5/5/5507da914032af2c6ba74402067d8a96-96.png" alt="&lt;math&gt;|{M_{no} - {{3*(2*M_{no} + 1000)  +45000} \over 6} - (3738 + M_{no})}| &lt; 3354&lt;/math&gt;" /><br />(rearranged as an inequality for ease)</p><p>[append]</p><p>This is actually only a linear approximation of the actual formula. Admittedly, the real formula is simpler, but requires trigonometry, so I didn&#39;t post it. But this one works for most users.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Thu, 10 Aug 2006 20:09:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Or, if you are one of the unfortunate users whose swearword index is bigger than 3354, you could try using empty i or b markers to break the word in two parts. But that&#39;s for sissies. Real men just register accounts until they get a preferable swearword index.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jakub Wasilewski)</author>
		<pubDate>Thu, 10 Aug 2006 20:38:41 +0000</pubDate>
	</item>
</rss>
