|
is there any method to check the precedence of operators
|
|
|
|
|
|
Just scope your algorithms, and you'll be fine. It's better that way anyway.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
i mean there are two operators such as + and *. is there any logic to check which has higher precedence.
my code is...
char a='+',b='*'
bool result = Higher_Precedence(a,b);
public bool Higher_Precedence(char a , char b)
{
?????..
}
i dont know how to identify the higher precedence
|
|
|
|
|
Precedence would probably be language-specific, but generally they all follow the same order. Someone else already provided a link for C#. And no, there's no logical way to determine precedence (in the form of a function, or otherwise).
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Hi,
if you have two operators, say + and *, you can figure out their precedence by comparing the
results of the following expressions:
A= 2 + 3 * 4
B= 2 + (3 * 4)
C= (2 + 3) * 4
if A==B and B!=C then * has higher precedence than +
if A==C and B!=C then + has higher precedence than *
you can generate C# code dynamically, as an example see this article[^].
Hence you can build a method that determines precedence for any pair of operators in C#.
You can apply similar techniques to other languages as long as dynamic code generation is supported.
Warning: you need to pick good constant values to make sure B!=C (all zeroes or all ones would be a very bad choice).
|
|
|
|
|
Seems like a lot of work when the answer is already very well documented.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
The OP wanted to check, not just read about it... So IMO a little experiment would do.
In a later message he was looking for a method, hence I suggested dynamic code.
If he starts implementing all this, he will learn a thing or two.
|
|
|
|
|
Luc Pattyn wrote: If he starts implementing all this, he will learn a thing or two.
He'll learn that he's wasting his time. I guess that's a valuable lesson, but only if he remembers it the next time.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
thanks Luc Pattyn thats what i wanted..
thanks a lot
|
|
|
|
|
hotthoughtguy wrote: is there any method to check the precedence of operators
There are at least three ways:
- read the documentation;
- try it out;
- enforce precedence by using parentheses.
I know choosing one can be hard. Fortunately you can combine them all.
|
|
|
|
|
Luc Pattyn wrote: I know choosing one can be hard. Fortunately you can combine them all.
In any specific order?
|
|
|
|
|
Mika Wendelius wrote: In any specific order?
Preferably in the order I listed them: learn new things from the documentation, try them so they sink in, then use parentheses every time you realize you have forgotten it (again).
|
|
|
|
|
Luc Pattyn wrote: then use parentheses every time you realize you have forgotten it (again)
I don't know what it's called in english but sounds like the machine that never stops moving and needs no energy from outside. At last it's invented...
|
|
|
|
|
My translator says it's called perpetual motion machine
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Greeeg wrote: perpetual motion machine
Thanks
|
|
|
|
|
Operator precedence is the one thing you don't need to remember when writing code; you can always use parentheses. You do sometimes need to know it when reading existing code without parentheses though.
Mika Wendelius wrote: needs no energy from outside
What makes you think entering parentheses doesn't take any energy?
|
|
|
|
|
Luc Pattyn wrote: Operator precedence is the one thing you don't need to remember
Yeah, I know. Hopefully the OP also uses them after this
Luc Pattyn wrote: What makes you think entering parentheses doesn't take any energy?
Oh well, you're right (pizza + coke at least).... There goes the invention.
|
|
|
|
|
"http://personal.denison.edu/~havill/algorithmics/algs/postfix.pdf"
see in second algorithm in above like thats what i wanted...
thanks Luc pattyn
<div class="ForumMod">modified on Tuesday, December 16, 2008 2:14 AM</div>
|
|
|
|
|
If you wondered what OP means, it's Original Poster.
hotthoughtguy wrote: see in second algorithm in above like thats what i wanted
I think the idea Luc gave you will be usable to implement the logic.
|
|
|
|
|
Hi guys,
I am a little new to threading and I need your help please. I am trying to use a background worker thread and can't get it to work:
Here is a little more explanation on my code
I have a button click where I call a function which has a while loop waiting for a status from a piece of hardware.
In my button click event I am calling this.bgwSign.RunWorkerAsync(); and then I wait for the status.
In my bgwSign_DoWork(), I call the while loop which waits for the status from the hardware
In my while loop I have this.bgwSign.ReportProgress(SignatureStatus, timer1.Interval); I don't think this is correct
Please helpppp!!!
Sameer
|
|
|
|
|
Hi,
it is hard to provide detailed help without seeing actual code.
anyway, having a handler (button click or anything else) wait for something that could take hundreds of milliseconds or more, is not a good approach; for one it blocks the entire GUI, and it also defeats the very purpose of using a background worker.
If you need one, here is a good introduction to BGWs[^].
Hope this helps.
|
|
|
|
|
Here is my code. What I am trying to do is to allow the GUI not to be locked while waiting for the status from the signature capture unit.
private void cmdSign_Click(object sender, System.EventArgs e)
{
this.bgwSign.RunWorkerAsync();
if (SigStatus == 1)
{
cmdMgr.Enabled = true;
cmdSign.Enabled = true;
cmdCancel.Enabled = true;
cmdSign.Focus();
//Application.DoEvents();
}
else if (posSignature.GetVAR("btstate") == "btnCANCEL")
{
cmdMgr.Enabled = true;
cmdSign.Enabled = true;
cmdCancel.Enabled = true;
cmdSign.Focus();
SigStatus = 1;
}
else
{
cmdCancel.Enabled = true;
cmdMgr.Enabled = true;
cmdSign.Enabled = true;
cmdSign.Focus();
SigStatus = 1;
}
}
private void bgwSign_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
timer1.Interval = 60000;
timer2.Enabled = false;
timer2.Stop();
lblInstruction.Text = "Ask customer to sign the signature pad";
//this.Cursor = Cursors.WaitCursor;
cmdNext.Enabled = false;
cmdSign.Enabled = false;
cmdCancel.Enabled = false;
cmdMgr.Enabled = false;
posSignImage = null;
PboxSignature.Image = null;
try
{
//Application.DoEvents();
timer1.Enabled = true;
timer1.Start();
while (posSignature.GetVAR("btstate") != "btnENTER" || posSignature.GetVAR("btstate") != "btnCANCEL" || SigStatus == 0)
{
if (this.bgwSign.CancellationPending)
{
e.Cancel = true;
return;
}
this.bgwSign.ReportProgress(SigStatus, timer1.Interval);
System.Threading.Thread.Sleep(20);
if (posSignature.GetVAR("btstate") == "btnCANCEL" || posSignature.GetVAR("btstate") == "btnENTER" || SigStatus == 1)
{
timer1.Enabled = false;
timer1.Stop();
break;
}
}
}
catch (Exception ex)
{
SigStatus = 1;
//MessageBox.Show(this, "Error in capturing and saving user signature\n\n\n" + ex.Message);
cmdSign.Enabled = true;
cmdCancel.Enabled = true;
cmdMgr.Enabled = true;
}
finally
{
this.Cursor = Cursors.Default;
}
}
Sameer
|
|
|
|
|
Hi,
that is almost impossible to read, lacking the declarations of lots of variables, and not using
proper formatting (with PRE tags).
The initialization of bgwSign is crucial for it to work properly; I doubt you have it all there,
so I don't think your bgwSign_DoWork even started to run. Did you check?
Also bgwSign_DoWork is not allowed to touch any GUI stuff; I guess you are violating that rule a dozen times with timer1, timer2, cmdNext, etc. You must refrain from touching Forms and Controls in any thread (or BGW) other than the main aka GUI thread. If the GUI needs updating, either use the Control.InvokeRequired/Control.Invoke pattern, or put it in the Progress/Completed handlers of the BGW (those are guaranteed to run on the GUI thread).
I suggest you read up on this.
|
|
|
|
|
Thank you Luc, the link you sent is pretty good and I appreciate your comments.
Sameer
|
|
|
|