Обращение к последнему элементу динамического массива

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Обращение к последнему элементу динамического массива

Сообщение zub » 16.11.2015 22:48:18

Код: Выделить всё
Finalize(FListOfFiles,Length(FListOfFiles)-1);

что этим хотим сказать?
думаю должно быть
Код: Выделить всё
setlength(FListOfFiles,0);

накрайняк
Код: Выделить всё
Finalize(FListOfFiles);

но наверно Finalize не в конце программы в корне неверно - для структуры которая может быть повторно использована - ты потом "инициализе" не забудешь сделать?
Заботливый компилятор конечно после первого Finalize всё забъет нулями и повторный Finalize при уничтожении класса всё поймет и выполнен не будет. но представими что какаянибудь мегооптимизация (хз что там дальше в фпц появится :lol: ) будет финализируемые структуры забивать мусором а не нулями...
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Обращение к последнему элементу динамического массива

Сообщение Mikhail » 16.11.2015 22:50:52

gvido писал(а):Да, планирую сделать задачку, по обработке разных типов файлов. Каждая задача в отдельном потоке со своим периодом ожидания.

Вы неправильно это делаете, то что должно выполняться в отдельном потоке должно находится в методе Execute, строка
Код: Выделить всё
FreeOnTerminate := True;

Приводит к автоматическому уничтожению объекта после завершения потока, а т.к. у Вас метод Execute ничего не содержит, то это происходит почти сразу.
Да и еще, типы с управляемым временем жизни, например, динамические массивы, автоматически финализируются при уничтожении объекта.

Прошу прощения, не увидел что поток создается в приостановленном состоянии. Тогда вообще не понятно в чем смысл? :?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Обращение к последнему элементу динамического массива

Сообщение gvido » 17.11.2015 10:38:52

zub писал(а):КОД: ВЫДЕЛИТЬ ВСЁ
Finalize(FListOfFiles,Length(FListOfFiles)-1);


Точное количество элементов массива минус 1 элемент. Была дурная мысль, что по какай то причине поле-массив не хочет полностью освобождаться.
Вчера вычитал определение этой функции в учебнике по обжект паскалю. Вот очень похожее описание, практически как в учебнике:
Finalize, процедура

Синтаксис

procedure Finalize(var Buffer):
procedure Finalize(var Buffer; Count: Integer);


Описание

Процедура Finalize очищает строки, динамические массивы, интерфейсы, значения типа Variant, а также записи или массивы, содержащие элементы этих типов. Delphi автоматически очищает переменные строкового, интерфейсного, вариантного типа и динамических массивов, но если память для этих значений была выделена динамически, то до освобождения памяти необходимо выполнить процедуру Finalize.
Для того чтобы очистить более одного элемента массива, передайте количество элементов массива в параметре Count. Count - это количеств элементов массива, а не количество освобождаемых байт памяти.
Finalize не является настоящей процедурой.

Второй параметр этой процедуры позволяет указать количество освобождаемых элементов массива. Но путем проб и ошибок, и принимая во внимание свою задачу, я доволен тем, что без указания второго параметра массив очищается полностью.

Mikhail писал(а):Прошу прощения, не увидел что поток создается в приостановленном состоянии. Тогда вообще не понятно в чем смысл?

Смысл простой - будет создаваться N количество наследников этого класса. В процессе создания не все параметры необходимые для работы каждого отдельного экземпляра заполнены. Есть необходимость в плановой приостановке процесса на время и полная остановка для внесения изменений в значение параметров и последующим стартом.
Пока это и классом то трудно назвать,... Заготовка начального уровня. Получится - хорошо, будет плюс к самооценке.

Добавлено спустя 22 минуты 4 секунды:
Стоп, ребяты. Похоже это временный глюк самого лазаруса. Сегодня тот же самый проект с которого все началось - спокойно обнулил массив как через Finalize, так и через setlength(array,0). Без ошибок и с положительным результатом.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Обращение к последнему элементу динамического массива

Сообщение zub » 17.11.2015 12:39:44

>>Точное количество элементов массива минус 1 элемент. Была дурная мысль, что по какай то причине поле-массив не хочет полностью освобождаться.
так ты освобождаешь Length(FListOfFiles) элементов типа TListFiles что и приводит к ошибке.
если следовать твоей логике нужно писать так:
Код: Выделить всё
Finalize(FListOfFiles[0],Length(FListOfFiles));

это будет освобождение элементов внутри массива, но тоже неверно т.к. в массиве останется Length(FListOfFiles) пустых строк

>>Стоп, ребяты. Похоже это временный глюк самого лазаруса.
Это глюк программы. fpc (это касается компилятора, не лазаря) давно перерос такие детские проблемы. Можно конечно схватить глючную ревизию из транка, но это надо быть счастлмвчиком))
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Обращение к последнему элементу динамического массива

Сообщение gvido » 17.11.2015 13:53:42

zub писал(а):Это глюк программы. fpc (это касается компилятора, не лазаря) давно перерос такие детские проблемы. Можно конечно схватить глючную ревизию из транка, но это надо быть счастлмвчиком))

глюк программы? Тот же проект без исправлений и обрезаний сегодня отработал на ура. то есть процедура очистки и усекание массива внутри класс работает. Что касается Лазаруса, то он из коробки 1,4,4 фпс 2,6,4 i386-w32-w32.
У меня уже не первый такой случай, когда среда начинает глючить. Закрываешь лазарус чистишь бэкап и либ проекта и все работает. Нужно было сразу про это мне вспомнить.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Обращение к последнему элементу динамического массива

Сообщение xdsl » 18.11.2015 12:53:14

Не похоже на проблему внутри класса. Нижеприведенный пример вполне себе работает:
Код: Выделить всё
{$mode objfpc}
uses cthreads,classes;

Type
  TListFiles = array of string;
  TTask = class(TThread)
      Private
        FListOfFiles:TListFiles;
   procedure ListOfFilesCLR;
   procedure FillListOfFiles;
      public
        procedure execute;override;
  end;

procedure TTask.ListOfFilesCLR;
begin
  if Length(FListOfFiles)>0 then
  SetLength(FlistOfFiles,0);
end;

procedure TTask.FillListOfFiles;
    var i:integer;
begin
    setLength(FListOfFiles,10);
    for i:=0 to high(FListOfFiles) do FListOfFiles[i]:='hello.pas';
end;

procedure ttask.execute;
begin
writeln('Task ',ThreadID,' start');
FillListOfFiles();
ListOfFilesCLR();
writeln('Task ',ThreadID,' end');
end;


var x:array of ttask;
     i:integer;
begin
setlength(x,100);
for i:=0 to high(x) do x[i]:=ttask.create(false);
for i:=0 to high(x) do x[i].waitfor();
for i:=0 to high(x) do x[i].destroy();
x:=nil;
end.

Навскидку, проблема гораздо больше похожа на нереентерабельность функций работы со сканом каталога. В любом случае, без компилируемого примера сложно что-то сказать конкретное. Высылайте к своему модулю код проверочной программы, который у Вас точно не работает. Посмотрим, пошшупаем ;)
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Обращение к последнему элементу динамического массива

Сообщение gvido » 19.11.2015 12:02:19

xdsl писал(а):Навскидку, проблема гораздо больше похожа на нереентерабельность функций работы со сканом каталога. В любом случае, без компилируемого примера сложно что-то сказать конкретное. Высылайте к своему модулю код проверочной программы, который у Вас точно не работает. Посмотрим, пошшупаем


Спасибо, за ответ. С заготовкой класса и процедурой все "ОК". Реально "глюк" среды. Зачистил либ и бэкап проекта, закрыл лазарус и открыл все снова. Все заработало. как писал выше.
По классу - пока собираю набор необходимых полей, их состав и определяюсь с тем, что и как будет заполняться, редактироваться. После сбора информации - распихаю свойства и методы по областям видимости.
Если все получится так как задумано (редко что довожу до полностью законченного состояния - теряю интерес на определенном этапе..), то выложу, может кому пригодится.... Хотя, тут, 90% форумчан давно выросли из моей "ясельной" группы. :)
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Обращение к последнему элементу динамического массива

Сообщение xdsl » 20.11.2015 08:16:39

gvido писал(а):Хотя, тут, 90% форумчан давно выросли из моей "ясельной" группы.
В перспективу надо смотреть. Кто-то вырастает, а кто-то молодой наоборот, только готовится в ясельки.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Обращение к последнему элементу динамического массива

Сообщение gvido » 20.11.2015 11:33:13

xdsl писал(а):В перспективу надо смотреть. Кто-то вырастает, а кто-то молодой наоборот, только готовится в ясельки.

Безперспективный я. :( АААААА. :( И никамУ ненужный....:(

Это так, оффтоп. сори. :)
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru