Jump to content

  • Log In with Google      Sign In   
  • Create Account

Problem with functions!


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
10 replies to this topic

#1   Members   

174
Like
0Likes
Like

Posted 23 July 2012 - 06:54 AM

I would like to create buttons. And when you click them, do some functions.
But i have problem with button actions Posted Image.

Some of my code:

//---- Header File----
class Button{
	public:
		//variables initiating like float x,y,z...
		void func(void);
		void draw(){
			//Some drawing
		}
		void CheckButtonClick(float mx, float my,int key,int state){
			if(mx >= x && mx <= x+w &&
			   my >= y && my <= y+h &&
			   state == 0 && key == 0){
				  click = true;
				  func();
			}else
				  click = false;
		}
};

//----Main File----

void AddButton(Button &button,string text,void func(),float x,float y,float z,float w,float h,float s,float r,float g,float b,GLuint tex,GLuint clicktex){
	 button.tex = tex;
	 button.clicktex = clicktex;
	 button.func() = func();
	 button.textsize = s;
	 button.text = text;
	 button.x = x;
	 button.y = y;
	 button.z = z;
	 button.w = w;
	 button.h = h;
	 button.color[0] = r;
	 button.color[1] = g;
	 button.color[2] = b;
}


Button button_file,

void close(){
	 exit(0);
}


void InitRendering(){

	_buttondark = loadTexture ("Data/IvoGui/buttondark.tga");
	_buttondark_click = loadTexture ("Data/IvoGui/buttondark_click.tga");

	AddButton(button_help,"Pomoc",close(),133,5,0.001f,64,16,0.9f,1.0f,1.0f,1.0f,_buttondark,_buttondark_click);
}

It gives me an error:
invalid use of void expression

Without button actions everything works fine.
Can you help me with this actions?

Thanks in advance.

Edited by iwoplaza, 23 July 2012 - 06:55 AM.


#2   Members   

13102
Like
0Likes
Like

Posted 23 July 2012 - 07:06 AM

Button button_file,

I think you mistyped a semicolon here, but I'm pretty sure it's a copy/paste mistake. This is followed by a "void", which explains the error message (C++ compiler errors generally make no sense if you made a typo, so you have to look through to try and find it), but I doubt this is the source of the error, could you post the revised code if this is so?

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”


#3   Members   

174
Like
0Likes
Like

Posted 23 July 2012 - 07:11 AM

Button button_file,

I think you mistyped a semicolon here, but I'm pretty sure it's a copy/paste mistake. This is followed by a "void", which explains the error message (C++ compiler errors generally make no sense if you made a typo, so you have to look through to try and find it), but I doubt this is the source of the error, could you post the revised code if this is so?


"Button button_file," was a copy/paste mistake Posted Image. But if you want i can give you code that is needed (some of header file, some of main that is about button), or a full code for a further investigation.

Edited by iwoplaza, 23 July 2012 - 07:15 AM.


#4   Moderators   

10730
Like
1Likes
Like

Posted 23 July 2012 - 07:15 AM

This is not legal:
button.func() = func();
You cannot assign to a function. In your current code, you would have to create a concrete implementation of Button::func.

If you have a newish compiler you can handle this using std::function. If you are using an older compiler and cannot upgrade, boost::function is an option. You could also fall back to function pointers for simple functions, and a pure virtual interface class for more complex scenarios.

#5   Members   

174
Like
0Likes
Like

Posted 23 July 2012 - 07:17 AM

What you mean by concrete implementation of Button::func.

#6   Moderators   

10730
Like
2Likes
Like

Posted 23 July 2012 - 07:22 AM

You have declared a function. C++ requires this function to have a single definition.

You appear to want to design a callback system, where you can given different Buttons different functions to call when they are clicked. C++ doesn't have "first class" support for this at the language level, but it can be simulated using the approaches I've outlined.

#7   Members   

174
Like
-4Likes
Like

Posted 23 July 2012 - 07:26 AM

Please proceed, and write modified piece of code.

#8   Moderators   

10730
Like
2Likes
Like

Posted 23 July 2012 - 07:28 AM

I gave you lots of starting points. What have you tried?

#9   Members   

7587
Like
2Likes
Like

Posted 23 July 2012 - 07:31 AM

Please proceed, and write modified piece of code.


function pointers: http://www.cprogramm...n-pointers.html (C way of doing it, only use this if the other two options are unsuitable for you)
std::function: http://en.cppreferen...tional/function (Use this if your compiler is modern enough)
boost::function: http://www.boost.org....html#id1545628

Edited by SimonForsman, 23 July 2012 - 07:33 AM.

I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!

#10   Members   

174
Like
-2Likes
Like

Posted 23 July 2012 - 09:09 AM

Thanks to everyone, but i figured it out for myself Posted Image.

#11   Moderators   

10730
Like
2Likes
Like

Posted 23 July 2012 - 10:33 AM

Great. Another aspect of community etiquette is to post the solution. This way, people who search the forums later on know what worked for you.




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.