<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>gcc error: lvalue required as left operand of assignment in Mappy</title>
		<link>http://www.allegro.cc/forums/view/601028</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 23 Jul 2009 22:35:54 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My game compiles in MSVC and gcc on Windows so I tried to see if it would compile in Linux.  I&#39;m running Ubuntu 9.04, gcc 4.3.3, allegro 4.2.  The hello world compiled and ran so I confirmed Allegro was working however when compiling my program it came up with 4 errors compiling Mappy.c.  I didn&#39;t change Mappy or anything just downloaded it and using it as is.  The 4 errors I got were:</p><p>error: lvalue required as left operand of assignment<br />error: lvalue required as left operand of assignment<br />error: lvalue required as left operand of assignment<br />error: lvalue required as left operand of assignment</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>i <span class="k3">=</span> mapnumblockstr<span class="k2">;</span> <span class="k1">while</span> <span class="k2">(</span>i<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>error <span class="n">1</span><span class="k3">-</span><span class="k3">-</span><span class="k3">&gt;</span>  <span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span><span class="k2">)</span> myblkstrpt-&gt;bgoff<span class="k2">)</span> <span class="k3">=</span> abmTiles<span class="k2">[</span>myblkstrpt-&gt;bgoff<span class="k2">]</span><span class="k2">;</span>
<span class="number">  3</span>    <span class="k1">if</span> <span class="k2">(</span>myblkstrpt-&gt;fgoff<span class="k3">!</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  4</span>error <span class="n">2</span><span class="k3">-</span><span class="k3">-</span><span class="k3">&gt;</span>    <span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span><span class="k2">)</span> myblkstrpt-&gt;fgoff<span class="k2">)</span> <span class="k3">=</span> abmTiles<span class="k2">[</span>myblkstrpt-&gt;fgoff<span class="k2">]</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">if</span> <span class="k2">(</span>myblkstrpt-&gt;fgoff2<span class="k3">!</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  6</span>error <span class="n">3</span><span class="k3">-</span><span class="k3">-</span><span class="k3">&gt;</span>    <span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span><span class="k2">)</span> myblkstrpt-&gt;fgoff2<span class="k2">)</span> <span class="k3">=</span> abmTiles<span class="k2">[</span>myblkstrpt-&gt;fgoff2<span class="k2">]</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="k1">if</span> <span class="k2">(</span>myblkstrpt-&gt;fgoff3<span class="k3">!</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  8</span>error <span class="n">4</span><span class="k3">-</span><span class="k3">-</span><span class="k3">&gt;</span>    <span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span><span class="k2">)</span> myblkstrpt-&gt;fgoff3<span class="k2">)</span> <span class="k3">=</span> abmTiles<span class="k2">[</span>myblkstrpt-&gt;fgoff3<span class="k2">]</span><span class="k2">;</span>
<span class="number">  9</span>    myblkstrpt<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span> i--<span class="k2">;</span>
<span class="number"> 10</span><span class="k2">}</span>
</div></div><p>

I don&#39;t fully understand what the error means; anyone care to help me re-write this so it&#39;ll compile or is something more difficult then re-writing these 4 lines of code?  Thanks!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (agent_smith)</author>
		<pubDate>Thu, 23 Jul 2009 16:18:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It seems that the result of a cast (to non-reference type) is not a left-value, i.e something that you can assign to (although some compilers may disagree, particularly MSVC is known for its relaxedness regarding templates and lvalues/rvalues). A possible solution: declare a pointer, so you won&#39;t have to cast in the assignment, or cast to reference to pointer?</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="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">int</span> n<span class="k2">;</span>
<span class="number">  4</span>    <span class="k1">void</span><span class="k3">*</span> p<span class="k2">;</span>
<span class="number">  5</span>    <span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span> p <span class="k3">=</span> <span class="k3">&amp;</span>n<span class="k2">;</span> <span class="c">//error</span>
<span class="number">  6</span><span class="k2">}</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  9</span><span class="k2">{</span>
<span class="number"> 10</span>    <span class="k1">int</span> n<span class="k2">;</span>
<span class="number"> 11</span>    <span class="k1">void</span><span class="k3">*</span> p<span class="k2">;</span>
<span class="number"> 12</span>    <span class="k1">int</span><span class="k3">*</span> q <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span> p<span class="k2">;</span>
<span class="number"> 13</span>    q <span class="k3">=</span> <span class="k3">&amp;</span>n<span class="k2">;</span>
<span class="number"> 14</span><span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span><span class="c">//or cast to reference to pointer</span>
<span class="number"> 17</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 18</span><span class="k2">{</span>
<span class="number"> 19</span>    <span class="k1">int</span> n<span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">void</span><span class="k3">*</span> p<span class="k2">;</span>
<span class="number"> 21</span>    <span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k3">&amp;</span><span class="k2">)</span> p <span class="k3">=</span> <span class="k3">&amp;</span>n<span class="k2">;</span>
<span class="number"> 22</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Thu, 23 Jul 2009 17:17:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should cast the rvalue to be of the same type as the lvalue pointer, not the other way around as in that code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Thu, 23 Jul 2009 17:28:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>if you&#39;re using C++ then I&#39;d recommend you use the &#39;combined&#39; playback library (<a href="http://www.tilemap.co.uk/mappy.php">http://www.tilemap.co.uk/mappy.php</a>) as it&#39;s C++ and separates the core of mappy from the graphics library. This won&#39;t have the issue as it is this now:</p><p>myblkstrpt-&gt;bgoff = (int) abmTiles[myblkstrpt-&gt;bgoff];</p><p>So do what Evert says, which is essentially what the above code does.</p><p>For anyone&#39;s reference,</p><p>bgoff is a long int<br />abmTiles is a BITMAP**
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Thu, 23 Jul 2009 17:37:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hmm... so is that code assuming that a pointer will fit in a long int? In general, that is a bad (unsafe) assumption to make...  although it happens to work properly for the time being.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Thu, 23 Jul 2009 18:29:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The newer version has it as just an int, hence the cast in my suggested solution. Whether this (long to int) makes it worse or better, I don&#39;t know.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Thu, 23 Jul 2009 21:37:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>@Neil- are you the same Neil from the tilemap.co.uk forum?  I&#39;m using C and not C++... is there any other way?  </p><p>@anonymous- Thank you I&#39;ll try your suggestion</p><p>Thank you so much for responding everyone!</p><p>Update:<br />@Neil - is this what you meant?</p><p>I changed the 4 errors from this:<br />((BITMAP *) myblkstrpt-&gt;fgoff) = abmTiles[myblkstrpt-&gt;fgoff]; </p><p>To this (respectively):</p><p>(myblkstrpt-&gt;fgoff) = <b>(int)</b>abmTiles[myblkstrpt-&gt;fgoff]; </p><p>It compiled and the mappy demo worked; however my game did not.  I get a segmentation fault.  This didn&#39;t have in MSVC 9 or gcc 3.4.5 on Windows but I tracked it down to a variable not being initialized (because it was NULL) and then passed to draw_sprite.  This has been fixed and now the game works just fine with the exception of not having any sound.  The .wav files play just fine in ubuntu but are not playing in allegro.  I&#39;ll have to research this more and post a question later if I can&#39;t find a resolution.</p><p>Thanks again for eveyone&#39;s suggestions!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (agent_smith)</author>
		<pubDate>Thu, 23 Jul 2009 22:35:54 +0000</pubDate>
	</item>
</rss>
