Передача по ссылке в inline функцию
От: tasko  
Дата: 07.12.10 12:35
Оценка:
Существует 2 почти идентичные функции по преобразованию вектора в строку.
Отличие — create_filtered_string игнорирует F и более "крупные числа"
  
inline void vector_to_string(std::vector<boost::uint8_t> const& in, std::string& out) {
        int len = in.size();

        char *p = new char(len + 1);

        for (int i = 0; i < len; i++)
            p[i] = in[i] < 10 ? in[i] + 48 : in[i] + 55;

        p[len] = 0;

        out = std::string(p);

        delete(p);
    }
    inline void create_filtered_string(std::vector<boost::uint8_t>& in, std::string& out) 
    {
        int len = in.size();
        char *p2 = new char(len + 1);
        for (int i = 0; i < len; i++)
        {
            if(in[i] < 10)
            {
                p2[i] = in[i] + 48;
            }
            else if(in[i] < 15)
            {
                p2[i] = in[i] + 55;
            }
        }       
        p2[len] = 0;        
        out = std::string(p2);
        delete(p2);
    }


Пример использования
unsigned char undef[] = {0x05 , 0x01 , 0x05 , 0x00 , 0x02 , 0x02 , 0x04 , 0x00 , 0x04 , 0x09 , 0x07 , 0x07 , 0x02 , 0x03 , 0x06 , 0x0f};
    std::vector<boost::uint8_t> tst(undef, undef + sizeof(undef));

    std::string out;
    ASN1::vector_to_string(tst, out);
    cout<<"vector_to_string(tst, out);"<<endl;
    std::cout<<out<<std::endl;
    
    std::string out2;   
    ASN1::create_filtered_string(tst, out2);
    cout<<"create_filtered_string(tst, out);"<<endl;
    std::cout<<out2<<std::endl;


но на выходе получаем интересное:
> ./convertVectorString 
ASN1::vector_to_string(tst, out);
515022404977236F
ASN1::create_filtered_string(tst, out);
515022404977236F

То есть идентичные строки.

Если из объявления
void create_filtered_string(std::vector<boost::uint8_t>& in, std::string& out)
убрать ссылочность на in и оставить std::vector<boost::uint8_t> in все проходит ожидаемо — F на конце не входит в итоговую строку.
> ./convertVectorString 
ASN1::vector_to_string(tst, out);
515022404977236F
ASN1::create_filtered_string(tst, out);
515022404977236


Что за особенность поведения такая?
с++ ссылки inline
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.