[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

problem with date.succ

Russ Pridemore

8/15/2006 3:04:00 PM

I'm having difficulty with a small program I'm writing dealing with
dates. I've written the calendar class below. It works just fine
when calling getMonth for all months EXCEPT NOVEMBER. Interrupting
the call while in irb shows that it is busy in the reduce method of
Rational, called from Date. Any ideas?

Thanks,
Russ

require 'date'
class Calendar
def initialize(year=Date.today.year)
@year = year
end

def getMonth(mo)
dt = Date.new(@year, mo, 1)
i = dt.month
list = Array.new
while i != (mo+1) % 12
wk = getWeek(dt.month, dt.day)
dt = wk[6].succ
i = dt.month
list.push(wk)
end
list
end

def getWeek(mo, dy)
dt = Date.new(@year, mo, dy)
dt -= dt.wday
list = Array.new
for i in 0..6
list.push dt
dt = dt.succ
end
list
end

def getDay(mo, dy)
Date.new(@year, mo, dy)
end
end

3 Answers

Pit Capitain

8/15/2006 8:57:00 PM

0

Russ Pridemore schrieb:
> I'm having difficulty with a small program I'm writing dealing with
> dates. I've written the calendar class below. It works just fine
> when calling getMonth for all months EXCEPT NOVEMBER. Interrupting
> the call while in irb shows that it is busy in the reduce method of
> Rational, called from Date. Any ideas?
>
> (...)
>
> def getMonth(mo)
> dt = Date.new(@year, mo, 1)
> i = dt.month
> list = Array.new
> while i != (mo+1) % 12
> wk = getWeek(dt.month, dt.day)
> dt = wk[6].succ
> i = dt.month
> list.push(wk)
> end
> list
> end
>
> (...)

Russ, for November, "mo" is 11, and "(mo+1) % 12" is zero, but
"dt.month" and "i" are always in the range (1..12), so you've got an
endless loop. Replace the line

while i != (mo+1) % 12

with

next_month = mo % 12 + 1
while i != next_month

and at least the loop should work as you expect.

Regards,
Pit

Russ Pridemore

8/15/2006 9:34:00 PM

0

> Russ Pridemore schrieb:
>> I'm having difficulty with a small program I'm writing dealing with
>> dates. I've written the calendar class below. It works just fine
>> when calling getMonth for all months EXCEPT NOVEMBER. Interrupting
>> the call while in irb shows that it is busy in the reduce method of
>> Rational, called from Date. Any ideas?
>>
>> (...)
>>
>> def getMonth(mo)
>> dt = Date.new(@year, mo, 1)
>> i = dt.month
>> list = Array.new
>> while i != (mo+1) % 12
>> wk = getWeek(dt.month, dt.day)
>> dt = wk[6].succ
>> i = dt.month
>> list.push(wk)
>> end
>> list
>> end
>>
>> (...)
>
> Russ, for November, "mo" is 11, and "(mo+1) % 12" is zero, but
> "dt.month" and "i" are always in the range (1..12), so you've got an
> endless loop. Replace the line
>
> while i != (mo+1) % 12
>
> with
>
> next_month = mo % 12 + 1
> while i != next_month
>
> and at least the loop should work as you expect.
>
> Regards,
> Pit
>

Pit,
Thank-you very much. Can't believe I didn't see that mistake.

Any idea why ruby's date class needs to use rational numbers, though?
Every time I'd get into the loop and break out in irb, I'd see a stack
trace pointing to rational.rb...

Russ

Jano Svitok

8/16/2006 9:18:00 AM

0

On 8/15/06, Russ Pridemore <russ.pridemore@gmail.com> wrote:

> Any idea why ruby's date class needs to use rational numbers, though?
> Every time I'd get into the loop and break out in irb, I'd see a stack
> trace pointing to rational.rb...

Because the Date is stored as Astronomical Julian Date number
(whatever it is, see lib/date.rb comments and source) and the
conversion somehow needs it. NB: Due to this, I obtained a decent
speedup by caching Date object instead of creating them each time
anew.