Выделение памяти под структуру
От: Pils  
Дата: 03.08.10 17:21
Оценка:
Будем считать, что жара совсем съела мозг, и потому я так туплю Имеется структура следующего вида:

struct Node
{
  Node* children[10];
  vector<int> num;  
};


Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?
Re: Выделение памяти под структуру
От: Vamp Россия  
Дата: 03.08.10 17:24
Оценка:
P>Будем считать, что жара совсем съела мозг, и потому я так туплю Имеется структура следующего вида:
Что-то я не понял этого вида. Почему num — вектор, а дети живут в статическом массиве? Неразумно.

P>Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?

А что значит "правильно" и о каких проблемах ты беспокоишься?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Выделение памяти под структуру
От: Pils  
Дата: 03.08.10 17:38
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А что значит "правильно" и о каких проблемах ты беспокоишься?


У меня по каким-то причинам вылетала ошибка сегментации при добавлении элемента к вектору. Структура хитрая, но для моей задачи вроде довольно удобная.

Можно даже опустить слово "правильно" и спросить просто "Как написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву?"
Re[3]: Выделение памяти под структуру
От: Vamp Россия  
Дата: 03.08.10 17:41
Оценка:
P>Можно даже опустить слово "правильно" и спросить просто "Как написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву?"

Гм, примерно вот так:


Node* node = new Node;
parent->children[index] = node;
node->num.push_back(10);


Наверное, тебе стоит раскрыть задачу.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Выделение памяти под структуру
От: Pils  
Дата: 03.08.10 17:56
Оценка:
Здравствуйте, Vamp, Вы писали:
V>Гм, примерно вот так:

V>
V>Node* node = new Node;
V>parent->children[index] = node;
node->>num.push_back(10);
V>


V>Наверное, тебе стоит раскрыть задачу.


Да, можно сделать что-то вроде


Node* create_node()
{
    Node* new_node = new Node;
    for (int i = 0; i < 10; i++)
        new_node->children[i] = NULL;
    return new_node;
}

void add_node(Node* curr, int index)
{
    Node* new_node = create_node();
    curr->children[index] = new_node;
}


А если инициализировать конструктором как все это будет выглядеть?
Re[5]: Выделение памяти под структуру
От: Vamp Россия  
Дата: 03.08.10 17:58
Оценка:
P>А если инициализировать конструктором как все это будет выглядеть?
Точно так же.
Да здравствует мыло душистое и веревка пушистая.
Re: Например так
От: Erop Россия  
Дата: 03.08.10 18:27
Оценка:
Здравствуйте, Pils, Вы писали:

P>Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?


struct Node
{
    std::auto_ptr<Node> children[10];
    std:vector<int> num;

    void AddChildAt( std::auto_ptr<Node> child, int at )
    {
        assert( 0 <= at && at <= lengthof( children ) );
        children[at] = child;
    }
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Например так
От: K13 http://akvis.com
Дата: 04.08.10 04:32
Оценка:
E>
struct Node
E>{
E>    std::auto_ptr<Node> children[10];
// skipped
E>}


боюсь, будут проблемы при копировании такой структуры.
auto_ptr идеально подходит для передачи параметров вместе с владением.
в других случаях — очень опасная вещь.
Re: Выделение памяти под структуру
От: night beast СССР  
Дата: 04.08.10 04:33
Оценка:
Здравствуйте, Pils, Вы писали:

P>Будем считать, что жара совсем съела мозг, и потому я так туплю Имеется структура следующего вида:


P>
P>struct Node
P>{
P>  Node* children[10];
P>  vector<int> num;  
P>};
P>


P>Как правильно написать на С++ инициализацию объекта типа Node и добавление нового элемента к существующему дереву чтобы потом не возникало проблем с памятью при добавлении неких значений в num?


template< std::size_t Capacity = 10 >
struct Node
{
  typedef std::size_t size_type;

  Node* children[Capacity];
  vector<int> num;  

  Node() : children(), num() {}
  ~Node ();

  void push_back ( Node * node ) {
     size_type i =0;
     for( ; i < Capacity; ++i ) if ( this->children[i] == 0 ) break;
     assert( i != Capacity );
     this->children[i] = node;
  }

private:
  Node ( Node const & );
  void operator = ( Node );
};
Re[3]: Например так
От: night beast СССР  
Дата: 04.08.10 04:37
Оценка: +1
Здравствуйте, K13, Вы писали:


E>>
struct Node
E>>{
E>>    std::auto_ptr<Node> children[10];
K13>// skipped
E>>}


K13>боюсь, будут проблемы при копировании такой структуры.

K13>auto_ptr идеально подходит для передачи параметров вместе с владением.
K13>в других случаях — очень опасная вещь.

скорее всего работать будут с указателями на структуру, поэтому лучше сделать тип некопиабельным и не париться.
Re[3]: Например так
От: Erop Россия  
Дата: 04.08.10 06:11
Оценка:
Здравствуйте, K13, Вы писали:


K13>боюсь, будут проблемы при копировании такой структуры.

K13>auto_ptr идеально подходит для передачи параметров вместе с владением.
K13>в других случаях — очень опасная вещь.

А думаешь с копированием исходной проблем не будет?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Выделение памяти под структуру
От: Erop Россия  
Дата: 04.08.10 06:13
Оценка:
Здравствуйте, night beast, Вы писали:

NB>
NB>  ~Node ();
NB>


А что, думаешь узел детьми не владеет?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Выделение памяти под структуру
От: night beast СССР  
Дата: 04.08.10 06:22
Оценка: +1
Здравствуйте, Erop, Вы писали:

NB>>
NB>>  ~Node ();
NB>>


E>А что, думаешь узел детьми не владеет?..


хз. может в пуле освобождается. может у дитя несколько родителей.
вобщем, на усмотрение...
Re: Выделение памяти под структуру
От: MasterZiv СССР  
Дата: 04.08.10 08:47
Оценка:
Pils wrote:

> Как правильно написать на С++ инициализацию объекта типа Node и

> добавление нового элемента к существующему дереву чтобы потом не
> возникало проблем с памятью при добавлении неких значений в num?

Любая инициализация, вызывающая конструктор этой структуры,
будет правильной. Видимо, у тебя этого не происходило.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Выделение памяти под структуру
От: MasterZiv СССР  
Дата: 04.08.10 08:48
Оценка:
Pils wrote:
> А если инициализировать конструктором как все это будет выглядеть?

В С++ вообще-то НЕЛЬЗЯ НЕИНИЦИАЛИЗИРОВАТЬ конструктором.
Т.е. конечно же можно, но надо очень сильно постараться.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Выделение памяти под структуру
От: Pils  
Дата: 04.08.10 14:23
Оценка:
Вчера до описанных в теме советов так и не добрался, написал в итоге по тупому:

struct Node
{
  Node* children[10];
  vector <string>  words;  
};

Node* create_node()
{
    Node* new_node = new Node;
    for (int i = 0; i < 10; i++)
        new_node->children[i] = NULL;
    return new_node;
}

void add_node(Node* curr, int index)
{
    Node* new_node = create_node();
    curr->children[index] = new_node;
}


Далее в программе дерево указанным ниже образом заполняется, после заполнения сортируется массив, ну и затем по поступающим командам считываются нужные данные:


Node* tree_root = create_node();
…
for (;;)    
    tree_input(tree_root, input_word);

void tree_input(Node* root, string word)
{
     Node* curr = root;
      int key;  
     ...
     for (size_t i = 0; i < word.size(); i++)
     {
         key = letter_to_int(word[i]);
         
         if (curr->children[key] == NULL)
         {
             add_node(curr, key);
         }
         curr = curr->children[key];

     }
     
    curr->words.push_back(word); 
    ... 
}


Дома под wxDev-C++ все работает нормально, но для проверки я отсылаю исходник на удаленную машину, там он автоматом компилится под линукс с помощью g++ 4.3.2 и выдает sigsegv на первом же тесте (повторюсь, на домашнем компе с этими же тестами все работает как надо). Подскажите, в чем может быть проблема и как ее исправить?
Re[7]: Выделение памяти под структуру
От: XuMuK Россия  
Дата: 04.08.10 14:42
Оценка:
Здравствуйте, Pils, Вы писали:

P>Дома под wxDev-C++ все работает нормально, но для проверки я отсылаю исходник на удаленную машину, там он автоматом компилится под линукс с помощью g++ 4.3.2 и выдает sigsegv на первом же тесте (повторюсь, на домашнем компе с этими же тестами все работает как надо). Подскажите, в чем может быть проблема и как ее исправить?


ulimit -c unlimited
./run_test #segmentation fault (core dumped)
gdb test.bin test.bin.core

ну и посмотреть в гугле команды gdb: bt, frame, print для начала.
Re[8]: Выделение памяти под структуру
От: Pils  
Дата: 04.08.10 15:05
Оценка:
Здравствуйте, XuMuK, Вы писали:

XMK>Здравствуйте, Pils, Вы писали:


XMK>ulimit -c unlimited

XMK>./run_test #segmentation fault (core dumped)
XMK>gdb test.bin test.bin.core

XMK>ну и посмотреть в гугле команды gdb: bt, frame, print для начала.


Вот косяк как раз в том, что линукса под рукой нет, и время на исходе.
Re: Выделение памяти под структуру
От: Pils  
Дата: 04.08.10 18:01
Оценка:
За неимением линукса пришлось искать место возникновения проблемы тупо с помощью тестовой печати. Результаты интересные: дерево создается, все вершины и ключи на своих местах. Ошибка сегментации вылетает, когда на некотором этапе происходит вывод данных одной из вершин:

cout << curr->words[fr_count];


К этому моменту fr_count = 0; curr->words.size() = 1, нужный элемент там находится. В чем дело-то может быть
Re[2]: Выделение памяти под структуру
От: Pils  
Дата: 06.08.10 11:14
Оценка:
Help anyone?

Из-за чего при повторном обращении к одному и тому же элементу массива, по одному и тому же адресу, может вылезать ошибка?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.