Initializing array of parameterized type in c++ -


i'm working on generic type in need stack allocated array of parameter type. supposed little overhead possible. part of exam, has sparked curiosity. try looking around, failed find useful.

i'm trying create array , initialize members, i'm not entirely sure how properly. have following code:

t b[_dim]; // typeof(_dim) == size_t 

now t can have standard arithmetic operators, default constructor. when t double initialized array with:

memset(b, 0, _dim*sizeof(t)); 

which works fine types such doubles. problem t rational such as:

approach 1

struct rational {    int numerator;      int denominator;    rational(): numerator(0), denominator(1) {} }; 

which cause trouble if converted double after has been set 0. approach run trough elements this:

approach 2

for(size_t = 0; < _dim; i++) {     b[i] = t(); } 

what effecient way of initializing members properly?

a side node when neither type rational. double instance. program runs fine, valgrind complains following error messages (a lot of them, repeatedly):

==24450== conditional jump or move depends on uninitialised value(s) ==24450==    @ 0x5878b60: __printf_fp (printf_fp.c:731) ==24450==    0x5876b4b: vfprintf (vfprintf.c:1654) ==24450==    0x589b654: vsnprintf (vsnprintf.c:119) ==24450==    0x53938fd: std::__convert_from_v(__locale_struct* const&, char*, int, char const*, ...) (c++locale.h:93) ==24450==    0x53a118c: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_m_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (locale_facets.tcc:997) ==24450==    0x53a141f: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (locale_facets.tcc:1144) ==24450==    0x53a5966: std::ostream& std::ostream::_m_insert<double>(double) (locale_facets.h:2398) ==24450==    0x433e9d: void boost::io::detail::put_last<char, std::char_traits<char>, double>(std::basic_ostream<char, std::char_traits<char> >&, double&) (feed_args.hpp:115) ==24450==    0x43273e: void boost::io::detail::put<char, std::char_traits<char>, std::allocator<char>, double&>(double&, boost::io::detail::format_item<char, std::char_traits<char>, std::allocator<char> > const&, boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::string_type&, boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::internal_streambuf_t&, std::locale*) (feed_args.hpp:176) ==24450==    0x43141f: void boost::io::detail::distribute<char, std::char_traits<char>, std::allocator<char>, double&>(boost::basic_format<char, std::char_traits<char>, std::allocator<char> >&, double&) (feed_args.hpp:253) ==24450==    0x42f22f: boost::basic_format<char, std::char_traits<char>, std::allocator<char> >& boost::io::detail::feed<char, std::char_traits<char>, std::allocator<char>, double&>(boost::basic_format<char, std::char_traits<char>, std::allocator<char> >&, double&) (feed_args.hpp:263) ==24450==    0x42db1e: boost::basic_format<char, std::char_traits<char>, std::allocator<char> >& boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::operator%<double>(double&) (format_class.hpp:68) ==24450==  ==24450== use of uninitialised value of size 8 ==24450==    @ 0x5878b6a: __printf_fp (printf_fp.c:731) ==24450==    0x5876b4b: vfprintf (vfprintf.c:1654) ==24450==    0x589b654: vsnprintf (vsnprintf.c:119) ==24450==    0x53938fd: std::__convert_from_v(__locale_struct* const&, char*, int, char const*, ...) (c++locale.h:93) ==24450==    0x53a118c: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_m_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (locale_facets.tcc:997) ==24450==    0x53a141f: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (locale_facets.tcc:1144) ==24450==    0x53a5966: std::ostream& std::ostream::_m_insert<double>(double) (locale_facets.h:2398) ==24450==    0x433e9d: void boost::io::detail::put_last<char, std::char_traits<char>, double>(std::basic_ostream<char, std::char_traits<char> >&, double&) (feed_args.hpp:115) ==24450==    0x43273e: void boost::io::detail::put<char, std::char_traits<char>, std::allocator<char>, double&>(double&, boost::io::detail::format_item<char, std::char_traits<char>, std::allocator<char> > const&, boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::string_type&, boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::internal_streambuf_t&, std::locale*) (feed_args.hpp:176) ==24450==    0x43141f: void boost::io::detail::distribute<char, std::char_traits<char>, std::allocator<char>, double&>(boost::basic_format<char, std::char_traits<char>, std::allocator<char> >&, double&) (feed_args.hpp:253) ==24450==    0x42f22f: boost::basic_format<char, std::char_traits<char>, std::allocator<char> >& boost::io::detail::feed<char, std::char_traits<char>, std::allocator<char>, double&>(boost::basic_format<char, std::char_traits<char>, std::allocator<char> >&, double&) (feed_args.hpp:263) ==24450==    0x42db1e: boost::basic_format<char, std::char_traits<char>, std::allocator<char> >& boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::operator%<double>(double&) (format_class.hpp:68) 

doing either of 2 approaches made valgrind stop complaining.

update variable _dim indeed variable , parsed in. g++11 says:

error: variable-sized object ‘b’ may not initialized 

solution , summary pointed out, call ctor elements:

b t[_dim]; 

and _dim variable not work:

b t[_dim] = {}; 

but can use this::

t b[_dim]; if(std::is_fundamental<t>::value) {     memset(b, 0, _dim*sizeof(t)); } 

as stfrabbit points out, default ctor called when define array. following code:

#include <iostream> struct rational {    int numerator;      int denominator;    rational(): numerator(0), denominator(1)    {std::cout << "rational ctor!" << std::endl;} };  int main() {     rational arr[10]; } 

the output is:

rational ctor! rational ctor! rational ctor! rational ctor! rational ctor! rational ctor! rational ctor! rational ctor! rational ctor! rational ctor! 

so there nothing special have class types. however, built-in types there no default ctor, need add couple of braces, i.e. t b[_dim] = {}; value initialize each element. doing work class types , built-in types.


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -