|
I may be missing something, but I think it hinges on the conveniently(?) ambiguous way strings work in C and printf()'s being a function with a variable argument list. Even though strings are pointers in C, there are situations, like printf(), where you can use them like the numeric data types. I would be surprised and gratified if there were a way to do it, but I think you've hit on something where there is no common ground between the two languagages. BTW, how are you using printf() in RPG? Is it CGI? > -----Original Message----- > From: Simon Coulter [mailto:shc@flybynight.com.au] > Sent: Saturday, September 23, 2000 5:46 PM > To: RPG400-L@midrange.com > Subject: Prototyping printf() > > > > Hello all, > > Now here's an interesting exercise that is rapidly becoming > one of futility. > > printf() is a C function that expects a format string > followed by zero or more > substitution values. The substitution arguments can be any > of C's supported data types > and are passed by value. Prototypng it for known data types > is easy but the real point > is to create a single definition that can handle all data > types. A sample prototype of > the form: > > D printf PR 10I 0 EXTPROC('printf') > D formatString * VALUE > OPTIONS(*STRING) > D arg1 10I 0 VALUE > OPTIONS(*NOPASS) > > will allow dynamic printing like: > > C EVAL rc=printf('The number is %i ' : anInt) > > however if I then want to print a string I need a separate > prototype with arg1 defined > appropriately. > > D printf PR 10I 0 EXTPROC('printf') > D formatString * VALUE > OPTIONS(*STRING) > D arg1 * VALUE > OPTIONS(*STRING:*NOPASS) > > and then I can: > > C EVAL rc=printf('The string is %s ' : aString) > > and so we go on with additional prototypes for each possible > variation of substitution > arguments. > > My question (to which I think the answer is NO) is: Is it > possible to define an RPG > prototype describing printf() in its native form? > > The difficulty seems to hinge on C's requirement for passing > by VALUE and RPGs > requirement for knowing the data type up front. The closest > I can come to allowing RPG > to accept anything is by using a prototype like: > > D printf PR 10I 0 EXTPROC('printf') > D formatString * VALUE > OPTIONS(*STRING) > D arg1 * VALUE > OPTIONS(*NOPASS) > D arg2 * VALUE > OPTIONS(*NOPASS) > D arg3 * VALUE > OPTIONS(*NOPASS) > D arg4 * VALUE > OPTIONS(*NOPASS) > > which allows RPG to successfully compile statements such as: > > C for count = 0 to 10 by 2 > C EVAL rc=printf('%s %i' : %addr(string) : > %addr(count) ) > C endfor > > When it runs the string is printed successfully but the > integer is not because it is the > VALUE of the ADDRESS of the integer that is being passed not > the VALUE of the integer. > And that leads us back to a prototype like: > > D printf PR 10I 0 EXTPROC('printf') > D formatString * VALUE > OPTIONS(*STRING) > D arg1 * VALUE > OPTIONS(*STRING:*NOPASS) > D arg2 10I 0 VALUE > OPTIONS(*NOPASS) > > Aaaarrrrrggghhhh!!!! > > Regards, > Simon Coulter. +--- | 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 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.