On 2011-03-14 21:47-0000 Andrew Ross wrote:

>
> Alan,
>
> No - gcc is correct in warning about this, at least for C. An explanation
> is given at
> http://c-faq.com/ansi/constmismatch.html
>
> The problem is with the way C (and C++) define 2-d arrays as a pointer to
> an array of pointers. const PLFLT **z only guarantees that the values of
> z don't change, but allows the array of pointers to be modified.

Hi Andrew:

Thanks for finding the above URL.

It took me some rereads, but I think I understand it now. What is
being demonstrated by the example at the above URL is that conversion
from type ** to const type ** might allow additional subtle errors to
creep in which are not possible with a conversion from type * to const
type *. So the C/C++ standard demands (via warnings for C and errors
for C++) that explicit casts must be used to convert type ** to const
type ** not only in assignment statements (I can accept that) but also
for arguments to functions (I am not happy with that).

I took special exception to the last paragraph of the above article
in the context of function arguments:

<quote>
In C, if you must assign or pass pointers which have qualifier
mismatches at other than the first level of indirection, you must use
explicit casts (e.g. (const char **) in this case), although as
always, the need for such a cast may indicate a deeper problem which
the cast doesn't really fix.
</quote>

I absolutely hate this sort of "prior restraint" for function
arguments. Obviously, when we advertise an argument to one of the
PLplot functions as const PLFLT ** (or const PLFLT * for that matter)
we are making promises not to screw up by changing those array values.
However, the whole thrust of the above URL is there is a subtle extra
possibility for us to screw up in the doubly dimensioned case so our
users must use make-work explicit casts (inconsistently in the doubly
dimensioned case, but not in the singly dimensioned one) to remind
them of the possibility that we _might_ be falsely advertising.  And
those explicit casts don't protect them in the slightest if we do
screw up.  I am not happy with this situation (to strongly understate
the case), but I guess all C/C++ programmers are stuck with this
"standard".

I still feel it is the right thing to do to advertise that we don't
change the values of our singly or doubly dimensioned array arguments.
However, when discussing the const modifier API change in
README.release I will refer to the above URL to try to avert the wrath
of our users because of this extra explicit casting work that will be
required from them from now on by the C/C++ standards.

Alan

>
> On Mon, Mar 14, 2011 at 01:54:56PM -0700, Alan Irwin wrote:
>> To the C/C++ gurus here:
>>
>> Because of all the gcc warnings and g++ errors (more about that later)
>> I was getting unless I used explicit casts with e.g, const PLFLT **
>> arguments I became concerned that perhaps I was misinterpreting the
>> meaning of
>>
>> const PLFLT ** z;
>>
>> Some googling this morning found the answer at
>> http://stackoverflow.com/questions/336585/what-does-a-const-pointer-to-pointer-mean-in-c-and-in-c
>> The discussion there pointed to
>> http://c-faq.com/decl/spiral.anderson.html which I think you will all
>> find an interesting read.  Both sources confirm my original
>> interpretation was correct.
>>
>> The answer is z is a mutable pointer to a mutable pointer to an
>> immutable PLFLT.  Therefore, such declarations for our function
>> arguments claim that our functions are not changing the values of the
>> doubly dimensioned z array which I believe is exactly what we want.
>> Similarly,
>>
>> const PLFLT *x;
>>
>> arguments for our functions claim that our functions are not changing
>> the values of the singly dimensioned x array which again I believe is
>> exactly what we want.
>>
>> The above is useful background to the fundamental issue that bothers
>> me which is automatic casting from mutable to immutable of singly
>> dimensioned and doubly dimensioned arrays are treated quite
>> differently by both gcc and g++.
>>
>> For an example of this with plline3, see examples/c/x18c.c where
>> mutable x, y, and z singly dimensions array arguments are
>> automatically cast to immutable without a warning message.  I think
>> that lack of warning message is the correct thing to do since
>> obviously x, y, and z must be assigned values before calling plline3
>> so it makes no sense for gcc to warn about the automatic casting of
>> each of those PLFLT * arrays to const PLFLT *.  However, such sanity
>> does not prevail for the doubly dimensioned array case; there you must
>> explicitly use (const PLFLT **) casts to avoid warning messages from
>> the gcc C compiler and error (!) messages from the gcc C++ compiler
>> for the doubly dimensioned arrays, see examples/c/x11c.c and
>> examples/c++/x11.cc.
>>
>> Does any C/C++ guru here know how to avoid those explicit casts for
>> each of our doubly dimensioned arguments?  I don't think I should
>> revert the const project since there are reasons of documentation and
>> safety to justify it (see
>> http://www.cprogramming.com/tutorial/const_correctness.html).
>> Nevertheless, if those explicit casts are required it will be
>> inconvenient for our users so if it is possible to avoid that work,
>> let's help at least our new users out with good examples.
>>
>> Note, this doubly dimensioned issue may be just a quirk with gcc and
>> g++ being inconveniently restrictive about automatic casting from
>> PLFLT ** to const PLFLT** without a warning (gcc) or error (g++)
>> message, and other C and C++ compilers may have different quirks or
>> errors concerning the interpretation of const.  So it would be a good
>> idea for those here with access to non-gcc compilers to run the
>> test_diff_psc target with BUILD_TEST=ON and report back all warning or
>> error messages that are related to our const arguments.
>>
>> Better to find out now about any platform problems introduced by the
>> const modifier project rather than one day after our next release!
>>
>> Alan
>> __________________________
>> Alan W. Irwin
>>
>> Astronomical research affiliation with Department of Physics and Astronomy,
>> University of Victoria (astrowww.phys.uvic.ca).
>>
>> Programming affiliations with the FreeEOS equation-of-state implementation
>> for stellar interiors (freeeos.sf.net); PLplot scientific plotting software
>> package (plplot.org); the libLASi project (unifont.org/lasi); the Loads of
>> Linux Links project (loll.sf.net); and the Linux Brochure Project
>> (lbproject.sf.net).
>> __________________________
>>
>> Linux-powered Science
>> __________________________
>>
>

__________________________
Alan W. Irwin

Astronomical research affiliation with Department of Physics and Astronomy,
University of Victoria (astrowww.phys.uvic.ca).

Programming affiliations with the FreeEOS equation-of-state implementation
for stellar interiors (freeeos.sf.net); PLplot scientific plotting software
package (plplot.org); the libLASi project (unifont.org/lasi); the Loads of
Linux Links project (loll.sf.net); and the Linux Brochure Project
(lbproject.sf.net).
__________________________

Linux-powered Science
__________________________

------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Plplot-devel mailing list
Plplot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/plplot-devel

Reply via email to