× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.


  • Subject: Re: how to let my program sleep a while
  • From: "Simon Coulter" <shc@xxxxxxxxxxxxxxxxx>
  • Date: Wed, 20 Sep 00 14:40:11 +1000


Hello Booth,

You wrote:
>As usual your suggestion is best.  Much better.  Two procedures it shall 
>be.  Now, (every body skips over the easy stuff!) why do I want to use 

>"CallP   Sleepfor('00:30:00')" 

>instead of 

>"Call   'SleepFor'"
>"Parm   '00:30:00'    Parm8       8"

Because CALLP requires a prototype which the compiler uses to verify that the 
data type 
specified on the prototype is compatible with the the type of data actually 
used on the 
call.

With CALLB (and indeed with CALL) the invoker can pass any old crap to the 
procedure.  
Prototypes help make robust software by catching stupid programmer errors** 
during 
compilation rather than run-time.  It's not perfect but it a bloody sight 
better than 
the alternative.

Barbara's comment on the choice of names is correct (and in fact the choice of 
name is 
the single most important aspect of a procedure).  In this case you have two 
similar but 
different procedures.  They need different data types.  sleepFor() needs a 
duration but 
sleepUntil() needs an absolute time.  You should define the prototypes 
accordingly e.g.,

D sleepUntil    PR
D  time                          T      VALUE TIMFMT(*HMS)

such a prototype will stop the caller from passing character or numeric data 
unless it 
can be converted by the compiler into the correct type.  Since RPG doesn't have 
a 
duration data type we need to content ourselves with a numeric value of some 
sort e.g.,

D sleepFor      PR
D   duration                    5I 0    VALUE

but at least that limits the possible sources of crap data.  The onus is still 
on the 
programmer to pass the correct stuff but with prototypes you can restrict the 
truly 
creative.  (You may decide to design sleepFor() to accept a time data type and 
then 
convert it to a duration -- you might choose to interpret the time as an offset 
from 
midnight and the procedure will sleep for that many hours, minutes, and 
seconds.)  In my 
example from a few days ago I defined the parameter as a 6,0 packed field 
because the 
range of allowable values on DLYJOB is 1 to 999999.

Now see if you agree that the two procedures described above are better than 
one like 
the following:

D sleep         PR
D   delay                       5I 0  CONST OPTIONS(*OMIT)
D   resumeTime                   T    CONST OPTIONS(*OMIT:*NOPASS)

I know a lot of this appears to be simply style but think about it for a bit -- 
and read 
some stuff on Object Oriented (not Orientated!!) Design.  Two good books on the 
subject 
are:
        Designing Object Oriented Software by Rebecca Wirfs-Brock
        Design Patterns by Erich Gamma et al.

These books should be on all programmer's bookshelves alongside the 
well-thumbed 
3-volume (unfinished) set by Donald Knuth.

Note that you may choose to create just such a sleep() procedure to do the real 
work and 
then wrap it in a facade using the first two prototypes.  It depends on how 
important 
abstraction and encapsulation is to you.  In this case sleep() would be private 
while 
sleepFor() and sleepUntil() would be part of the public interface.

>I understand that for most of you this is pretty basic, but hey, I just 
>don't know the answer.

And now you do :)

** (i.e., those errors that are human mistakes rather than errors made by 
stupid 
programmers -- nothing shields you from those)

Regards,
Simon Coulter.


 FlyByNight Software         AS/400 Technical Specialists       
 Eclipse the competition - run your business on an IBM AS/400.  
                                                                
 Phone: +61 3 9419 0175      Mobile: +61 0411 091 400           
 Fax:   +61 3 9419 0175      mailto: shc@flybynight.com.au      
                                                                
 Windoze should not be open at Warp speed.                      

+---
| This is the RPG/400 Mailing List!
| To submit a new message, send your mail to RPG400-L@midrange.com.
| To subscribe to this list send email to RPG400-L-SUB@midrange.com.
| To unsubscribe from this list send email to RPG400-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---

As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.