Forum: Ruby Not initialized

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
31dbdc8032029abf6e166cd96ceb295a?d=identicon&s=25 no (Guest)
on 2005-12-08 22:35
(Received via mailing list)
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
E34b5cae57e0dd170114dba444e37852?d=identicon&s=25 logancapaldo (Guest)
on 2005-12-08 23:24
(Received via mailing list)
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
31dbdc8032029abf6e166cd96ceb295a?d=identicon&s=25 no (Guest)
on 2005-12-09 00:05
(Received via mailing list)
"Logan Capaldo" <logancapaldo@gmail.com> wrote in message
news:83E0BDB7-5A89-4217-8440-EBF110F7B2FD@gmail.com...
>
> 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.
Dce0999389d102f9a313af625375304c?d=identicon&s=25 dooby (Guest)
on 2005-12-09 00:13
(Received via mailing list)
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
235f388504360d9d03700f820244ffbe?d=identicon&s=25 rawde.edward (Guest)
on 2005-12-09 13:08
(Received via mailing list)
"daz" <dooby@d10.karoo.co.uk> wrote in message
news:tBqdnSwymdRWIAXeSa8jmw@karoo.co.uk...
> 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
Dce0999389d102f9a313af625375304c?d=identicon&s=25 dooby (Guest)
on 2005-12-09 20:43
(Received via mailing list)
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

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
235f388504360d9d03700f820244ffbe?d=identicon&s=25 rawde.edward (Guest)
on 2005-12-09 22:25
(Received via mailing list)
"daz" <dooby@d10.karoo.co.uk> wrote in message
news:wTWdnc22duLNQATeSa8jmw@karoo.co.uk...
>
[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.
This topic is locked and can not be replied to.