# Not initialized

**URL:** <https://www.ruby-forum.com/t/not-initialized/49815>\
**Category:** Ruby\
**Created:** [December 8, 2005, 10:35pm UTC](https://www.ruby-forum.com/t/not-initialized/49815 "2005-12-08T22:35:21Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![nonono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/839c29/32.png) [@nonono](https://www.ruby-forum.com/u/nonono)\
**Post date:** [December 8, 2005, 10:35pm UTC](https://www.ruby-forum.com/t/not-initialized/49815/1 "2005-12-08T22:35:21Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![nonono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/839c29/32.png) [@nonono](https://www.ruby-forum.com/u/nonono)\
**Post date:** [December 8, 2005, 11:24pm UTC](https://www.ruby-forum.com/t/not-initialized/49815/2 "2005-12-08T23:24:37Z")

</div>

On Dec 8, 2005, at 3:47 PM, Edward Rawde wrote:

> I’ve only been learning Ruby for two days so it’s quite possible  
> @@file = File.open(“test.bin”,“rb”)  
> end  
> @@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

---

<div class="post-metadata">

**Author:** ![nonono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/839c29/32.png) [@nonono](https://www.ruby-forum.com/u/nonono)\
**Post date:** [December 9, 2005, 12:05am UTC](https://www.ruby-forum.com/t/not-initialized/49815/3 "2005-12-09T00:05:12Z")

</div>

“Logan C.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote in message  
news:removed\_email\_address@domain.invalid…

> On Dec 8, 2005, at 3:47 PM, Edward Rawde wrote:
> 
> > 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.

---

<div class="post-metadata">

**Author:** ![nonono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/839c29/32.png) [@nonono](https://www.ruby-forum.com/u/nonono)\
**Post date:** [December 9, 2005, 1:08pm UTC](https://www.ruby-forum.com/t/not-initialized/49815/4 "2005-12-09T13:08:09Z")

</div>

“daz” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote in message  
news:removed\_email\_address@domain.invalid…

> Hi Ed,  
> @@code = []  
> 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

---

<div class="post-metadata">

**Author:** ![nonono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/839c29/32.png) [@nonono](https://www.ruby-forum.com/u/nonono)\
**Post date:** [December 9, 2005, 12:13am UTC](https://www.ruby-forum.com/t/not-initialized/49815/5 "2005-12-09T00:13:28Z")

</div>

Edward Rawde wrote:

> 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

---

<div class="post-metadata">

**Author:** ![nonono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/839c29/32.png) [@nonono](https://www.ruby-forum.com/u/nonono)\
**Post date:** [December 9, 2005, 8:43pm UTC](https://www.ruby-forum.com/t/not-initialized/49815/6 "2005-12-09T20:43:58Z")

</div>

Edward Rawde wrote:

> 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](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

---

<div class="post-metadata">

**Author:** ![nonono](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/839c29/32.png) [@nonono](https://www.ruby-forum.com/u/nonono)\
**Post date:** [December 9, 2005, 10:25pm UTC](https://www.ruby-forum.com/t/not-initialized/49815/7 "2005-12-09T22:25:54Z")

</div>

“daz” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote in message  
news:removed\_email\_address@domain.invalid…

> 

[snip]

> ```
> [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.
