Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 04.03.2014, 10:25   #1
opencloser
Пользователь
 
Регистрация: 04.03.2014
Сообщений: 15
По умолчанию Управление динамической памятью при вложенных структурах

Что то не получается разобраться, как все таки Delphi7 выделяет память...
Подробнее, есть код:
1)
Код:
ComPort = record  // описание аппарата подключенного к ком порту
   ....
    all_buf      : array of ShortString;//   буфер
   .... 
    template_d: array of template_data;   // шаблоны
end;
2)
Код:
type
  template_data=record                       // описание шаблона
    name_template  : ShortString;                // имя
    search_function: ShortString;                 // функция
    f_parameter    : array of ShortString;       // набор параметров
    f_value        : array of ShortString;         //набор значений
    search_p       : array of search_pokazatel;//набор показателей шаблона
  end;

type  // описание показателя
  search_pokazatel = record
    name_pokazatel :ShortString;                  // имя
    pokazatel_function :ShortString;              // функция
    f_parameter    : array of ShortString;        // параметры
    f_value        : array of ShortString;        // значения
    result_pokaz   :ShortString;                  // Результат
  end;
3)
Как я управляю памятью:
Код:
TComPortClass = Class // Базовый класс для управления аппаратами
  private
    FSComPort: array of ComPort; // массив подключенных аппаратов
    ComPortCount : integer; // номер аппарата в этом массиве
    function GetSComPort(index: integer): ComPort; 
    procedure SetSComPort(index: integer;const Value:Comport);
  public
    function SComPortAdd(Value: ComPort) : Integer;
    property SComPort[Index: integer]: ComPort read GetSComPort write SetSComPort;  
   end;

function TComPortClass.GetSComPort(Index: integer) :ComPort ;
begin
  Result := FSComPort[Index];
end;

Procedure TComPortClass.SetSComPort(index: integer;const Value:Comport);
begin
  FSComPort[Index]:= Value;   
end;

function TComPortClass.SComPortAdd(Value: ComPort) : Integer;
begin
  ComPortCount:=ComPortCount+1;
  SetLength(FSComPort,Length(FSComPort)+1);
  SetSComPort(High(FSComPort),Value);
  Result := High(FSComPort);
end;
Теперь к проблеме:
Есть
Код:
Com_i: TComPortClass;
Все работает прекрасно, пока я не пытаюсь выделить память под параметры показателя.
Код:
SetLength(  Com_i.FSComPort[com_id].template_d[high_i].search_p[high_j].f_parameter,
                     length(Com_i.FSComPort[com_id].template_d[high_i].search_p[high_j].f_parameter)+1
                         );
Понимаю что тип показатель может занимать "непонятно какой длинны" место в памяти, и мой вызов:
Код:
SetLength(    Com_i.FSComPort[com_id].template_d[high_i].search_p,
                     length(Com_i.FSComPort[com_id].template_d[high_i].search_p)+1
                      );
не совсем корректный. Хотелось бы узнать как преобразовать исходный класс для управления памятью в моем примере. Структуры не хотелось бы трогать. И еще хорошо бы, если вы смогли бы мне пояснить, как все таки работает SetLength, т.к. насколько я понял из документации, данная мной структура вполне должна отрабатывать.

Последний раз редактировалось opencloser; 04.03.2014 в 11:45.
opencloser вне форума
Старый 04.03.2014, 11:21   #2
opencloser
Пользователь
 
Регистрация: 04.03.2014
Сообщений: 15
По умолчанию

Напрашивается наследование..., но все таки, хотелось бы минимизировать изменение кода, а в идеале изменить только базовый класс.
opencloser вне форума
Старый 04.03.2014, 12:21   #3
opencloser
Пользователь
 
Регистрация: 04.03.2014
Сообщений: 15
По умолчанию

Все работает, проблема не в этом!
Как закрыть тему то?
opencloser вне форума
Старый 04.03.2014, 12:30   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Код:
ComPortCount : integer; // номер аппарата в этом массиве
...
function TComPortClass.SComPortAdd(Value: ComPort) : Integer;
ComPortCount:=ComPortCount+1;
Комментарий таки неверный, не "номер", а "количество".

Лично я бы такое не доверил своим "рукам", слишком много операций которые могут легко быть написаны некорректно с точки зрения логики, но корректно для компилятора, поэтому использовал бы списки TList или даже TObjectList (или их обобщённые версии, если дельфи 2009+), придётся только добавить инициализацию самих списков, но не их элементов и выделения памяти памяти под всё это.
Хотя, конечно, на любителя.

А тему модераторы закроют, когда увидят, не беспокойтесь.
phomm вне форума
Старый 04.03.2014, 13:22   #5
opencloser
Пользователь
 
Регистрация: 04.03.2014
Сообщений: 15
По умолчанию

Спасибо, поправил . Как то не обратил внимания
opencloser вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что с динамической памятью? Вероника99 Помощь студентам 1 18.01.2014 23:35
Проблема с динамической памятью в си Hacker))) Общие вопросы C/C++ 0 16.06.2012 22:35
Паскаль. Работа с динамической памятью. McFrey Помощь студентам 1 06.04.2012 16:56
Списки (Си). Проблема с динамической памятью. hak555 Помощь студентам 0 18.12.2011 21:20
ошибка в работе с динамической памятью thrashkid Общие вопросы C/C++ 8 30.06.2011 00:48