Variable type in function call

BlitzMax Forums/BlitzMax Programming/Variable type in function call

Kistjes(Posted 2008) [#1]
Hello,

Is it possible to create a function (or method) with arguments where one argument can be either a custom type or an Int?
Like I would like to use in this code...

When I build this I get the error Unable to convert from 'Object' to 'Int' at line
			piRed = Int(oClr_iRed)



tonyg(Posted 2008) [#2]
You're trying to cast a TColor object to an Int which is never going to work.
For your second SetColorValues statement you need to send clr.pired as the argument.
Alternatively. You can *always* send an object, cast it to TColor and then use the red field.
It's very difficult to see what it is you're actually trying to do though.
<edit> it seems you're trying to have a function with variable parameter statements which is not a good idea really. Nearly everything in Bmax is an object (inc string) *except* Ints/Floats etc


Kistjes(Posted 2008) [#3]
Whow, that's quick! Thanks.

it seems you're trying to have a function with variable parameter statements which is not a good idea really.

Why not?


tonyg(Posted 2008) [#4]
... it doesn't work.


Kistjes(Posted 2008) [#5]
Ah! That makes sence ;-)


Volker(Posted 2008) [#6]
But you can build your own type:
Type Myobject
   Field TC:Tcolor
   Field piRed:int
End type

Then you can return or pass myobject to/from a function.


Kistjes(Posted 2008) [#7]
That's possible, of course.
My idea was setting a color by its RGB (int) values or by another color instance using the same method but I think it is not a very good idea to try to use such a flexible method after all.
This all started when I came to the situation where I wanted to set the color of an object where the data for that color was already stored in a TColor-object. So, I thought instead of:
SetTheColor(clr.GetRed(), clr.Get.Green(), clr.GetBlue())

perhaps I can write:
SetTheColor(clr)

It looked like an elegant implementation but I think it's not. Better write two separate methods.
Sorry, bothering you.


Bremer(Posted 2008) [#8]
How about:

Type TColor

	Field piRed:Int
	Field piGreen:Int
	Field piBlue:Int
	
	Function Create:TColor(iRed:Int = 0, iGreen:Int = 0, iBlue:Int = 0)
		Local o:TColor = New TColor
		o.piRed = iRed
		o.piGreen = iGreen
		o.piBlue = iBlue
		Return o
	End Function

	Method SetColorValues(iRed:Int = 0, iGreen:Int = -1, iBlue:Int = -1 )
		If iGreen = -1 Then
			' use iRed as RGB value
			piRed = (iRed Shr 16) & 255
			piGreen = (iRed Shr 8) & 255
			piBlue = iRed & 255
		Else
			' use seperate values
			piRed = iRed
			piGreen = iGreen
			piBlue = iBlue
		End If
	End Method

	Method GetRed:Int()
		Return piRed
	End Method

	Method GetGreen:Int()
		Return piGreen
	End Method

	Method GetBlue:Int()
		Return piBlue
	End Method

End Type

Local clr:TColor = TColor.Create(200,100,10)
Print clr.getRed()+","+clr.getGreen()+","+clr.getBlue()

clr.SetColorValues($FFFFFF)
Print clr.getRed()+","+clr.getGreen()+","+clr.getBlue()



Czar Flavius(Posted 2008) [#9]
I think it might be easiest just to create 2 methods, one for object and one for ints. After all, when you call the function you know what you are sending.

The original idea can work, you just need to think a bit more out the box.

Did you know you can do this?

Strict

Function test(a = 0, b = 0, c = 0)
	Print "a= "a + ", b=  " + b + ",c=  " + c
End Function

test(,3)
(try it)

So make your color method like this
Method SetColorValues(iColor:TColor = Null, iRed:Int = 0, iGreen:Int = 0, iBlue:Int = 0 )
	If (iColor) ...do code if using object
	Else ...do code if using 3 values
End Method



'call like this for object
o.SetColorValues(o2)
'call like this for 3 ints
o.SetColorValues(, r, b, g)