Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Ошибка Argument out of range  (Прочитано 3828 раз)

iww70

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Ошибка Argument out of range
« : 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;
« Изменён: 07 Декабря 2024, 09:34:59 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3226
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка Argument out of range
« Ответ #1 : 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) и т.д.), чтобы выделенная для них память освободилась.

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Ошибка Argument out of range
« Ответ #2 : 09 Декабря 2024, 10:56:11 »
Вы пытаетесь получить несуществующий последний элемент списка (когда последнего нет)
По логике если Count=0, то Last = NIL, и обращение к Last никогда не должно приводить к исключению

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3226
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка Argument out of range
« Ответ #3 : 09 Декабря 2024, 11:11:36 »
Int64 не может быть nil.

Цитировать
и обращение к Last никогда не должно приводить к исключению
С чего Вы взяли? Опять 20-летний опыт программирования?
« Изменён: 09 Декабря 2024, 11:19:21 от Simple-Scada »

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Ошибка Argument out of range
« Ответ #4 : 09 Декабря 2024, 12:06:50 »
С чего Вы взяли? Опять 20-летний опыт программирования?
Нет, просто логика. Last это "последний". Если последнего не существует, надо вернуть NIL. А то, что "последний" у вас по факту "значение последнего" - это для меня не логично. Было бы LastValue или ValueLast я бы не отреагировал.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3226
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка Argument out of range
« Ответ #5 : 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)
{

}
« Изменён: 09 Декабря 2024, 12:21:20 от Simple-Scada »