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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2022, 18:53   #1
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию Странное поведение массива

Код:
SetLength(Treaty.Members,3);
  Treaty.Members[0].FIO:='0';
  Treaty.Members[1].FIO:='1';
  Treaty.Members[2].FIO:='2';
  SetLength(Treaty.Members,1);
  sb.Panels[0].Text:='Length = ' + inttostr(Length(Treaty.Members)) + ' | High = '+ inttostr(high(Treaty.Members))+' > '+ Treaty.Members[2].FIO;
При выполнение получаем Length = 1 | High = 0 > .

Не смущает, что я обрезал массив. Ошибка вываливается только при закрытии приложения. Как так?

Код:
  SetLength(arr,1);
  arr[0]:='0';
  arr[1]:='1';
  arr[2]:='2';
  sb.Panels[0].Text:='Length = ' + inttostr(Length(arr)) + ' | High = '+ inttostr(high(arr))+' > '+ arr[2];
Ради теста делаем так, и получаем - Length = 1 | High = 0 > 2.

Вовсе записали не выделив память. Что за фигня?

Заметил, когда смещал элементы массива после удаления. Там вовсе не понятно как работает, левое выгружает, и плевать, что ты режешь массив после сдвига.
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 28.04.2022, 19:33   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Range checking по умолчанию выключен, поэтому ошибка сразу вылезет только в том случае, если обратиться к невыделенной памяти, иначе будет неопределенное поведение.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 28.04.2022, 19:41   #3
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Range checking по умолчанию выключен, поэтому ошибка сразу вылезет только в том случае, если обратиться к невыделенной памяти, иначе будет неопределенное поведение.
Директива {$R+} кто искать будет. Спасибо!
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 29.04.2022, 02:19   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Tip.the.besT Посмотреть сообщение
Директива {$R+} кто искать будет.
Настоятельно рекомендуется включать эту директиву только на этапе отладки. В релизе её лучше отключить. И код уменьшится и скорость выполнения увеличится.

Цитата:
Сообщение от Tip.the.besT Посмотреть сообщение
Вовсе записали не выделив память. Что за фигня?
Читайте Access Violation в деталях до полного просветления.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение realloc eraserhp Общие вопросы C/C++ 7 17.05.2010 09:52
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Странное поведение DLL Yurk@ Компоненты Delphi 4 01.02.2009 01:23
Странное поведение ПОИСКПОЗ ZORRO2005 Microsoft Office Excel 5 19.05.2008 14:02