This is a read-only snapshot of the ComputerCraft forums, taken in April 2020.
CrazyCoke's profile picture

HELP PLEASE "attempt to compare nil with number"

Started by CrazyCoke, 22 December 2014 - 04:34 PM
CrazyCoke #1
Posted 22 December 2014 - 05:34 PM
I was trying to make a program that will tell me if a number is available, but i have one last error code …

…:18: attempt to compare nil with number


local w = 720 or 722 or 723 or 724 or 726 or 727 or 728 or 729
local k = 719
local g = 900
-- os.pullEvent = os.pullEventRaw
term.clear()
term.setCursorPos(1,1)
print("")
print("With this program can you check if a wireless number is available. Type in a number between 719 and 900. Don't use space bar !!")
print("")
write("Number: ")

while true do
  x = tonumber(read())

  if x > k and x < g and x ~= w then
	term.clear()
	term.setCursorPos(1,1)
	print("")
	textutils.slowPrint("This number is available! Have a nice working day!")
	sleep(2)
	os.reboot()
break

  else

	if x == w then
	  term.clear()
	  term.setCursorPos(1,1)
	  print("")
	  textutils.slowPrint("This number is is already in use, try another number!")
	  print("")
	  textutils.slowWrite("Number: ")
	
	elseif x <= k then
	  term.clear()
	  term.setCursorPos(1,1)
	  print("")
	  textutils.slowPrint("This number is to low, it has to be a number between 719 and 900!")
	  print("")
	  textutils.slowWrite("Number: ")
  
	elseif x >= g then
	  term.clear()
	  term.setCursorPos(1,1)
	  print("")
	  textutils.slowPrint("This number is to high, it has to be a number between 719 and 900!")
	  print("")
	  textutils.slowWrite("Number: ")
  
	elseif type(x) == "number" then
	  term.clear()
	  term.setCursorPos(1,1)
	  print("")
	  textutils.slowPrint("This is not a number or you used space bar, try again!")
	  print("")
	  textutils.slowWrite("Number: ")
	end
  end
end
KingofGamesYami #2
Posted 22 December 2014 - 06:00 PM

local w = 720 or 722 or 723 or 724 or 726 or 727 or 728 or 729

Is exactly the same as

local w = 720

Your problem:

  x = tonumber(read())

x = nil if read() doesn't return a numerical value (ei you enter "hi" instead of '3')
CrazyCoke #3
Posted 22 December 2014 - 06:51 PM

local w = 720 or 722 or 723 or 724 or 726 or 727 or 728 or 729
Is exactly the same as
local w = 720

Oh damn, i thought that if i type 720 or 723 that it will say "This number is is already in use, try another number!"
How can i simple solve this problem ??


Your problem:
  x = tonumber(read())
x = nil if read() doesn't return a numerical value (ei you enter "hi" instead of '3')

And how can i simple solve this problem ??
KingofGamesYami #4
Posted 22 December 2014 - 07:32 PM
1st problem - use a table lookup.


local blacklist = {
  [720] = true,
  [722] = true,
  --#and so on
}

Then, to see if the number is taken,

if blacklist[ num ] then
  --#it's blacklisted
else
  --#it's not blacklisted
end

2nd: I already provided the solution. It basically keeps calling read() until they enter a valid number.
Edited on 22 December 2014 - 06:32 PM
CrazyCoke #5
Posted 22 December 2014 - 08:09 PM
1st problem - use a table lookup.


local blacklist = {
  [720] = true,
  [722] = true,
  --#and so on
}

Then, to see if the number is taken,

if blacklist[ num ] then
  --#it's blacklisted
else
  --#it's not blacklisted
end

2nd: I already provided the solution. It basically keeps calling read() until they enter a valid number.

I have tried i few things but it doesn't solve anything. Can you plz give the code how you will solve this problem ??
And if i use the table lookup, it ignores this IF statement:


term.clear()
		  term.setCursorPos(1,1)
		  print("")
		  textutils.slowPrint("This number is is already in use, try another number!")
		  print("")
		  textutils.slowWrite("Number: ")

And when a say for example 720: "This number is available! Have a nice working day!", but the number is already in use …
MKlegoman357 #6
Posted 22 December 2014 - 09:15 PM
Please post your current code. Note that if you are using a lookup-table then you cannot do something like this:


if x == blacklist then

You would have to do it like this:


if blacklist[x] then



And I think here:


elseif type(x) == "number" then

you meant to check if it is not a number like this (notice the '~=' which mean 'not equal'):


elseif type(x) ~= "number" then

And in fact, you probably might want to check if it is a number first and then try to compare it to avoid getting that 'attempt to compare nil and number' errors.
Edited on 22 December 2014 - 08:19 PM
KingofGamesYami #7
Posted 22 December 2014 - 09:23 PM
I re-wrote your entire program, try this and modify from there.


local taken = {
  [720] = true,
  [722] = true,
  [723] = true,
  [724] = true,
  [726] = true,
  [727] = true,
  [728] = true, 
  [729] = true,
}
local x
repeat
  print( "Enter a number between 719 and 900" )
  x = tonumber( read() )
until x and x >= 719 and x <= 900 and not taken[ x ]
Bomb Bloke #8
Posted 22 December 2014 - 09:33 PM
And how can i simple solve this problem ??

The idea is to check that x is a number before you attempt to compare it against other values.

Eg, this sort of thing:

Spoiler
term.clear()
term.setCursorPos(1,2)
print("With this program can you check if a wireless number is available. Type in a number between 719 and 900. Don't use space bar !!")
print("")
write("Number: ")

local function wasteTime(text)
	term.clear()
	term.setCursorPos(1,2)
	textutils.slowPrint(text)
	print("")
	textutils.slowWrite("Number: ")
end

local blacklist = {
	[720] = true,
	[722] = true,
	--#and so on
}

local k, g = 719, 900

while true do
	x = tonumber(read())

	if not x then  -- If x is nil (because invalid text was entered)...
		wasteTime("This is not a number or you used space bar, try again!")

	elseif x >= g then  -- We know x can't be nil at this point.
		wasteTime("This number is to high, it has to be a number between 719 and 900!")

        elseif x <= k then
		wasteTime("This number is to low, it has to be a number between 719 and 900!")

        elseif blacklist[x] then
		wasteTime("This number is is already in use, try another number!")

        else
		term.clear()
		term.setCursorPos(1,2)
		textutils.slowPrint("This number is available! Have a nice working day!")
		sleep(2)
		break
	end
end
CrazyCoke #9
Posted 23 December 2014 - 10:04 AM
Thank you all !!
But finally works this code (Bomb Bloke, your code).


term.clear()
term.setCursorPos(1,2)
print("With this program can you check if a wireless number is available. Type in a number between 719 and 900. Don't use space bar !!")
print("")
write("Number: ")
local function wasteTime(text)
		term.clear()
		term.setCursorPos(1,2)
		textutils.slowPrint(text)
		print("")
		textutils.slowWrite("Number: ")
end
local blacklist = {
		[720] = true,
		[722] = true,
		--#and so on
}
local k, g = 719, 900
while true do
		x = tonumber(read())
		if not x then  -- If x is nil (because invalid text was entered)...
				wasteTime("This is not a number or you used space bar, try again!")
		elseif x >= g then  -- We know x can't be nil at this point.
				wasteTime("This number is to high, it has to be a number between 719 and 900!")
		elseif x <= k then
				wasteTime("This number is to low, it has to be a number between 719 and 900!")
		elseif blacklist[x] then
				wasteTime("This number is is already in use, try another number!")
		else
				term.clear()
				term.setCursorPos(1,2)
				textutils.slowPrint("This number is available! Have a nice working day!")
				sleep(2)
				break
		end
end

<SOLVED>