Not initialized

E

Edward Rawde

The class below seems to do exactly what I want it to do provided
Files.read_file is called first.
But it would be nice not to have to call Files.read_file externally at all
and have the other two methods automatically call it once, the first time
either of them is used.
So far I've not been able to do this without getting "uninitialized class
variable" errors. Is there a simple way to do it?
I've only been learning Ruby for two days so it's quite possible I've missed
the obvious.

Ed


class Files

def Files.read_file

@@file = File.open("test.bin","rb")

@@code = []

@@address = 0

while @@address < 65536 and (@@byte = @@file.getc) != nil

@@code.push(@@byte)
@@address += 1

end

@@file.close

end

def Files.readCodeByte index
return @@code[index-@@offset]
end

def Files.setOffset anoffset
@@offset = anoffset
end

end
 
L

Logan Capaldo

The class below seems to do exactly what I want it to do provided
Files.read_file is called first.
But it would be nice not to have to call Files.read_file externally
at all
and have the other two methods automatically call it once, the
first time
either of them is used.
So far I've not been able to do this without getting "uninitialized
class
variable" errors. Is there a simple way to do it?
I've only been learning Ruby for two days so it's quite possible
I've missed
the obvious.

Ed


class Files

def Files.read_file

@@file = File.open("test.bin","rb")

@@code = []

@@address = 0

while @@address < 65536 and (@@byte = @@file.getc) != nil

@@code.push(@@byte)
@@address += 1

end

@@file.close

end

def Files.readCodeByte index
return @@code[index-@@offset]
end

def Files.setOffset anoffset
@@offset = anoffset
end

end

def Files.read_file
unless defined?(@@read_file_called)
@@file = File.open("test.bin","rb")

@@code = []

@@address = 0

while @@address < 65536 and (@@byte = @@file.getc) != nil

@@code.push(@@byte)
@@address += 1
@@read_file_called = true
end
end

def Files.readCodeByte index
Files.read_file
return @@code[index-@@offset]
end

def Files.setOffset anoffset
Files.read_file
@@offset = anoffset
end
 
E

Edward Rawde

Logan Capaldo said:
The class below seems to do exactly what I want it to do provided
Files.read_file is called first. [snip]

def Files.read_file
unless defined?(@@read_file_called)

That's what I needed. Thanks Logan.
@@file = File.open("test.bin","rb")

@@code = []

@@address = 0

while @@address < 65536 and (@@byte = @@file.getc) != nil

@@code.push(@@byte)
@@address += 1
@@read_file_called = true
end
end

def Files.readCodeByte index
Files.read_file
return @@code[index-@@offset]
end

def Files.setOffset anoffset
Files.read_file
@@offset = anoffset
end
 
D

daz

Edward said:
So far I've not been able to do this without getting "uninitialized class
variable" errors. Is there a simple way to do it?
I've only been learning Ruby for two days so it's quite possible I've missed
the obvious.

Ed

Hi Ed,

(I saw your acknowledgement to Logan)

Here's another:
...............

FNAME = 'test.bin'

class Files
@@file = nil
@@code = []
@@address = 0
@@offset = 0

def Files.read_file
File.open(FNAME, 'rb') do | @@file |
while @@address < 65536 and (@@byte = @@file.getc)
@@code.push(@@byte)
@@address += 1
end
end
end

def Files.readCodeByte(index)
@@file or read_file
@@code[index-@@offset]
end

def Files.setOffset(anoffset)
@@file or read_file
@@offset = anoffset
end
end


daz
 
E

Edward Rawde

daz said:
Edward said:
So far I've not been able to do this without getting "uninitialized class
variable" errors. Is there a simple way to do it?
I've only been learning Ruby for two days so it's quite possible I've
missed
the obvious.

Ed

Hi Ed,

(I saw your acknowledgement to Logan)

Here's another:
..............

FNAME = 'test.bin'

class Files
@@file = nil
@@code = []
@@address = 0
@@offset = 0

def Files.read_file
File.open(FNAME, 'rb') do | @@file |
while @@address < 65536 and (@@byte = @@file.getc)
@@code.push(@@byte)
@@address += 1
end
end
end

def Files.readCodeByte(index)
@@file or read_file
@@code[index-@@offset]
end

def Files.setOffset(anoffset)
@@file or read_file
@@offset = anoffset
end
end

Thanks daz, it will be useful to figure out exactly how that works.

Now I have another problem.
This code outputs bytes in hex and binary from a 16K file:

Files.setOffset 0x0000

address = 0x0000

while address < 0x4000

byte = Files.readCodeByte(address)

puts address.to_s(16) + " " + byte.to_s(2).upcase + " " + byte.to_s(16)

address += 1

end

But I want fixed width. So if byte 0 is at address 0 I want 0000 00000000 00

I can probably figure some code to add the leading zeros but what's the most
efficient way to do that in Ruby?

Thanks

Ed
 
D

daz

Edward said:
This code outputs bytes in hex and binary from a 16K file:

Files.setOffset 0x0000
address = 0x0000
while address < 0x4000
byte = Files.readCodeByte(address)
puts address.to_s(16) + " " + byte.to_s(2).upcase + " " + byte.to_s(16)
address += 1
end

But I want fixed width. So if byte 0 is at address 0
I want 0000 00000000 00

I can probably figure some code to add the leading zeros but
what's the most efficient way to do that in Ruby?

Using String % (sprintf)
http://www.rubycentral.com/book/ref_c_string.html#String._pc

I've added the ascii character (or '.' if it's not printable)

address = 0x3ff8
while address < 0x4000
byte = Files.readCodeByte(address)
puts '%04X %08b %02X %c' %
[address, byte, byte, ((32..126) === byte) ? byte : ?.]
address += 1
end

#-> 3FF8 01011011 5B [
#-> 3FF9 00111101 3D =
#-> 3FFA 01000000 40 @
#-> 3FFB 00001000 08 .
#-> 3FFC 01001011 4B K
#-> 3FFD 01010100 54 T
#-> 3FFE 10111000 B8 .
#-> 3FFF 00010010 12 .


daz
 
E

Edward Rawde

daz said:
[snip]

Using String % (sprintf)
http://www.rubycentral.com/book/ref_c_string.html#String._pc

I've added the ascii character (or '.' if it's not printable)

address = 0x3ff8
while address < 0x4000
byte = Files.readCodeByte(address)
puts '%04X %08b %02X %c' %
[address, byte, byte, ((32..126) === byte) ? byte : ?.]
address += 1
end

I knew there would be a simple way.
I think it's time I bought that book.
Thanks for your help daz.
#-> 3FF8 01011011 5B [
#-> 3FF9 00111101 3D =
#-> 3FFA 01000000 40 @
#-> 3FFB 00001000 08 .
#-> 3FFC 01001011 4B K
#-> 3FFD 01010100 54 T
#-> 3FFE 10111000 B8 .
#-> 3FFF 00010010 12 .


daz
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,200
Messages
2,571,046
Members
47,646
Latest member
xayaci5906

Latest Threads

Top