Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

copying an array into a vector

I have written a small program:

void showrecord()
{
     char *a[]={ "O_BILLABLE_ACCOUNT","O_CUSTOMER_TYPE_INDICATOR",
                 "O_A_PARTY_MSISDN_ID","O_A_PARTY_EQUIPMENT_NUMBER",
                 "O_A_PARTY_IMSI","O_A_PARTY_LOCATION_INFO_CELL_ID",
                 ...  
               };

     vector<std::string> fields(a,a+75);

     cout<<"done!!!"<<endl;
}

int main()
{
     showrecord();
}

I have array of string literals and i want them to be copied into a vector. I did not find any other easy way to do it :(.Or if there is any direct way to initialize the vector without using the array ,that would be very much helpful. This is dumping the core after i run the executable on unix. It gives me a warning though like :

Warning 829: "test.cpp", line 12 
# Implicit conversion of string literal to 'char *' is deprecated.
D_TYPE","O_VARCHAR_5","O_VARCHAR_6","O_VARCHAR_7","O_VARCHAR_8","O_VARCHAR_9"};

But the same code is running fine on windows without any problem. I am using the compiler aCC on HPUX.

Please help! EDIT below is teh stacktrace of the dump.

(gdb) where
#0  0x6800ad94 in strlen+0xc () from /usr/lib/libc.2
#1  0xabc0 in std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string<char,std::char_traits<char>,std::allocator<char>>+0x20 ()
#2  0xae9c in std<char const **,std::basic_string<char,std::char_traits<char>,std::allocator<char>> *,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>::uninitialized_copy+0x60 ()
#3  0x9ccc in _C_init_aux__Q2_3std6vectorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__TQ2_3std9allocatorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc____XTPPCc_FPPCcT118_RW_is_not_integer+0x2d8
    ()
#4  0x9624 in showrecord () at test.cpp:13
#5  0xdbd8 in main () at test.cpp:21
like image 591
Vijay Avatar asked Dec 21 '22 12:12

Vijay


2 Answers

Why 75?

Change

vector<std::string> fields(a,a+75);

to

vector<std::string> fields(a, a + sizeof a / sizeof *a);

There's no arguably 'better' way to initialize your vector for C++03, but for C++0x you have access to a more convenient syntax, dispensing with the C array:

std::vector<std::string> fields {
    "O_BILLABLE_ACCOUNT",
    // ...
};
like image 87
Luc Danton Avatar answered Dec 24 '22 01:12

Luc Danton


Try const char* a[] instead of char* a[]. String literals are of type const char*, not char*, and hence you get the warning.

like image 28
Anteru Avatar answered Dec 24 '22 01:12

Anteru