Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Wrong #defined calculated value
#1
I think there's something I'm missing about the way #define values are calculated, look:

Code:
#define screenFirstCol 0
#define screenLastCol 31
#define borderFirstCol screenFirstCol
#define borderLastCol screenLastCol
#define oWinFirstCol  borderFirstCol+1
#define oWinLastCol borderLastCol-1
' Wrong result, 32 instead of 30:
#define oWinWidth oWinLastCol-oWinFirstCol+1

cls
print "Expected values in cramps:"
print
print "screenFirstCol(0)=";screenFirstCol
print "screenLastCol(31)=";screenLastCol
print "borderFirstCol(0)=";borderFirstCol
print "borderLastCol(31)=";borderLastCol
print "oWinFirstCol(1)=";oWinFirstCol
print "oWinLastCol(30)=";oWinLastCol
' Wrong result, 32 instead of 30:
print "oWinWidth(30)=";oWinWidth

pause 0
stop

What's the problem?

I think #defined values are simple labels calculated by the preprocessor. Is it right? Is there any limit about the depth of the calculated values?
Reply
#2
Not sure what's going on there. I get the same result.

It can't be because it's three things -

Code:
#define test 1+2+3
print test

comes back with 6, correctly.

The ic basically shows "print 32" as that last line that should be 30, so I can't easily drill down any further - the preprocessor is definitely making that set into a 32 though.
Reply
#3
programandala.net Wrote:I think there's something I'm missing about the way #define values are calculated, look:
Code:
#define screenFirstCol 0
#define screenLastCol 31
#define borderFirstCol screenFirstCol
#define borderLastCol screenLastCol
#define oWinFirstCol  borderFirstCol+1
#define oWinLastCol borderLastCol-1
' Wrong result, 32 instead of 30:
#define oWinWidth oWinLastCol-oWinFirstCol+1
Let me check it:
  • borderFirstCol == 0
  • borderLasCol == 31
  • oWinFirstCol == 0 + 1 // Note: always expanded
  • oWinLastCol == 31 - 1
  • oWinWidth == 31 - 1 - 0 + 1 + 1 // This is the defined result
So oWinWidth == 32
Try using parenthesis in the #defines. The preprocessor does not calculate, just replace labels with code. With parenthesis:
Code:
#define screenFirstCol 0
#define screenLastCol 31
#define borderFirstCol screenFirstCol
#define borderLastCol screenLastCol
#define oWinFirstCol  (borderFirstCol+1)
#define oWinLastCol (borderLastCol-1)
' Wrong result, 32 instead of 30:
#define oWinWidth (oWinLastCol-oWinFirstCol+1)

This gives oWinWidth == ((31 - 1) - (0 + 1) + 1) which effectively is reduced to 30.
This also happens in C.

Quote:I think #defined values are simple labels calculated by the preprocessor. Is it right? Is there any limit about the depth of the calculated values?
No limit (only available memory).
Reply
#4
boriel Wrote:The preprocessor does not calculate, just replace labels with code. With parenthesis:

I see. The label is not replaced by the calculation, but by its raw content. Thank you.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)