Oh and a final point. We should think carefully before removing the forms where we pass in a raw pointer and a number of elements. There are cases where only a raw pointer will do, such as when the array class doesn't have a size method or the array class uses () instead of [] for element access. A user can write an interface class to deal with that, but then we have made the interface less user friendly not more. e.g
class myArray { public: size_t getSize(){ return m_nElements;} //get the number of elements const double &operator()( size_t index) {return *(m_pointer+index);}//get an element private: size_t m_nElements; double *m_pointer; }; //now this won't compile as there is no size method, nor any operator[] myArray x; myArray y; pl.someFunction(x,y); //the old method used to work pl.someFunction(x.getSize(), &x(0), &y(0)); The user now has to create an interface class to link plplot to class plInterface { public: plInterface( myArray *array ){m_myArray = array; } PLINT size(){return m_myArray.getSize();} const double &operator[](size_t index){return (*m_myArray)(index);} private: myArray *m_myArray; }; myArray x; myArray y; pl.someFunction(plInterface(&x), plInterface(&y)); I'm not saying that the gains outweigh the negative or the other way round. Just that we need to think about it. Phil On 19 January 2016 at 12:47, Phil Rosenberg <p.d.rosenb...@gmail.com> wrote: > I just realised I forgot one thing > > There isn't a standard 2D container in C++, so you have to create a > vector of vectors, something like > std::vector<std::vector<double>> myMatrix; > > However a lot of people don't like this as it is generally considered > rather slow. So I think there are lots of other things people use > including Eigen or Boost classes or just plain C matrices or their own > home solutions. > > We should certainly maintain and if needed extend the C++ model that I > think Andrew designed which wraps any kind of 2D array in an class > where the user provides a method to access the required elements. > > Phil > > On 19 January 2016 at 12:32, Phil Rosenberg <p.d.rosenb...@gmail.com> wrote: >> I'm perhaps less keen on the idea of using the minimum dimension. >> Passing unequal sized arrays is clearly and error and so I think we >> should flag it is such is the loudest way possible so the user can fix >> it. I think the times when I have often got this wrong are off by one >> cases and getting x and y the wrong way round in contour plots. In an >> off by one case if we just plot the data regardless then the user is >> quite likely to never notice - in fact if we are off by many (perhaps >> the user passes a filtered array in for x and an unfiltered array in >> for y) then the results may be absolutely incorrect but the user may >> be unaware. >> >> Regarding C++, this is a bit tricky. But the short answer is that the >> best way to do this would be to turn out our C++ driver into header >> only code. This can be done by simply inlining all the methods, or we >> could template it something like this >> >> template<class ARRAY> >> void plstream::someFunction(const ARRAY &x, const ARRAY &y) >> { >> plsomefunction( x.size(), &x[0], &y[0]); >> } >> >> then in the main program >> >> plstream pl; >> >> //we can call someFunction with std::vectors of doubles >> std::vector<double> x; >> std::vector<double> y; >> pl.someFunction (x, y); >> >> //or if someone has a different array type class >> myCustomArray x; >> myCustomArray y; >> pl.someFunction(x,y); >> >> >> In fact plstream::someFunction can be called with any class which has >> a size method and for which the &x[0], &y[0] syntax makes sense, so it >> would need to understand operator [] and it would have to have all its >> elements in contiguous memory. >> >> >> So that is probably the "best" way, depending upon how you define >> "best". It is possible to just allow plstream to accept >> std::vector<double> arrays, which is the built in C++ array, however >> there are complications. I won't go into the details here, but >> basically to do this we need the following >> 1) The library and the dll must be built with the same version of the >> same compiler useing the same compiler and linker flags. This is >> because C++ barely touches on defining the binary interface of the >> language. If this isn't the case then at best you will get linker >> errors or at worst weird run time errors because a library built in >> MinGW has a different structure for its std::vector than the >> executable built in VC++. By using header only code we guarantee this >> because our code gets built into the exe. >> 2) On windows dlls and exes have their own heap so we cannot resize >> any std::vectors that are passed in. That would involve attempting to >> free memory the dll doesn't have access to then allocating memory that >> the exe wouldn't have access to. This isn't an issue for us though as >> we don't resize them. >> >> There are lots of (mostly not very well written) things online about >> C++ and dll boundaries. There is something called plain old data (POD) >> which is I think the only place the standard really gets involved in >> binary interfaces. POD is standard types and classes containing only >> POD with no user defined destructor and some other limits. These can I >> think be safely passed into and out of a dll because they are pretty >> much like C structs with methods. stl containers including std::vector >> are not POD. >> >> Don't know what your thoughts are there Alan? >> >> Phil >> >> >> On 19 January 2016 at 07:50, Arjen Markus <arjen.mar...@deltares.nl> wrote: >>> Hi Alan, >>> >>> >>> >>>> -----Original Message----- >>>> From: Alan W. Irwin [mailto:ir...@beluga.phys.uvic.ca] >>>> Sent: Tuesday, January 19, 2016 4:47 AM >>>> To: PLplot development list >>>> Subject: [Plplot-devel] Redacted dimension arguments >>>> …, I came up with the following cunning plan.... >>>> >>>> My new plan for handling redacted dimension arguments for the Fortran >>>> binding is >>>> simply to calculate n as the minimum dimension of the associated arrays >>>> with the >>>> only sanity check imposed on our users being that the resulting n > 0. I >>>> think this >>>> way of handling things is a good one because it still gives the users some >>>> type of >>>> plot (and no memory management issues) even if they screw up and have one >>>> associated array inadvertently shorter than the rest. >>>> >>> I agree on this wrt one-dimensional arrays that are passed, but for >>> two-dimensional arrays there is a slight complication with this scheme. >>> Thinking out loud here … >>> >>> Suppose the user passes arrays x(10,10) and y(20,20) to a contouring >>> routine, then the most consistent way for the wrapping routine to pass these >>> two arrays would be to take an array section: x(1:10,1:10) and y(1:10,1:10). >>> Hm, that could be done easily with Fortran – since the C routine has no >>> notion of non-contiguous array sections, the interfacing features will >>> transform it into a temporary array that is contiguous. No copying back is >>> required as the arguments are intent(in). >>> >>> Okay, this should work – provided it can be done for other bindings in the >>> same way. I cannot comment too much on this aspect. >>> >>> Your remark about the Tcl binding not using redacted dimension arguments >>> triggered me look at it again. The current bindings use the matrix data type >>> to store the values and that type does actually keep track of the >>> dimensions, so with a twist to that binding, we can get the same benefits. >>> >>> Regards, >>> >>> Arjen >>> >>> >>> >>> DISCLAIMER: This message is intended exclusively for the addressee(s) and >>> may contain confidential and privileged information. If you are not the >>> intended recipient please notify the sender immediately and destroy this >>> message. Unauthorized use, disclosure or copying of this message is strictly >>> prohibited. The foundation 'Stichting Deltares', which has its seat at >>> Delft, The Netherlands, Commercial Registration Number 41146461, is not >>> liable in any way whatsoever for consequences and/or damages resulting from >>> the improper, incomplete and untimely dispatch, receipt and/or content of >>> this e-mail. >>> >>> ------------------------------------------------------------------------------ >>> Site24x7 APM Insight: Get Deep Visibility into Application Performance >>> APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month >>> Monitor end-to-end web transactions and take corrective actions now >>> Troubleshoot faster and improve end-user experience. Signup Now! >>> http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140 >>> _______________________________________________ >>> Plplot-devel mailing list >>> Plplot-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/plplot-devel >>> ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140 _______________________________________________ Plplot-devel mailing list Plplot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/plplot-devel