Posted by
GuShH on September 5, 2009
This is a tool that I’ve been using for quite a long while, just recently I fixed a small bug in the regexp and I thought it was time to share it.
For those of you using the official IDE, there’s no real solution to this “problem”. When you’re working on something small, it’s not a big deal to define a couple of declares here and there… However, on bigger code this becomes a real issue!. So why waste the time switching between IDEs or doing it by hand?…
Grab it and let me know how it runs! (nasty ugly source included).
The tool is very simple to install, I recommend you unzip directly into your PB directory and configure it as follows:

That’s it. You’re ready to declar’em!.
Cheers.
Posted by
GuShH on July 13, 2009
Heres an example of what I call “macro templates” in PureBasic. A template encapsulates certain functionality, allowing you to dynamically generate the code in a flexible manner.
This example implements a bare-bones n-vector library using a structure and a static array:
Macro Vector_Register( _n, _type )
Structure VECTOR#_n#_type
vector._type[_n]
EndStructure
Procedure._type Vector#_n#_type#_Add( *r.VECTOR#_n#_type, *a.VECTOR#_n#_type, *b.VECTOR#_n#_type )
Define.i i
For i=0 To _n - 1
*r\vector[i] = *a\vector[i] + *b\vector[i]
Next
EndProcedure
Procedure._type Vector#_n#_type#_Subtract( *r.VECTOR#_n#_type, *a.VECTOR#_n#_type, *b.VECTOR#_n#_type )
Define.i i
For i=0 To _n - 1
*r\vector[i] = *a\vector[i] - *b\vector[i]
Next
EndProcedure
Procedure._type Vector#_n#_type#_Divide( *r.VECTOR#_n#_type, *a.VECTOR#_n#_type, *b.VECTOR#_n#_type )
Define.i i
For i=0 To _n - 1
If *b\vector[i] <> 0.0 And *a\vector[i] <> 0.0
*r\vector[i] = *a\vector[i] / *b\vector[i]
EndIf
Next
EndProcedure
Procedure._type Vector#_n#_type#_Multiply( *r.VECTOR#_n#_type, *a.VECTOR#_n#_type, *b.VECTOR#_n#_type )
Define.i i
For i=0 To _n - 1
*r\vector[i] = *a\vector[i] * *b\vector[i]
Next
EndProcedure
Procedure._type Vector#_n#_type#_DotProduct( *a.VECTOR#_n#_type, *b.VECTOR#_n#_type )
Define.i i
Define._type result
For i=0 To _n - 1
result + ( *a\vector[i] * *b\vector[i] )
Next
ProcedureReturn result
EndProcedure
Procedure._type Vector#_n#_type#_Length( *v.VECTOR#_n#_type )
ProcedureReturn Sqr( Vector#_n#_type#_DotProduct( *v, *v ) )
EndProcedure
Procedure._type Vector#_n#_type#_Distance( *a.VECTOR#_n#_type, *b.VECTOR#_n#_type )
Define.VECTOR#_n#_type temp
Vector#_n#_type#_Subtract( temp, *a, *b )
ProcedureReturn Vector#_n#_type#_Length( temp )
EndProcedure
Procedure.s Vector#_n#_type#_Debug( *v.VECTOR#_n#_type, Decimals.i=#PB_Default )
Define.i i
Define.s tmp = "["
For i=0 To _n-1
tmp + StrF( *v\vector[i], Decimals.i )
If i <> _n-1
tmp + ", "
EndIf
Next
tmp + "]"
Debug tmp
ProcedureReturn tmp
EndProcedure
EndMacro
It might look strange/complicated at first, but once you read it you’ll realize it’s fairly simple.
Let’s see the usage of this particular template:
Vector_Register(3, f ) ; Register a float "vec3".
Define.VECTOR3f a,b,c ; Define a few vectors with the new structure.
a\vector[0] = 10.0
a\vector[1] = 20.0
a\vector[2] = 30.0
b\vector[0] = 100.0
b\vector[1] = 200.0
b\vector[2] = 300.0
Vector3f_Add(c, a, b) ; c = a + b
Vector3f_Debug(c) ; show each element using the debug output.
Debug Vector3f_DotProduct( a, b )
Debug Vector3f_Length( a )
Debug Vector3f_Distance( a, b )
Cool, huh?. And you can define any amount of elements with any basic type.
Of course we sacrificed speed for flexibility. In those cases where we have to define n-vectors, this would be an ideal solution. For everything else, I suggest a specific library, such as my vec3 macro lib.
Using this principle you can abstract almost anything, within reason. One good example is my object factory template. Ideally one would have arrays, lists, etc. Implemented in this very same way, in such case the possibilities would be endless and you’d be able to define dynamic lists/arrays inside structures, etc.
I strongly advice you to implement at least one of those templates, even if it’s just for an exercise.
Having the extra tools can’t hurt!
Cheers.
Posted by
GuShH on July 2, 2009
As usual, I was browsing the PureBasic forums to see what was new, nothing much (heh…) but something caught my attention, the fact that some user requested for the IDE’s message dialogs to be “centered” ( because he had multiple displays and the messages would appear in between them ) just to get shit-faced by an actual staff member!
You can’t just say “it’s Microsoft’s fault” — Are you in some sort of mac-only cleanse?, What’s your #%&%#$ problem?!
Those who “pass the ball” (as the user suggested) are part of the problem. You, being a programmer can certainly code a simple CBT hook, right?. Are you against hooks, perhaps – you are a purist, I hear… Sorry, but sometimes solutions are “dirty” and you have to live with them.

Just for the record, I too use a split-screen and I find it annoying that dialog boxes are not centered to their parent.
More…
Posted by
GuShH on June 13, 2009
Submitted my GeSHi language file for PureBasic to the GeSHi author, I’ve been using it for a while now and I thought it was about time to share it. I couldn’t however validate it since I’m short in time at the moment — I’m just posting everything I couldn’t post in the last weeks today.
Let’s hope it becomes part of their project now. I’ll certainly keep it up to date when I get the time for it. And let’s face it, their lib is pretty much the standard for PHP syntax highlighting!.
Come to think of it, I think this current CSS style is killing my syntax highlighting… Hmm. Another one for the to-do list.
Cheers.
Posted by
GuShH on June 13, 2009
Random floats are kind of a mystical thing in PB, however it can be achieved to a certain degree without having to stack calls on a per decimal fashion.
Here is a simple implementation that will get you going, this is meant specifically for games but it could find other uses…
Macro RandomF() ; returns a random float from 0.0 to 1.0
( Random(64325) * 0.00001555 )
EndMacro
Macro RandomFC() ; returns a random float from -1.0 to 1.0
( 2.0 * ( RandomF() - 0.5 ) )
EndMacro
Try it out yourself, if you need a wider range of numbers just multiply the result by a certain factor. I use this and other similar macros for most of my float random needs in PB. Should you need to stack the calls, just make procedures out of the macros.
Similar routines are found inside the Quake3 sources if you care to read them (hint: if you look carefuly there is a comment line inside the game source that reads “// What the fuck?” — Just priceless, seriously).
Cheers.