Russian Qt Forum

Программирование => С/C++ => Тема начата: SCAD от Март 16, 2004, 16:27



Название: Как изменить размер char ***t в C (realloc)
Отправлено: SCAD от Март 16, 2004, 16:27
Существует таблица строк: char *t
  • [y]
как увеличить (уменьшить) размер таблицы динамически (с помошью realloc) ?


Название: Как изменить размер char ***t в C (realloc)
Отправлено: Злой от Март 16, 2004, 17:06
Размер массива x * y * sizeof (char *), где x - количество строк, y - количество столбцов.


Название: Как изменить размер char ***t в C (realloc)
Отправлено: EugeneVC от Март 16, 2004, 20:17
лучше вообще использовать vector и все STL
тормозней, зато можно забыть от всяких там realocах.


Название: Как изменить размер char ***t в C (realloc)
Отправлено: SCAD от Март 17, 2004, 21:23
2 Злой Спасибо большое.
2 EugeneVC
Цитата: "EugeneVC"
лучше вообще использовать vector и все STL
тормозней, зато можно забыть от всяких там realocах.

Это не верный подход к делу. Можно много чего использовать, но в данном случае это решение оптимальное.


Название: Как изменить размер char ***t в C (realloc)
Отправлено: EugeneVC от Март 17, 2004, 22:05
почему не оптимально?


Название: Как изменить размер char ***t в C (realloc)
Отправлено: Злой от Март 17, 2004, 22:21
Код:

std::vector<std::vector<std::string> > t;

Выглядит довольно жутко. Думаю, SCAD имел в виду то, что при изменении размера массива указателей будет выполняться только копирование в новую область памяти самих указателей, а стороки останутся на месте. При изменении размера вектора будет выполняться копирование каждого вектора-элемента и объектов класса string. Действительно, не оптимально. std::list не дает доступа к элементу по его индексу. Можно попробовать
Код:

std::vector<char *> t(x * y);
// ...
char *p = t[i * y + j]; // элемент (i,j)


Название: Как изменить размер char ***t в C (realloc)
Отправлено: Anonymous от Март 18, 2004, 20:01
Цитата: "Злой"
Размер массива x * y * sizeof (char *), где x - количество строк, y - количество столбцов.


Есть как минимум две потенциальные проблемы

1.  Что делать с указателями, которые появятся после увеличения памяти.  В новых ячейках таблицы будет всякий хлам и можно налететь на segmentation fault при неаккуратном чтении из таблицы.

2.  Поплывут индексы у строк.