POV-Ray : Newsgroups : povray.general : Error - missing semicolon when using macro : Re: Error - missing semicolon when using macro Server Time
23 Apr 2024 19:15:04 EDT (-0400)
  Re: Error - missing semicolon when using macro  
From: Tor Olav Kristensen
Date: 21 Jan 2023 17:20:00
Message: <web.63cc63d76284db5a892957989db30a9@news.povray.org>
"Tom A." <met### [at] yahoocom> wrote:
> Error with #local and #macro (?)
>
> I have a macro to turn a part of time into it's own 0-1 value.
> (Useful for running landing geer and doors that take time to go from not open to
> open or deployed).
>
> Here is some test code:
>
>  // problem test
>  #version 3.7;
>
>  #macro subclock2( start, complete, cnt)
>    // converts time (in cnt) between start and complete into
>    // a value between 0 and 1
>
>    #if (cnt< start)
>   0
>    #else
>   #if (cnt>complete)
>     1
>   #else
>     ((cnt - start) / (complete - start))
>   #end
>    #end
>  #end // subclock2
>
>  #local cccc = clock;
>
>  #local c2 = subclock2(.1,.2,cccc);
>
>
> However, when I use it, I get
>
> "C:\POVRay\scenes\ArtDecoShips\errortest.pov" line 11: Parse Error: All
> #declares of float, vector, and color require semi-colon ';' at
> end if the language version is set to 3.5 or higher. Either add the semi-colon
> or set the language version to 3.1 or lower.
>
> Render failed
> -
>
> Yet the actual line where the macro is invoked has a semicolon.
>
> The code can be made to work by putting parentheses around the call:
> #local c2 = ( subclock2(.1,.2,cccc) );
>
> This took me a long time to solve (I hate the error messages - points to the
> macro line, leaving me trying to figure out which call generated the error.)
>
> Did I miss something in the help text?

Hi Tom

I would recommend that you go for the min(max()) solution that Bill just
suggested.

But in the future; if you want to write macros similar to you the one you
posted, I suggest that you write them like this:


#macro Subclock2(Start, Complete, Cnt)

    #if (Cnt <  Start)
        #local Time = 0;
    #else
        #if (Cnt > Complete)
            #local Time = 1;
        #else
            #local Time = ((Cnt - Start)/(Complete - Start));
        #end // if
    #end // if

    Time

#end // macro Subclock2


I.e. return the value of a local variable at the end of the macro.

This will increase the readability of your code, make it easier to debug and
take care of the semicolon problem you experienced.

Here's my take on the min(max()) variant:


#macro Subclock2(Start, Complete, Cnt)

    min(max(0, (Cnt - Start)/(Complete - Start)), 1)

#end // macro Subclock2


Returning a single expression is also ok in my opinion. But beware: Some
expressions should be enclosed in parentheses. Eg. like this: (A + B)

--
Tor Olav
http://subcube.com
https://github.com/t-o-k


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.