Nano Hash - криптовалюты, майнинг, программирование

Метод выполнения ошибки сегментации

Соответствующие (я думаю) строки моего кода приведены ниже. Имеется в виду, что есть список Кластеров. Один из них, base, поглотит другой (aborbed). Кластер aborbed должен быть удален из кластера list.

Первая проблема, с которой я столкнулся, заключалась в том, что мне нужно было выполнять другие операции в кластерах base и absorbed после закрытия цикла while. В своих поисках я нашел = &(*li) материал. Я понимаю, что я получаю указатель на адрес элемента li, на который указывает, хотя я не могу сделать absorbed = li, потому что один итератор, а другой (простой?) понтер. Я был бы признателен за некоторые пояснения по этому поводу.

Теперь большая проблема в том, что я получаю ошибку сегментации в строке c->getPoints(); метода joinCluster() Что я делаю неправильно? Что мне делать и почему?

Я использую g++ (GCC) 4.5.2 в Linux x86_64.

Cluster * base;
Cluster * absorbed;

list<Cluster>::iterator li = clusters.begin(); 
while ( li != clusters.end() ) {   
    if (li->getId() == p2) {
        absorbed = &(*li);
        li = clusters.erase(li);
    } else if (li->getId() == p1) { 
        base = &(*li);
    }
++li;
}

base->joinCluster(absorbed);


void Cluster::joinCluster(Cluster * c)
{
    set<unsigned int> pts = c->getPoints(); 
}

set<unsigned int> Cluster::getPoints()
{
return points;
}

class Cluster {
    private:
    std::set<unsigned int> points;
    public:
    std::set<unsigned int> getPoints();
};
15.04.2012

Ответы:


1
list<Cluster>::iterator li = clusters.begin(); 
while ( li != clusters.end() ) {   
    if (li->getId() == p2) {
        absorbed = &(*li);
        li = clusters.erase(li);
    } else if (li->getId() == p1) { 
        base = &(*li);
    }
++li;   // <----  Don't increment when you already deleted.
}

Когда вы удаляете последний элемент в списке, li становится cluster.end(). Затем вы снова увеличиваете его и бум, вы выходите за пределы. ++li должен идти в блоке else.

Также обратите внимание, что когда вы стираете li из контейнера, absorbed содержит недопустимый адрес.

15.04.2012
  • Вы правы, часть ++li я уже исправил. Что касается вашего второго абзаца: когда я стираю элемент из списка, он действительно стирается из памяти? или просто вычеркнуты из списка, но доступны поштучно? 16.04.2012
  • Стандартные контейнеры @Luis хранят элементы по значению. После удаления элемента он исчезает, а все итераторы, указатели и ссылки, связанные с ним, становятся недействительными. Вам нужно будет выполнить поглощение до того, как вы вызовете erase() или сделаете копию элемента. 16.04.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..