Size: a a a

2021 February 23

s

std::slavik in supapro.cxx
for(size_t i = 1; i < g.num_edges(); ++i) {
попробуй так
если не будет ошибки - дело значит в этом
там уж отлаживай
ну и там -1 где надо сделай
источник

s

std::slavik in supapro.cxx
dmbldr
Переслано от dmbldr
Подскажите, откуда тут берётся ошибка double free or corruption (out).

Основной код:
class brute_force {
public:
void impl_fill(graph g) {
   if(all_subgraphs.find(g) == all_subgraphs.end()) {
       if(g.is_reachable(_s, _d)) {
           all_subgraphs.insert(g);
           for(size_t i = 0; i < g.num_edges(); ++i) {
               g.erase_edge(i);
               impl_fill(g);
           }
       }
   }
}

void fill_set() {
   impl_fill(_g); <--вот тут вылетает
}
private:
   graph _g;
   std::unordered_set<graph, graph_hash> all_subgraphs;
};
Код класса `graph`:
class graph {
public:
   using byte = unsigned char;
   using edge_type = std::vector<std::pair<byte, byte>>;

   graph() = default;
   graph(graph const& other) = default;

   graph(edge_type edges, byte n) : edges(std::move(edges)), n(n) {};

private:
   edge_type edges;
   byte n = 0;
};
а - ну и типа не может быть такого что 2 вершины связаны с одной и той же?
0     0
\   /
  0
источник

s

std::slavik in supapro.cxx
и при обходе каждой пытается удалиться одна и та же
источник

s

std::slavik in supapro.cxx
для таких штук вроде как слабые указатели заходят
источник

d

dmbldr in supapro.cxx
std::slavik
а - ну и типа не может быть такого что 2 вершины связаны с одной и той же?
0     0
\   /
  0
Может быть. Но граф хранится в виде списка рёбер, который просто содержит пару чисел-номеров вершин.
источник

s

std::slavik in supapro.cxx
dmbldr
Может быть. Но граф хранится в виде списка рёбер, который просто содержит пару чисел-номеров вершин.
ну так там есть пары у которых вторые числа одинаковые?
источник

s

std::slavik in supapro.cxx
std::slavik
а - ну и типа не может быть такого что 2 вершины связаны с одной и той же?
0     0
\   /
  0
типа тут - если мы удалили посетив первое ребро вершину - мы тут же должны удалить второе
источник

s

std::slavik in supapro.cxx
если мы этого не сделаем - при посещении второго ребра мы попытаемся удалить удаленную уже вершину
источник

s

std::slavik in supapro.cxx
источник

d

dmbldr in supapro.cxx
std::slavik
а - ну и типа не может быть такого что 2 вершины связаны с одной и той же?
0     0
\   /
  0
Я знаком с указателями, но пока что не могу осознать в чем проблема связанности.
источник

s

std::slavik in supapro.cxx
for(size_t i = 0; i < g.num_edges(); ++i) {
    g.erase_edge(i);
    impl_fill(g);
}
ну типа вот здесь мы удаляем ребра в цикле насколько я понял - во-первых - g.num_edges() изменяется ли после  g.erase_edge(i)?
источник

s

std::slavik in supapro.cxx
во вторых - могут ли среди удаляемых ребер оказаться с одинаковыми вершинами?
источник

d

dmbldr in supapro.cxx
std::slavik
for(size_t i = 0; i < g.num_edges(); ++i) {
    g.erase_edge(i);
    impl_fill(g);
}
ну типа вот здесь мы удаляем ребра в цикле насколько я понял - во-первых - g.num_edges() изменяется ли после  g.erase_edge(i)?
Возвращает размер массива vector<pair<uchar,uchar>>
источник

s

std::slavik in supapro.cxx
удалится ли при удалении ребра в таком случае в той же итерации цикла связанное ребро?
источник

s

std::slavik in supapro.cxx
если не удалится - тогда в последующих итерациях мы получим ребро один конец которого удален уже
источник

s

std::slavik in supapro.cxx
dmbldr
Возвращает размер массива vector<pair<uchar,uchar>>
то есть у нас одновременно меняется и левая часть неравенства i < g.num_edges() и правая на каждой итерации
источник

d

dmbldr in supapro.cxx
std::slavik
то есть у нас одновременно меняется и левая часть неравенства i < g.num_edges() и правая на каждой итерации
Ааа. Вот теперь кажется понял. Спасибо!
источник

s

std::slavik in supapro.cxx
dmbldr
Ааа. Вот теперь кажется понял. Спасибо!
не факт что в этом/только этом проблема, но такой цикл в сочетании с рекурсией выглядит опасненько
источник

AB

Artöm Bakri Al-Sarmi... in supapro.cxx
std::slavik
на какую память указывает nullptr
nullptr не указатель
источник

A

Artem in supapro.cxx
Antony Polukhin
Вам нужно и поспать немного, и обработку событий окна не заморозить, при этом активные действия со стороны пользователя не ожидаются.

Яб попробовал завести sf::Clock, в основном цикле по обработке событий проверять, что прошло нужное время. Если время не прошло - вызывать небольшой сон на несколь десятков милисекунд, чтобы не кушать ресурсы процессора. Что-то типа


sf::Clock clock;
const sf::Time kSleepTime = sf::milliseconds(70);
const float kBotReactionDelay = 5.0;
//...

while(m_Window.isOpen()) {
   //...

   if (clock.GetElapsedTime() < kBotReactionDelay) {
       sf::sleep(kSleepTime);
   }
}
А оно будете как-то обнулятся постоянно?
источник