Shortcut for [string].pack("p*").unpack("l").first?

From: Robert Klemme [mailto:shortcutter@googlemail.com]
Sent: Monday, May 01, 2006 11:19 AM
To: ruby-talk ML
Subject: Re: Shortcut for [string].pack("p*").unpack("l").first ?

> > What do you want with a memory address in Ruby-land? If
you're in
> > an extension then there's probably an easier way to get at the
> > address.
>
> Short answer: Win32API

Here you got me convinced.

> strcmp1 = Win32API.new('msvcrt', 'strcmp', 'PP', 'I')
> strcmp2 = Win32API.new('msvcrt', 'strcmp', 'LL', 'I')
>
> str1 = "hello"
> str2 = "hello"
> str3 = "world"
>
> addr1 = [str1].pack("p*").unpack("l").first
> addr2 = [str2].pack("p*").unpack("l").first
> addr3 = [str3].pack("p*").unpack("l").first
>
> # Using strings
> strcmp1.call(str1, str2) # 0
> strcmp1.call(str1, str3) # -1
>
> # Using string addresses
> strcmp2.call(addr1, addr2) # 0
> strcmp2.call(addr1, addr3) # -1

Now you lost me again: if you can use a string as well as a
pointer then why bother to use the pointer? Are there places
where you cannot do that?

Yes, pointers to pointers. Typically for unraveling data structures.

> I suppose I could stop whining and just extend the String class. :slight_smile:

That's definitively an option. :-))

> class String
> def ptr
> [self].pack("p*").unpack("l").first
> end
> end

Just a thought: does it make sense to raise an exception or
print a warning if the string is not frozen? Otherwise the
address could point into limbo...

Hm, good point.

Dan

This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly
prohibited and may be unlawful. If you have received this communication
in error, please immediately notify the sender by reply e-mail and destroy
all copies of the communication and any attachments.

ยทยทยท

-----Original Message-----
2006/5/1, Berger, Daniel <Daniel.Berger@qwest.com>: