Hi, I reenter the discussion that I proposed some days ago Andrew Ross ha scritto: > On Sat, Aug 08, 2009 at 01:14:53PM +0200, Werner Smekal wrote: >> Hi Arjen, >> >>>> While I like the API simplification this could provide, I have two >>>> primary concerns: >>>> >>>> First, could the first argument - the field to get/set - be an >>>> enumerated type of some sort? This should help catch typos at >>>> compile >>>> time rather than run time. (PL_LINE_WIDTH rather than "line width"). >>>> Additional fields would then require adding elements to the >>>> enumeration which, as I understand, should not break existing code. >> Yes, enumeration of #define macros would be much better and faster. >> Comparing strings is surely not the best. >>>> Second, the void* approach may not translate well to other languages. >>>> I'm not sure if there is a way to do this in C that would translate >>>> well to the other PLplot-supported languages though. >>>> >>> I agree that a void * argument would be very bad for most languages, >>> if not all, and it leaves the interpretation of the value up to the >>> programmer. What about filling a structure instead? >> Or even better an union. It's always problematic how such things >> should be solved, but I even have another idea. Why not get ALL >> information in one struct. e.g. >> >> plgetattr( struct plAttributes* att); >> >> struct plAttributes { >> int width; >> int frontcolor; >> int backcolor; >> ...... >> } >> >> You will not use such functions in critical situations anyway (or?), >> so speed is not a problem and you could get all attributes at once. On >> the other side, maybe difficult to port to other functions, but >> something like structs or tables all languages have, or? > > The big downside of this is that every time you add a new function > you have to change the structure which is formally an API change (as > opposed to just an API addition). > > Not all languages have structures. For example in f77 you end up resorting > to common blocks or other such ills.
I agree that mapping C structs to other languages is not portable, even simple f90 derived types are not easily mappable to a C structure, so it would nullify the advantage of the approach. > > I would suggest something like > > plgvarf(int varid, PLFLT * val) > > where varid is the #defined id of the variable to get. You could make enums > of these in languages which support them. val is the returned value. Almost > all of the get functions will return a PLFLT. For those where a int or > string is returned we could have > > plgvari(int varid, int * val) > plgvarc(int varid, char ** val) > > This maintains all typechecking on the returned value and avoid void *. It > will > also be easily ported to all other languages. > > Where this more messy than the current approach is where you want to get a > set of returned values (e.g. plgvpw returned viewport limits - 4 numbers). > I don't know if there is a good generic solution to this. This looks really reasonable; for returning a set of values, there could be an additional size parameter, either in the same functions or in a "vectorized" set of corresponding functions, that limits the size of the array to get/set, e.g. plgvariv(int varid, int * val, size_t n) plgvarcv(int varid, char ** val, size_t n) (I suppose you meant that the char version would allocate the space, in this case it would allocate an array of pointers); in f90, this approach could reduce to a single interface plgvar(varid, val) to all the subroutines that handle the different types, array or not, maybe some work should be done for handling the char case, I can contribute for this if needed. best regards, Davide -- ============================= Davide Cesari ============================ Servizio IdroMeteorologico ARPA Emilia Romagna Area Modellistica Numerica e Radarmeteorologia Phone/Fax: +39 051525926/+39 0516497501 E-mail: dces...@arpa.emr.it Home page: http://www.webalice.it/o.drofa/davide/ Address: ARPA-SIM, Viale Silvani 6, 40122 Bologna, Italy ======================================================================== ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Plplot-devel mailing list Plplot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/plplot-devel