Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


'Continue' statement usage?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
7 replies to this topic

#1 cozzie   Members   -  Reputation: 1770

Like
0Likes
Like

Posted 28 January 2013 - 05:51 AM

Hi,

 

A probably fairly simple question, but I seem to have usef the c++ 'continue' statement incorrect.

What I do is the following (pseudo code)

 

for(materials=0;materials<nrMaterials++materials)

{

    for(meshes=0;mesh<nrMeshes;++meshes)

    {

        if(materials[material].index[meshes].uses = false) continue;

        // otherwise do thing with this mesh

    }

}

 

What I try to achieve is that 'continue' stops the iteration for meshes[m] and goes to the next iteration in this for loop, meshes[m+1].

From debugging it looks like it's not doing that.

 

Any ideas/ suggestions on what I might be doing wrong?

 



Sponsor:

#2 Waterlimon   Crossbones+   -  Reputation: 2643

Like
1Likes
Like

Posted 28 January 2013 - 05:55 AM

= should be ==? or is that just an error in your post?

Maybe you should post the full code i cant see anything wrong with the current one apart from the syntax errors...

Edited by Waterlimon, 28 January 2013 - 05:57 AM.

o3o


#3 RulerOfNothing   Members   -  Reputation: 1164

Like
2Likes
Like

Posted 28 January 2013 - 06:07 AM

The problem here is that you are using = instead of == (unless this was a typo), so that materials[material].index[meshes].uses = false will actually evaluate to the expression on the right-hand side of the equals sign. This means that the if statement's condition will never evaluate as true and so the continue statement won't be executed.

#4 NightCreature83   Crossbones+   -  Reputation: 3036

Like
7Likes
Like

Posted 28 January 2013 - 06:14 AM

You don't have to use the continue statement for this anyway if you rewrite the code as follows:

for(materials=0;materials<nrMaterials++materials)
{
    for(meshes=0;mesh<nrMeshes;++meshes)
    {
        if(materials[material].index[meshes].uses )
        {
            // otherwise do thing with this mesh
        }
   }
}

This is also more readable as you don't have an arbitrary jump in your code there, breaks and continue statements complicate the flow of your code as when you reread it you have to pay attention that you jump out of the current loop. Whilst my implementation allows you to read the thing in one go, and also there is only a true branch in this if which makes the logic far easier to follow.
Worked on titles: CMR:DiRT2, DiRT 3, DiRT: Showdown, GRID 2, Mad Max

#5 SuperVGA   Members   -  Reputation: 1118

Like
2Likes
Like

Posted 28 January 2013 - 06:42 AM

cozzie, on 28 Jan 2013 - 12:50, said:
for(materials=0;materials<nrMaterials++materials)

The for condition is invalid AFAIK.

cozzie, on 28 Jan 2013 - 12:50, said:
for(meshes=0;mesh<nrMeshes;++meshes)

There's no mesh mentioned earlier in your pseudocode.

cozzie, on 28 Jan 2013 - 12:50, said:
if(materials[material].index[meshes].uses = false) continue;

The = is an assignment, not an equality operator
There's no material mentioned earlier in your pseudocode.
materials is not an array

Please, even when posting pseudocode, be consistent.
We cannot see what the problem is if you obscure it in typos.
Also, when it's a small snippet of code which has flow errors, it's probably better just to post the code.

Edited by SuperVGA, 28 January 2013 - 06:55 AM.


#6 cozzie   Members   -  Reputation: 1770

Like
0Likes
Like

Posted 28 January 2013 - 08:51 AM

Thanks, I'll check the real code to see if the '=' is OK in the real code.

Maybe it's also a good idea to do what nightcreature mentioned (also more readable).



#7 BarrySkellern   Members   -  Reputation: 752

Like
0Likes
Like

Posted 28 January 2013 - 10:00 AM

++ for NightCreature's post: don't test a boolean against true or false, just test the boolean. The boolean itself *is* true or false. If your bool variables are named sensibly the code is more readable without the comparison. Use the 'not' operator to test for false, i.e. if (!something.isDead()) ...


Visit http://www.mugsgames.com - Just released: Stroids, a retro style mini-game for Windows PC.

Mugs Games on Twitter: @MugsGames and Facebook: www.facebook.com/mugsgames

Me on Twitter @BarrySkellern

 


#8 cozzie   Members   -  Reputation: 1770

Like
0Likes
Like

Posted 28 January 2013 - 04:54 PM

Got it, it was not the continue statements causing all the unneccesary state changes, but me running the same function for blended mesh instances going through each effect, material and mesh.

 

The real code was/ is:

 

			for(mat=0;mat<mRenderQueue.mNrMaterials;++mat)
			{
				if(!mRenderQueue.MatUsesEffect(fx, mat)) continue;
				if(!pD3dscene->PreSelectMaterial(mat, fx)) return false;							// 2x SetFloatArray, 1x SetTexture									   							
				for(m=0;m<mRenderQueue.mMaterialData[mat].nrMeshes;++m)		
				{
					mesh = mRenderQueue.mMaterialData[mat].meshIds[m];
					if(!mRenderQueue.MeshUsesEffect(fx, mesh)) continue;
					if(!pD3dscene->mMeshes[mesh].SetBuffers(mD3ddev)) return false;					// 1x SetStreamSource, 1x SetIndices

I might change the 'continue' style by making it more readble

 

if(......)

{

    do stuff

}

 

instead of if(!...) continue;

 

Now off the fix my indices for going through blended mesh instances.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS