POV-Ray : Newsgroups : povray.unofficial.patches : Is it a BUG ??? declaring of Variables ... : Re: Is it a BUG ??? declaring of Variables ... Server Time
1 Sep 2024 20:21:10 EDT (-0400)
  Re: Is it a BUG ??? declaring of Variables ...  
From: Nathan Kopp
Date: 3 Nov 2000 01:10:30
Message: <3a0256d6@news.povray.org>
<wal### [at] informatikuni-hallede> wrote...
> I declared an Array :
>
> #declare A=array[100]
>
> and in the following instruction I want to declare a variable,
> using the "$"-Operator I get an Errormessage ...
>
> $B=1;


Yes, this is known limitation (a bug that is too difficult to fix that I
won't bother).

The following three code snipets will work:

#declare a=array[16]
#declare b=1;

$a=array[16]
$b=1;

$a=array[16]
#declare b=1;  //I'm pretty sure this will work

The following one will not:

#declare a=array[16]
$b=1;

The problem occurs when you use of a #declare that does NOT end with a
semicolon, followed by a $.

Here is an explanation of why it acts this way and why I haven't fixed it:

All "#" directives in POV (such as #declare and #local) are handled
specially.  When the Get_Token() function (responsible for reading and
interpreting the character input) finds a "#" character, it interrupts what
it is doing and calls the Parse_Directive() function.  Regular scene parsing
is suspended until POV is done parsing the directive.

Now, just like the rest of the parser, Parse_Directive() uses Get_Token() to
get its tokens. This means that if POV wasn't careful, it could get a stack
overflow if you have a long string of #declares one right after another.
Why?  Well, if Get_Token() finds a "#" (such as in my first code snipet)
while it is parsing a #declare, it calls Parse_Directive().

The trick is to make Parse_Directive() contain a loop, and add a special
case for Get_Token() so it won't allow a re-entry of Parse_Directive().  If
Parse_Directive() is active and Get_Token() hits a "#", it will ignore it
and allow Parse_Directive() to take care of it.

I built this same looping capability into the "$" replacement for
"#declare".  However, the two loops are independent from each other.
Because of the way Parse_Directive() works, I'm pretty sure that you can
enter Parse_Directive() from my "$" replacement, but you can't go the other
way.

The best solution would be to force all #declares to end with a semicolon,
so the parser knows exactly when the directive is complete and it can return
from Parse_Directive() without having to have that messy loop and special
re-entry flag.  Of course, that would break more scenes, but I think it
would be best.  It would also add consistency to the parser, because now you
need a semicolon for #declaring floats and vectors, but you CANNOT have a
semicolon when declaring arrays, textures, pigments, etc.  That semicolon
would be useful for avoiding accidental layered textures, too.

-Nathan


Post a reply to this message

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