sort валится с jemalloc

 
0
 
C++
ava
box | 27.09.2013, 20:13
пытаюсь отсортировать std::map через вектор :

bool pred_asc(const std::pair< string, uint64_t > &a, const std::pair< string, uint64_t > &b)
{
    return a.second > b.second;
}

bool pred_desc(const std::pair< string, uint64_t > &a, const std::pair< string, uint64_t > &b)
{
    return b.second > a.second;
}

  std::vector< std::pair< string, uint64_t > > vec(mymap_tcp_l7.begin(), mymap_tcp_l7.end() );
  if(sort == 1)
    std::stable_sort(vec.begin(), vec.end(), pred_desc);
  else
    std::stable_sort(vec.begin(), vec.end(), pred_asc);
  for (auto p : vec){
if(sizeof(filter_) > 0){
const vector<int> line_get_c( KMP_( p.first, filter_ ) );
if(line_get_c.empty() == false){
    out << "|" << p.second << " | " << p.first;
    temp = out.str(); 
out.clear();
out.str("");
    if(temp.size() > (col - 52)){tm22 = temp.substr (0,(col - 52));}else{tm22 = temp;}
        cs = tm22.c_str();
      mvprintw(tr, 52,"%s",cs);
    i=52+strlen(cs);while(i<col){mvprintw(tr, i," ");i++;}
        tr++;
        if(tr == (row-2))break;
    }
    }
    }

если делать без сортировки то все стабильно
где грабли ?
может есть другой способ сортировки вектора ?
Comments (8)
ava
akizelokro | 30.09.2013, 21:38 #
Честно сказать, код совершенно неудобный для чтения, содержит много неуказанных или ненужных подробностей, и где происходит ошибка, одному богу известно.

Философски размышляя о сравнимости математической логики и программного кода, и исходя из возможной логической провокации, что код должен объяснять сам себя, я думаю вот что.
Ты используешь <pair> (и слава богу, что ещё не <tuple>).
Так вот, если тебе важна сортировка по одному из элементов <pair>, то лучше испробовать другой контейнер. Где целочисленная переменная будет играть роль ключа (а там и сортировку присунуть по нему).
ava
NoviceF | 01.10.2013, 17:04 #

bool pred_asc(const std::pair<string, uint64_t> &a, const std::pair<string,
        uint64_t> &b)
{
    return a.second > b.second;
}
bool pred_desc(const std::pair<string, uint64_t> &a, const std::pair<string,
        uint64_t> &b)
{
    return b.second > a.second;
}
int main()
{
    std::vector<std::pair<string, uint64_t> > vec(mymap_tcp_l7.begin(),
            mymap_tcp_l7.end());

    if (sort == 1)
        std::stable_sort(vec.begin(), vec.end(), pred_desc);
    else
        std::stable_sort(vec.begin(), vec.end(), pred_asc);

    for (auto p : vec)
    {
        if (sizeof(filter_) > 0)
        {
            const vector<int> line_get_c(KMP_(p.first, filter_));
            if (line_get_c.empty() == false)
            {
                out << "|" << p.second << " | " << p.first;
                temp = out.str();
                out.clear();
                out.str("");

                if (temp.size() > (col - 52))
                {
                    tm22 = temp.substr(0, (col - 52));
                }
                else
                {
                    tm22 = temp;
                }

                cs = tm22.c_str();
                mvprintw(tr, 52, "%s", cs);
                i = 52 + strlen(cs);

                while (i < col)
                {
                    mvprintw(tr, i, " ");
                    i++;
                }

                tr++;

                if (tr == (row - 2))
                    break;
            }
        }
    }
}


Если допишешь код до запускаемого состояния, и переименуешь переменные в соостветствии с их назначением, может кто-нибудь и попробует поискать проблему. Вообще на дебагере запускать пробовал? Он обычно ловит всякие сегфолты.
ava
box | 03.10.2013, 17:23 #
эксперементальным путем выяснил что фряха 10-я не любит когда в треаде создаются на лету контейнеры типа мап или вектор , создал все контейнеры глобально и заполняю их из треада с использованием конкурентного мютекса , пока работает а там посмотрим .
ava
volatile | 03.10.2013, 17:42 #
box, имхо у вас причина вообще где-то в другом месте...
например в синхронизации, или памяти элементарно не хватает, или... (телепатирую)
ava
box | 03.10.2013, 21:15 #
появилась новая ошибка :
<jemalloc>: jemalloc_arena.c:355: Failed assertion: "bitmap_get(bitmap, &bin_info->bitmap_info, regind)"
что бы это значило ?
ava
volatile | 03.10.2013, 21:22 #
Цитата (box @  3.10.2013,  21:15 findReferencedText)
<jemalloc>: jemalloc_arena.c:355: Failed assertion: "bitmap_get(bitmap, &bin_info->bitmap_info, regind)"

что бы это значило ? 

Это значит что в файле jemalloc_arena.c на строчке 355 не выполнено условие ассерта. smile 
ava
box | 03.10.2013, 21:43 #
да, я читать умею .
как пофиксить ?
ava
volatile | 04.10.2013, 00:28 #
Цитата (box @  3.10.2013,  21:43 findReferencedText)
как пофиксить ? 

Цитата (volatile @  3.10.2013,  17:42 findReferencedText)
имхо у вас причина вообще где-то в другом месте...

а в каком, телепатов здесь мало.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit