║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
1

Создание структуры "префиксное дерево". Ошибка "Access violation writing location".

22.03.2011, 00:42. Показов 3670. Ответов 1
Метки нет (Все метки)

Есть структура данных - бор или префиксное дерево.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class trie
{
    char value; // символ узла
    trie** pointers; // ссылки на следующие узлы
public:
    trie(char value = '#'){
        this->value = value;
        this->pointers = new trie*[26]; // выделение памяти
        FOR(i,0,26) this->pointers[i] = 0; // обнуление
    }
    ~trie(){  }
    void add(const string &s, const int &p){
        if (p >= s.length()) return;
        int i = s[p]-'a';
        if (this->pointers[i] == 0) { // проверка создан ли объект
            this->pointers[i] = new trie(s[p]);
        }
        this->pointers[i]->add(s, p+1);
    }
    // подсчет количества установленных узлов
    int length(){
        int res = 0;
        FOR(i,0,26) 
            if (this->pointers[i] != 0) 
                res += 1 + this->pointers[i]->length();
        return res + int(this->value != '#');
    }
};
Если смотреть на код приведенный выше у меня вылетает ошибка:
Unhandled exception at 0x7c812afb in solution.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0003374c..

Если я использую код приведенный ниже:
Unhandled exception at 0x004117aa in solution.exe: 0xC0000005: Access violation reading location 0x00000018.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    trie(char value = '#'){
        this->value = value;
        this->pointers = (trie**)calloc(26, sizeof(trie*)); // сишное выделение памяти
    }
    ~trie(){  }
    void add(const string &s, const int &p){
        if (p >= s.length()) return;
        int i = s[p]-'a';
        if (!this->pointers[i]) {
            this->pointers[i] = new trie(s[p]);
        }
        this->pointers[i]->add(s, p+1);
    }
Причем это происходить при p = 3444, т.е. глубина дерева = 3444. Не знаете есть ли какие ограничение на память, которую можно выделять динамически или еще что-то в таком духе?

Добавлено через 2 минуты
Что значат ошибки я знаю, я не пойму чем они вызваны.

Добавлено через 10 минут
C++
1
2
3
4
5
6
    vector<trie*> pointers;
public:
    trie(char value = '#'){
        this->value = value;
        this->pointers.resize(26, 0);
    }
Если писать с вектором, тогда ошибка вылетает на библиотеке xmemory
C++
1
2
3
4
5
6
7
8
9
10
11
12
        // TEMPLATE FUNCTION _Allocate
template<class _Ty> inline
    _Ty _FARQ *_Allocate(_SIZT _Count, _Ty _FARQ *)
    {   // check for integer overflow
    if (_Count <= 0)
        _Count = 0;
    else if (((_SIZT)(-1) / _Count) < sizeof (_Ty))
        _THROW_NCEE(std::bad_alloc, NULL);
 
        // allocate storage for _Count elements of type _Ty
    return ((_Ty _FARQ *)::operator new(_Count * sizeof (_Ty))); // вот эта строчка
    }
Ошибка:
Unhandled exception at 0x7c812afb in solution.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0003373c..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2011, 00:42
Ответы с готовыми решениями:

Непонятная ошибка "Access violation writing location 0xcdcdcdd5"
#include &lt;iostream&gt; #include &lt;cstdlib&gt; struct Node{ int data; Node *next, *prev;...

Ошибка "Unhandled exception, Access violation writing location"
Пишу вот так: root-&gt;child1-&gt;parent=root; root-&gt;child2-&gt;parent=root;выходит ошибка Unhandled...

Ошибка исполнения "Access violation writing location 0x.........."
Здравствуйте! Написал код в MS Visual Studio 2012 64-битной такой код: #include &quot;stdafx.h&quot;...

Ошибка компилятора: "Access violation writing location"
Здравствуйте! Проблема в том что я пишу простой скрипт и у меня всегда вылезает окошко с надписью :...

1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
30.03.2011, 12:59  [ТС] 2
Закодил мапой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    class T
    {
        map<char,T *> m;
    public:
        T(){}
        void add(string s){
            if (s.length() > 0){
                if (!this->m[s[0]]){
                    T * tmp = new T();
                    tmp->add(s.substr(1));
                    this->m[s[0]] = tmp;
                }else {
                    this->m[s[0]]->add(s.substr(1));
                }
            }
        }
        int lenght(){
            if (m.empty()) return 1;
            int res = 0;
            map<char,T *>::iterator it;
            for (it = m.begin(); it != m.end(); ++it)
                res += it->second->lenght();
            return res;
        }
    };
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2011, 12:59
Помогаю со студенческими работами здесь

Ошибка "Access violation writing location" при работе с массивом.
Задание номер 2 #include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;math.h&gt; #include &lt;cmath&gt;...

"0xC0000005: Access violation reading location" при запуске
Не компилируется #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cctype&gt; using...

Как можно найти итерацию, на которой происходит "access violation reading location"?
Ситуация такая что имеется функция которая вызывается в цикле около 1 млн. раз, в какой-то из...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru