Note that there are some explanatory texts on larger screens.

plurals
  1. POIs there a better way of returning a value in c than having multiple return statements?
    primarykey
    data
    text
    <p>In <code>getFieldSignExtended(int,int,int)</code>, I have <code>if-else</code> statements inside <code>if-else</code> statements. I have <code>int</code> result as a global variable of this function. Depending on where program control flows, I want this function to return <code>result2</code>.</p> <p>At first I had one return statement at the bottom of this function, that didn't work and I found out that scope in <code>C</code> is not like in <code>Java</code>. Thus I <code>return 1;</code> at the bottom of the function, and I have 8 <code>return result2</code> statements in the <code>if-else</code> blocks.</p> <p>Is there a better way to organize this function? I don't want to nest <code>if-else</code> blocks and I want as few <code>return</code> statements as possible.</p> <p>This is homework, but it was already graded and I'm just correcting a few errors that came up.</p> <p><code>getFieldSignExtended(int,int,int)</code> gets a bitfield from value from hi to lo inclusive (hi and lo can be == to eachother, etc.) and sign extends it (based on testing the sign bit). All of this code deals with 2's complement.</p> <p>If you find any other big C convention mistakes, I'll be glad to correct them.</p> <p>Thanks in advance. </p> <pre><code>int getFieldSignExtended (int value, int hi, int lo) { unsigned int result = 0; int result2 = 0; unsigned int mask1 = 0xffffffff; int numberOfOnes = 0; if((hi == 31) &amp;&amp; (lo == 0)) { result2 = value; return result2; } if((lo == 31) &amp;&amp; (hi == 0)) { result2 = value; return result2; } else if(hi &lt; lo) { // Compute size of mask (number of ones). numberOfOnes = lo-hi+1; mask1 = mask1 &lt;&lt; (32-numberOfOnes); mask1 = mask1 &gt;&gt; (32-numberOfOnes); mask1 = mask1 &lt;&lt; hi; result = value &amp; mask1; result = result &gt;&gt; hi; if(result &amp; (0x1 &lt;&lt; (numberOfOnes-1))){ // if negative int maskMinus = (0x1 &lt;&lt; numberOfOnes); maskMinus = maskMinus -1; maskMinus = ~maskMinus; result2 = maskMinus | result; } } else if(lo &lt; hi) { // The number of ones are at the 'far right' side of a 32 bit number. numberOfOnes = hi-lo+1; mask1 = mask1 &gt;&gt; (32-numberOfOnes); mask1 = mask1 &lt;&lt; lo; result = value &amp; mask1; result = result &gt;&gt; lo; if(result &amp; (0x1 &lt;&lt; (numberOfOnes-1))){ //if negative int maskMinus = (0x1 &lt;&lt; numberOfOnes); maskMinus = maskMinus -1; maskMinus = ~maskMinus; result2 = maskMinus | result; return result2; } }else{ // hi == lo unsigned int mask2 = 0x1; // Move mask2 left. mask2 = mask2 &lt;&lt; hi; result = mask2 &amp; value; result = result &gt;&gt; hi; if(result == 0x1){ result2 = 0xffffffff; return result2; } else{ result2 = 0x0; return result2; } } return 1; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload