![](/i/fill.gif) |
![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
"posfan12" <nomail@nomail> wrote:
> I'm using RC7 by the way.
>
>
> "posfan12" <nomail@nomail> wrote:
> > I'm trying to write a macro that randomly either returns -1 or 1. This is what I
> > have:
> >
> > #macro randsign()
> > #if (rand(HPlanet_Seed_Value) > 0.5)
> > 1
> > #else
> > -1
> > #end
> > #end
> >
> > However, POVray stops rendering and says "All #declares of float, vector, and
> > color require semi-colon ';' at end if the language version is set to 3.5 or
> > higher."
> >
> > What am I doing wrong? Adding the semi-colon causes the scene to quit for other
> > reasons.
Better thsi one:
#declare Zufall=seed(317);
#macro randsign()
#local Z1=rand(Zufall)-0.5;
#if (Z1=0) Z1=0.1; #end // avoid division by zero
Z1/abs(Z1)
#end
#declare Count=0;
#while(Count<100)
#declare ZufallsZahl=randsign();
#debug concat("Zufallszahl: ",str(ZufallsZahl,8,4),"\n")
#declare Count=Count+1;
#end
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
"MichaelJF" <mi-### [at] t-online de> wrote:
> "posfan12" <nomail@nomail> wrote:
> > I'm using RC7 by the way.
> >
> >
> > "posfan12" <nomail@nomail> wrote:
> > > I'm trying to write a macro that randomly either returns -1 or 1. This is what I
> > > have:
> > >
> > > #macro randsign()
> > > #if (rand(HPlanet_Seed_Value) > 0.5)
> > > 1
> > > #else
> > > -1
> > > #end
> > > #end
> > >
> > > However, POVray stops rendering and says "All #declares of float, vector, and
> > > color require semi-colon ';' at end if the language version is set to 3.5 or
> > > higher."
> > >
> > > What am I doing wrong? Adding the semi-colon causes the scene to quit for other
> > > reasons.
>
> I tried your code, but got no idea about this semi-colon issue.
>
> This one works for me:
> #declare Zufall=seed(317);
>
> #macro randsign()
> #local Z1=rand(Zufall)-0.5;
> Z1/abs(Z1)
> #end
>
> #declare Count=0;
> #while(Count<100)
> #declare ZufallsZahl=randsign();
> #debug concat("Zufallszahl: ",str(ZufallsZahl,8,4),"\n")
> #declare Count=Count+1;
> #end
>
> Best regards,
> Michael
Should I file a bug report?
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Sorry again:
#declare Zufall=seed(317);
#macro randsign()
#local Z1=rand(Zufall)-0.5;
#if (Z1=0) #local Z1=0.1; #end // avoid division by zero
Z1/abs(Z1)
#end
#declare Count=0;
#while(Count<100)
#declare ZufallsZahl=randsign();
#debug concat("Zufallszahl: ",str(ZufallsZahl,8,4),"\n")
#declare Count=Count+1;
#end
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
> #macro randsign()
> #if (rand(HPlanet_Seed_Value) > 0.5)
> 1
> #else
> -1
> #end
> #end
It seems you can't do that (IDK why - maybe a bug, or more likely a
"feature" of the parser). In fact you can't even do this:
#macro A()
#if(true)
1
#end
#end
It doesn't like having anything to return inside a #if within a #macro
A solution is to just use a temporary variable:
#macro randsign()
#if (rand(HPlanet_Seed_Value) > 0.5)
#local temp = 1;
#else
#local temp = -1;
#end
temp
#end
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
"posfan12" <nomail@nomail> wrote:
>
> Should I file a bug report?
I'm not sure, if it is a bug. May be we both have overlooked something. I wanted
to provide you with a quick workaround.
Best regards,
Michael
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
posfan12 <nomail@nomail> wrote:
> #macro randsign()
> #if (rand(HPlanet_Seed_Value) > 0.5)
> 1
> #else
> -1
> #end
> #end
It's not a bug, but by design (even though it might not be intuitive.)
You have to assign the value you want to "return" from the macro to a
local variable and then have the name of that variable as the last thing
in the macro.
--
- Warp
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
> I'm trying to write a macro that randomly either returns -1 or 1. This is what I
> have:
>
> #macro randsign()
> #if (rand(HPlanet_Seed_Value) > 0.5)
> 1
> #else
> -1
> #end
> #end
>
> However, POVray stops rendering and says "All #declares of float, vector, and
> color require semi-colon ';' at end if the language version is set to 3.5 or
> higher."
>
> What am I doing wrong? Adding the semi-colon causes the scene to quit for other
> reasons.
>
>
It may depend on how you call your macro.
You can call it this way:
#declare Var= randsign();
Or edit the macro this way:
#macro randsign()
#if (rand(HPlanet_Seed_Value) > 0.5)
1;
#else
-1;
#end
#end
and sue it this way:
#declare Val= randsign()
OR, use it in some calculation:
#declare Val= randsign()* Value;
Alain
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Warp <war### [at] tag povray org> wrote:
> posfan12 <nomail@nomail> wrote:
> > #macro randsign()
> > #if (rand(HPlanet_Seed_Value) > 0.5)
> > 1
> > #else
> > -1
> > #end
> > #end
>
> It's not a bug, but by design (even though it might not be intuitive.)
>
> You have to assign the value you want to "return" from the macro to a
> local variable and then have the name of that variable as the last thing
> in the macro.
>
> --
> - Warp
>I have guessed that we had overlooked something. But is this issue really mentioned
within the documentary? A document
ary which is still closed to the users right now. And called a Wiki ...
Best regards,
Michael
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Warp <war### [at] tag povray org> wrote:
> It's not a bug, but by design (even though it might not be intuitive.)
>
> You have to assign the value you want to "return" from the macro to a
> local variable and then have the name of that variable as the last thing
> in the macro.
>
> --
> - Warp
Awesome, thanks!
Mike
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Warp <war### [at] tag povray org> wrote:
> It's not a bug, but by design (even though it might not be intuitive.)
Btw, with "by design" I don't mean that the developers deliberately
chose to make macros work like that on purpose, while discarding
alternatives. It's more like macros were tacked onto the existing SDL
parser (the SDL parser has existed for a lot longer than #macros), and
the way in which it parses has this kind of side-effect, and it was
decided to leave it as it is. It may not be the most intuitive way
of "returning a value" (if you can call it as such) from a macro, but
it works with the current SDL parser as it was originally designed.
I think that making macros work more intuitively in this regard would
have required too large of a refactoring job of the entire parser.
There are other curious side-effects of how the SDL parser works, some
of them beneficial, and which are relatively little-known.
For example, if you read values from a file using #read, said file
can have #declare statements in it, and they will be parsed normally
(as if they had been #included.) It's just a side-effect of using the
same SDL parser to implement #read.
--
- Warp
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |