Length и динамические структуры

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

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

Length и динамические структуры

Сообщение KUKA » 14.07.2013 20:18:30

Есть динамический массив какой-то структуры, в процессе обработки файла я изменяю длину этого массива через SetLength()
Но потом, если я захочу узнать длину этого массива, пытаюсь использовать Length( DynArray ) и выдает странную ошибку
31.jpg

Собственно почему? Спецификация гласит:
Код: Выделить всё
function Length(
  S: AStringType
):Integer;

function Length(
  A: DynArrayType
):Integer;


Со строками работает нормально. Я так думаю из-за реализации функции, выделяемый блок памяти находится в куче и функция не может найти размер памяти. Других синтаксических ошибок нет, да их вообще нет
У вас нет необходимых прав для просмотра вложений в этом сообщении.
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Length и динамические структуры

Сообщение debi12345 » 14.07.2013 20:38:44

А чем "High(array) - Low(array)" не нравятся ?

ПС:
кто-нибудь реально сталкивался с ошибками непрерывности в памяти больших объетов из-за фрагментации кучи - на Выни и Линухе ? Всегда считал что в них память всегда нерперывная (flat) без "кучи" - потому что виртуальная (если надо - со свопом) ? Были такие преценденты ? Если были, то например Mоve() для перестановки элементов массивов становится ненадежной.

Добавлено спустя 3 часа 20 минут 20 секунд:
High(array) - Low(array)"

Хм, в Паскале индексы могут пропускаться ( const arr1[0..2, 9..20] = {values,..} )- в этом случае HIGH(=20)-LOW(=0) вернет неверную длину.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Length и динамические структуры

Сообщение Иван Шихалев » 15.07.2013 07:56:16

Какая-то совсем нелогичная ошибка. А можно фрагмент кода, который ее вызывает?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Length и динамические структуры

Сообщение KUKA » 16.07.2013 09:51:45

Иван Шихалев писал(а):Какая-то совсем нелогичная ошибка. А можно фрагмент кода, который ее вызывает?


Код: Выделить всё
for i := 0 to Length(Glyphs) - 1 do
    if ( Ord( c ) = Glyphs[i].id ) then begin
      GetGlyph := Glyphs[i];
      exit();
    end;
...
k := Length( kernings );

Поменял на High, работает конечно, но странно что не работает Length, мне может потребоваться узнать реальный размер массива, свое писать ради этого не хочется
debi12345 писал(а):Хм, в Паскале индексы могут пропускаться ( const arr1[0..2, 9..20] = {values,..} )- в этом случае HIGH(=20)-LOW(=0) вернет неверную длину.

Именно, поэтому стараюсь избегать это функции
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Length и динамические структуры

Сообщение debi12345 » 16.07.2013 10:12:17

Хм.. Доверяй, но проверяй (и сам себя в том числе) :

Код: Выделить всё
program test;

{$mode objfpc}
var
  arr: array [0..2, 9..11] of integer;
begin
  writeln('length= ',length(arr),', low= ',low(arr),', high = ',high(arr));
  arr[0][0]:= 0;
  arr[1][9]:= 9;
  arr[1][11]:= 11;
  writeln('length= ',length(arr),', low= ',low(arr),', high = ',high(arr));
end.

На самом деле "array [0..2, 9..11] of integer;" транслируется в 2-мерный массив "array [0..2][9..11] of integer", где [0..2] = стартовое измерение.
Получается, что массивы всегда непрерывны а это значит что HIGH()-LOW() всегда валидно. Так ?

ПС:
Похоже что есть ФПЦ-баг, потому что
Код: Выделить всё
  arr[1][11111]:= 11111;

отрабатывет без ругани на превышение индекса. Кто в ФПЦ-команде - проверьте.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Length и динамические структуры

Сообщение Иван Шихалев » 16.07.2013 10:28:39

KUKA писал(а):Код: Выделить всё

А как переменные-то объявлены?

debi12345 писал(а):отрабатывет без ругани на превышение индекса

Проверка индекса может быть включена/выключена отдельной директивой компилятора.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Length и динамические структуры

Сообщение Sergei I. Gorelkin » 16.07.2013 10:33:50

Length может не работать со странной ошибкой из-за того, что в одном из собственных модулей определен, например, метод с таким же именем.
Уместно использовать полное имя: System.Length(x).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Length и динамические структуры

Сообщение debi12345 » 16.07.2013 10:39:42

Проверка индекса может быть включена/выключена отдельной директивой компилятора.

Хм, по умолчанию для массивов, объявленых таким образом - не проверятся (режим OBJFPC). Смело !
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Length и динамические структуры

Сообщение KUKA » 16.07.2013 10:45:29

Иван Шихалев писал(а):А как переменные-то объявлены?

Например
Glyphs : array of GlyphStructure;

Вообще иногда случаются странные вещи по поводу объявления. Например не позволяет объявить функции возвращаемый тип как "array of Something", а если объявить type TSomething = array of Something, то работает ну и возвращаемые данные тоже должны быть объявлены как TSomething тогда
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Length и динамические структуры

Сообщение debi12345 » 16.07.2013 12:46:17

Например не позволяет объявить функции возвращаемый тип как "array of Something", а если объявить type TSomething = array of Something, то работает

Это старая багофича компилятора. Функции могут принимfть открытые (array of const), но не динамичеcкие (array of <type>) массивы, но примут и динамические - если их объявить через алиас типа :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)


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

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

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

Рейтинг@Mail.ru