455,428 Members | 1,849 Online Need help? Post your question and get tips & solutions from a community of 455,428 IT Pros & Developers. It's quick & easy.

# Array of point to arrays of different size

 P: n/a Hi, I have the following static arrays of different size in a class: in header: static double w2, x2; static double w3, x3; static double w4, x4; in GaussLegendre.cpp: double GaussLegendre::w2 = {1.0, 1.0}; double GaussLegendre::x2 = {-0.577350269189625, 0.577350269189625}; double GaussLegendre::w3 = {0.555555555555556, 0.8888888888888889, 0.555555555555556}; double GaussLegendre::x3 = {-0.774596669241483, 0.0, 0.774596669241483}; double GaussLegendre::w4 = {0.347854845137453, 0.652145154862546, 0.652145154862546, 0.347854845137453}; double GaussLegendre::x4 = {-0.861136311594053, -0.339981043584856, 0.339981043584856, 0.861136311594053}; Now I want to create a static array of pointers of x2, x3, x4 and w2,w2,w4. I thought I could do that with just declaring statis double* x in my header and the following in .cpp: double* GaussLegendre::x = {&GaussLegendre::x2, &GaussLegendre::x3, &GaussLegendre::x4}; but I get the following error: cannot convert from 'double (*)' to 'double * Why is that and how can it be done? Thanks in advance, Edward Nov 14 '08 #1
4 Replies

 P: n/a Edward Jensen writes: Hi, I have the following static arrays of different size in a class: in header: static double w2, x2; static double w3, x3; static double w4, x4; in GaussLegendre.cpp: double GaussLegendre::w2 = {1.0, 1.0}; double GaussLegendre::x2 = {-0.577350269189625, 0.577350269189625}; double GaussLegendre::w3 = {0.555555555555556, 0.8888888888888889, 0.555555555555556}; double GaussLegendre::x3 = {-0.774596669241483, 0.0, 0.774596669241483}; double GaussLegendre::w4 = {0.347854845137453, 0.652145154862546, 0.652145154862546, 0.347854845137453}; double GaussLegendre::x4 = {-0.861136311594053, -0.339981043584856, 0.339981043584856, 0.861136311594053}; Now I want to create a static array of pointers of x2, x3, x4 and w2,w2,w4. I thought I could do that with just declaring statis double* x in my header and the following in .cpp: double* GaussLegendre::x = {&GaussLegendre::x2, &GaussLegendre::x3, &GaussLegendre::x4}; but I get the following error: cannot convert from 'double (*)' to 'double * Why is that and how can it be done? This is because x is an "array of pointers to double", so each element of x is a "pointer to a double", or a "double *". The type of x2 is a array of two doubles, or double, so when you take a pointer to it, &x2, you get a pointer to an array of two doubles, or double (*), which cannot be converted to a "double 2". That's what the compiler is telling you. Recall that "an array of type X" can be automatically converted to a "pointer to X". So, 'x2' can be automatically converted to "double *", without any further gymnastic. In other words, lose the "&": double* GaussLegendre::x = {GaussLegendre::x2, GaussLegendre::x3, GaussLegendre::x4}; -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEABECAAYFAkkeCQoACgkQx9p3GYHlUOJL7gCaAvnZlweWfi fdOfmiqyMm2DEH 8AAAn2NXKT7XMA3t3UGiaVKg8u9l8d3d =+e7a -----END PGP SIGNATURE----- Nov 14 '08 #2

 P: n/a On Nov 14, 4:57*pm, "Edward Jensen" #include #include #include #include #include namespace D { std::deque< std::vector< double dvd; } template < typename T > std::ostream& operator<<( std::ostream& os, std::deque< std::vector< T & r_d ) { typedef typename std::deque< std::vector< T ::iterator DIter; for( DIter iter = r_d.begin(); iter != r_d.end(); ++iter ) { std::copy( (*iter).begin(), (*iter).end(), std::ostream_iterator< T >( os, " ") ); os << std::endl; } return os; } int main() { using namespace D; std::vector< double v1(10, 1.1); // 10 elements all initialized std::vector< double v2(11, 2.2); std::vector< double v3(12, 3.3); dvd.push_back( v1 ); dvd.push_back( v2 ); dvd.push_back( v3 ); std::cout << dvd; } /* 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 2.2 3.3 3.3 3.3 3.3 3.3 3.3 3.3 3.3 3.3 3.3 3.3 3.3 */ // Both the elements (std::vector< double >) and the deque itself remain dynamic. dvd.push_back( 9.9 ); // add an eleventh double to 1st collection // How about loading a std::deque named d1 with // four std::vector< double containers // all having 10 elements initialized to 0.1: std::deque< std::vector< double d1(4, std::vector< double >(10, 0.1)); // Thats one line, and the containers remain dynamic. // Still thinking of using primitive arrays and pointers? Nov 15 '08 #3

 P: n/a Edward Jensen wrote: > Now I want to create a static array of pointers of x2, x3, x4 and w2,w2,w4. I thought I could do that with just declaring statis double* x in my header and the following in .cpp: double* GaussLegendre::x = {&GaussLegendre::x2, &GaussLegendre::x3, &GaussLegendre::x4}; but I get the following error: cannot convert from 'double (*)' to 'double * Why is that In C and C++, when you apply the unary '&' to an array, you get a value of pointer-to-array type. For example, if array 'a' is declared as int a; the expression '&a' has type 'int (*)' - a pointer to an array of 10 'int's int (*pa) = &a; // OK This type is not convertible to 'int*' int *pi = &a; // ERROR This is exactly the error your code produces. and how can it be done? Since you are trying to point to arrays of _different_ sizes, using pointers of pointer-to-array type is not an option. Instead, just use an array of "regular" pointers (which is what you have already) and make the point to the very first element of each array double* GaussLegendre::x = { &GaussLegendre::x2, &GaussLegendre::x3, &GaussLegendre::x4 }; or alternatively (and equivalently) double* GaussLegendre::x = { GaussLegendre::x2, GaussLegendre::x3, GaussLegendre::x4 }; (note that there's no '&' operator in the latter case). -- Best regards, Andrey Tarasevich Nov 15 '08 #4

 P: n/a On Nov 15, 12:59*am, Salt_Peter , and he really can have an array of pointers to arrays, std::vector< std::vector< double >* >. I'd want to know more about his particular use, however, before doing that here. I have a sneaky suspicion that he's forgotten the const, and there is one place where C style arrays are better: they allow static initialization. If all of these tables are in fact const, it might make more sense (and it would certainly require less code) to leave them as C style arrays, i.e. something like: double const GaussLegendre::w2 = {1.0, 1.0}; // ... double const *const GaussLegendre::x2 = { ... } ; Typically, I'd also leave off the size of the dimension, and let the compiler calculate it. But again, I'm not sure here; I think the actual size may be important, in which case, it's better explicitly stating it. -- James Kanze (GABI Software) email:ja*********@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 Nov 15 '08 #5

### This discussion thread is closed

Replies have been disabled for this discussion. 