Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: iww70 от 07 Декабря 2024, 09:32:06

Название: Ошибка Argument out of range
Отправлено: iww70 от 07 Декабря 2024, 09:32:06
Непонятная ошибка Argument out of range
Код: (delphi)
  T1List := TM_Int64List.Create;
  T2List := TM_Int64List.Create;
  pT1List:= TM_Int64List.Create;
  pT2List:= TM_Int64List.Create;
списки с хранением времени в UNIX? жалуется на 1 строку
Код: (delphi)
IF (T1List.Count = pT1List.Count) AND (pT2List.Last <> DateTimeToUnix(Prostoy_time_now_2.Value)) then
begin
  pT1List.Add(T2List.Last+1);
  pT2List.Add(DateTimeToUnix(Prostoy_time_now_2.Value));
end;
Название: Re: Ошибка Argument out of range
Отправлено: Simple-Scada от 09 Декабря 2024, 10:17:43
Здравствуйте.

Всё верно, у вас  есть пустой список и Вы пытаетесь получить несуществующий последний элемент списка (когда последнего нет). Добавьте проверку на количество элементов:
Код: (delphi)
if pT2List.Count > 0 then
  if (T1List.Count = pT1List.Count) AND (pT2List.Last <> DateTimeToUnix(Prostoy_time_now_2.Value)) then
  begin
    pT1List.Add(T2List.Last+1);
    pT2List.Add(DateTimeToUnix(Prostoy_time_now_2.Value));
  end;
Также не забудьте удалить все объекты, созданные через ".Create" после использования (FreeAndNil(T1List) и т.д.), чтобы выделенная для них память освободилась.
Название: Re: Ошибка Argument out of range
Отправлено: ARV от 09 Декабря 2024, 10:56:11
Вы пытаетесь получить несуществующий последний элемент списка (когда последнего нет)
По логике если Count=0, то Last = NIL, и обращение к Last никогда не должно приводить к исключению
Название: Re: Ошибка Argument out of range
Отправлено: Simple-Scada от 09 Декабря 2024, 11:11:36
Int64 не может быть nil.

Цитировать
и обращение к Last никогда не должно приводить к исключению
С чего Вы взяли? Опять 20-летний опыт программирования?
Название: Re: Ошибка Argument out of range
Отправлено: ARV от 09 Декабря 2024, 12:06:50
С чего Вы взяли? Опять 20-летний опыт программирования?
Нет, просто логика. Last это "последний". Если последнего не существует, надо вернуть NIL. А то, что "последний" у вас по факту "значение последнего" - это для меня не логично. Было бы LastValue или ValueLast я бы не отреагировал.
Название: Re: Ошибка Argument out of range
Отправлено: Simple-Scada от 09 Декабря 2024, 12:16:18
Классы TM_List и TM_Int64List используют стандартный TList и TList<Int64> из Delphi и их методы, без изменений в именах. Исключения также берутся из стандартной реализации. Насколько нам известно, Last это часто используемый вариант имени для списков, например в C# метод тоже называется Last и даёт исключение, если в списке нет элементов, что логично (если нет элементов, значит нет и последнего).
Код: (c#)
List<long> list = new List<long>();
if (list.Last() > 0)
{

}