Russian Qt Forum
Ноябрь 24, 2024, 02:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Динамический двумерный массив объектов. Что не так?  (Прочитано 7432 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Июль 23, 2009, 14:57 »

Здравствуйте!


Делаю я сейчас абстрактный класс "таблица". Эта таблица состоит из объектов - "ячеек". В момент создания объекта "таблица" известно количество ячеек по горизонтали и вертикали.

В процессе работы я нашел неплохое описание, как делать многомерные динамические массивы. "C++. Бархатный путь. Часть 1. Страница 76. Многомерные динамические массивы." http://www.cyberguru.ru/programming/cpp/cpp-velvet-way-page76.html

По аналогии делаю и свой класс. Заголовок

Код:
class EditorAbsTable
{
public:
EditorAbsTable(int x, int y, QString table_text);
~EditorAbsTable(void);

private:
void create_cells_array(int x, int y);
void delete_cells_array(void);
void clear_table(void);

int columns;
int rows;

EditorAbsTableCell **cells; // Ячейки таблицы
};

Реализация

Код:
// Конструктор
EditorAbsTable::EditorAbsTable(int x, int y, QString table_text)
{
columns=x;
rows=y;
create_cells_array(x,y);
clear_table();
convert_table_to_internal(table_text);
}

// Деструктор
EditorAbsTable::~EditorAbsTable(void)
{
delete_cells_array();
}

// Выделение памяти под двумерный массив таблицы
void EditorAbsTable::create_cells_array(int x, int y)
{
cells=new EditorAbsTableCell*[x];
for(int i=0;i<x;i++)
  cells[i]=new EditorAbsTableCell[y];
}

// Удаление памяти, отведенной под двумерный массив таблицы
void EditorAbsTable::delete_cells_array(void)
{
for(int i=0;i<columns;i++)
  delete []cells[i];

delete []cells;
}

// Очистка таблицы
void EditorAbsTable::clear_table(void)
{
for(int i=0;i<columns;i++)
  for(int j=0;j<rows;j++)
   cells[i][j].clear();
}

Проблема в том, что возникает сегфолт в методе clear_table(). Сегфолт возникает при вызове cells[ i ][ j ].clear() когда i становится равным 1. (Пока i=0 а j=0..n, вызов cells[ i ][ j ].clear() срабатывает нормально). То есть, обрабатывается только один столбец.

Я так подозреваю, что сегфолт происходит из-за того, что по указанным координатам, начиная с cells[1...x][...] ссылок на объекты-ячейки просто нет, так как они не были созданы в методе create_cells_array(). Поэтому не может вызваться метод clear() для соответсвующей ячейки.

Но вот смотрю я на код метода create_cells_array(), и не пойму, как же его переделать так, чтобы и память для каждой ячейки выделилась, и конструктор для каждой ячейки сработал.

Как это сделать?
« Последнее редактирование: Июль 25, 2009, 21:16 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Июль 23, 2009, 22:46 »

поправь на "решено", что ли Улыбающийся
Записан
denka
Гость
« Ответ #2 : Июль 24, 2009, 14:50 »

Хотелось бы знать к чему огород из многомерных массивов, если для таблицы прекрасно можно обойтись одномерным?
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Июль 25, 2009, 21:16 »

Все, спасибо, вопрос снят. В топике код вилидный, это я с данными прогнался.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.268 секунд. Запросов: 23.