1. Error Type Check Error

I'm getting a type check error when I should not be. Run this code and let
me know if you have problems, too...

Eventually, it will say "X ERROR = 1000", but 1000 is a valid X value!!!!!!

The type() below has become verbose for debugging purposes... :)

include get.e

sequence map
integer map_size

map_size = 1000

map = repeat(0,map_size) -- a row of map_size columns
map = repeat(map,map_size) -- map_size rows

type map_point(sequence s)
integer good
	good = (1=1)
	if length(s) != 2 then
		puts(1,"LENGTH ERROR!\n")
		good = (1=2)
	end if
	if s[1] > map_size then
		puts(1,"X ERROR = ")
		?s[1]
		?map_size
		good = (1=2)
	end if
	if s[2] > map_size then
		puts(1,"Y ERROR = ")
		?s[2]
		?map_size
		good = (1=2)
	end if
	return good
end type

procedure set_point( map_point xy, integer depth )
	map[xy[2]][xy[1]] = depth
end procedure

procedure set_line( map_point start_point, map_point end_point, integer depth )
integer x, y, c
sequence stemp, slope, point

	if start_point[1] > end_point[1] then
		-- make sure the leftmost point (lowest x value) is first
		stemp = start_point
		start_point = end_point
		end_point = stemp
	end if
	x = start_point[1]-end_point[1] -- -4
	y = start_point[2]-end_point[2] -- -1
	
	if x < 0 then
		x = -x
		y = -y
	end if
	
	if x < y then
		slope = {x/y,1}
		c = y
	else
		slope = {1,y/x}
		c = x
	end if
	point = start_point
	set_point( point, -600 )
	for t=1 to c do
		point = point + slope
		set_point( point, -600 )
	end for
end procedure

procedure plot_big_line()
integer y, jump
sequence last_point, plot_point, orig_point

	y = rand( map_size )
	orig_point = {1,y}
	last_point = orig_point
	
	set_point( last_point , -600 )

	for t=2 to 1000 do
		jump = rand(5)
		if rand(2) = 1 then
			y += jump
		else
			y -= jump
		end if
		if y < 1 then
			y = 1
		end if
		if y > map_size then
			y = map_size
		end if
		plot_point = {t,y}
		if jump = 1 then
			set_point( plot_point, -600 )
		else
			set_line(last_point,plot_point,-600)
		end if
		last_point = plot_point
	end for
	
	printf(1,"Plotted from (%d,%d) to (%d,%d)\n",orig_point & last_point)
	
end procedure

procedure main()
integer key

	key = 'Y'
	while find(key,"Yy") do
		plot_big_line()
		puts(1,"\tPress 'Y' to do it again.\n")
		key = wait_key()
	end while

end procedure

main()


new topic     » topic index » view message » categorize

2. Re: Error Type Check Error

CK,

In set_line() you are adding a floating point value with each iteration in the
loop. I think you already know what this means, hehehe...

What I would do is drop the end pixel from the loop but set it directly
afterwards
outside the loop - No problemo!


Mike


c.k.lester wrote:
> 
> I'm getting a type check error when I should not be. Run this code and let
> me know if you have problems, too...
> 
> Eventually, it will say "X ERROR = 1000", but 1000 is a valid X value!!!!!!
> 
> The type() below has become verbose for debugging purposes... :)
> 
> }}}
<eucode>include get.e
> 
> sequence map
> integer map_size
> 
> map_size = 1000
> 
> map = repeat(0,map_size) -- a row of map_size columns
> map = repeat(map,map_size) -- map_size rows
> 
> type map_point(sequence s)
> integer good
> 	good = (1=1)
> 	if length(s) != 2 then
> 		puts(1,"LENGTH ERROR!\n")
> 		good = (1=2)
> 	end if
> 	if s[1] > map_size then
> 		puts(1,"X ERROR = ")
> 		?s[1]
> 		?map_size
> 		good = (1=2)
> 	end if
> 	if s[2] > map_size then
> 		puts(1,"Y ERROR = ")
> 		?s[2]
> 		?map_size
> 		good = (1=2)
> 	end if
> 	return good
> end type
> 
> procedure set_point( map_point xy, integer depth )
> 	map[xy[2]][xy[1]] = depth
> end procedure
> 
> procedure set_line( map_point start_point, map_point end_point, integer depth
> )
> integer x, y, c
> sequence stemp, slope, point
> 
> 	if start_point[1] > end_point[1] then
> 		-- make sure the leftmost point (lowest x value) is first
> 		stemp = start_point
> 		start_point = end_point
> 		end_point = stemp
> 	end if
> 	x = start_point[1]-end_point[1] -- -4
> 	y = start_point[2]-end_point[2] -- -1
> 	
> 	if x < 0 then
> 		x = -x
> 		y = -y
> 	end if
> 	
> 	if x < y then
> 		slope = {x/y,1}
> 		c = y
> 	else
> 		slope = {1,y/x}
> 		c = x
> 	end if
> 	point = start_point
> 	set_point( point, -600 )
> 	for t=1 to c do
> 		point = point + slope
> 		set_point( point, -600 )
> 	end for
> end procedure
> 
> procedure plot_big_line()
> integer y, jump
> sequence last_point, plot_point, orig_point
> 
> 	y = rand( map_size )
> 	orig_point = {1,y}
> 	last_point = orig_point
> 	
> 	set_point( last_point , -600 )
> 
> 	for t=2 to 1000 do
> 		jump = rand(5)
> 		if rand(2) = 1 then
> 			y += jump
> 		else
> 			y -= jump
> 		end if
> 		if y < 1 then
> 			y = 1
> 		end if
> 		if y > map_size then
> 			y = map_size
> 		end if
> 		plot_point = {t,y}
> 		if jump = 1 then
> 			set_point( plot_point, -600 )
> 		else
> 			set_line(last_point,plot_point,-600)
> 		end if
> 		last_point = plot_point
> 	end for
> 	
> 	printf(1,"Plotted from (%d,%d) to (%d,%d)\n",orig_point & last_point)
> 	
> end procedure
> 
> procedure main()
> integer key
> 
> 	key = 'Y'
> 	while find(key,"Yy") do
> 		plot_big_line()
> 		puts(1,"\tPress 'Y' to do it again.\n")
> 		key = wait_key()
> 	end while
> 
> end procedure
> 
> main()</eucode>
{{{

new topic     » goto parent     » topic index » view message » categorize

3. Re: Error Type Check Error

Mike wrote:
> 
> In set_line() you are adding a floating point value with each iteration in the
> loop. I think you already know what this means, hehehe...
> 
> What I would do is drop the end pixel from the loop but set it directly
> afterwards
> outside the loop - No problemo!

That confused me at first because I was printing the values and it was
1000. But now that you mention it, if I print it as a floating point, I bet
I'll see the fractional part, eh? I knew that was it but I sabotaged myself. :)

THANKS! :)

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu