Работают ли динамические массивы в freepascal?

Вопросы программирования и использования среды Lazarus.

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

aag
незнакомец
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Работают ли динамические массивы в freepascal?

Сообщение aag »

Трям!

Я не совсем в теме, просто пока пробую перевести куски своего кода с Delphi.
В ходе тестов возникли сложности при работе с динамическими массивами. Упрощенно, есть следующая процедура

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

procedure TForm1.Button1Click(Sender: TObject);
var A:array of integer;
    i:integer;
begin
 Setlength(A,10);
 for i:=0 to Length(A)-1 do begin
  A[i]:=i;
 end;
end;   

Проблема в том, что в WatchList'e показывается какой-то бред. Например, после первого прохода в цикле for A[0]<>0, а какомо-ту произвольному числу. Может кто посоветует, в чем дело?

P.S. Стоит Lazarus 0.9.16betta под WinXP SP2.
record
новенький
Сообщения: 29
Зарегистрирован: 11.02.2006 15:34:51

Сообщение record »

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

procedure da;
 var A:array of integer;
    i:integer;
begin
 Setlength(A,10);
 for i:=0 to Length(A)-1 do
 begin
  A[i]:=i;
  writeln(A[i],'   ',i) 
 end;
 A:=Nil
end;
begin
 da
end.   

не знаю, как там в вотч листе, но всё работает, как и ожидалось:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
Проверял на Lazarus 0.9.16betta под WinXP SP2 и ubuntu dapper
"Free Pascal поддерживает массивы. Многомерные массивы и упакованные массивы также поддерживаются, равно как и динамические массивы в стиле Delphi."
http://freepascal.ru/wiki/index.php/%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D1%8B
@lex
постоялец
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск
Контактная информация:

Сообщение @lex »

{$mode Delphi} - уходят многие странные ошибки!
aag
незнакомец
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение aag »

Ну да, в том-м то и дело, что код выдает правильный результат. Например:

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

procedure TForm1.Button1Click(Sender: TObject);
var A:array of integer;
    i:integer;
    S:String;
begin
 S:='';
 Setlength(A,10);
 for i:=0 to Length(A)-1 do begin
  A[i]:=i;
  S:=S+'A['+IntToStr(i)+']= '+IntToStr(i)+'   ';
 end;
 Memo1.Text:=S;
 Finalize(A);
end; 

В результате, как и должно быть, строка S='A[0]= 0 A[1]= 1 A[2]= 2 A[3]= 3 A[4]= 4 A[5]= 5 A[6]= 6 A[7]= 7 A[8]= 8 A[9]= 9'

Но проблема в том, что в WatchListe при отладке пишется для A[0], A[1] или A[i] какой-то бред. Для простой програмки это можно пережить, но мне нужно отлаживать чуть посложнее.
aag
незнакомец
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение aag »

{$mode delphi} - то же не помогает. Да и вообще, это должно работать и в {$mode objfpc}
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

То, что не видно в WatchList - это, увы, проблема WatchList'a. Он показывает то, что отдает ему отладчик gdb. Отладчик gdb мало что знает о Паскале с его динамическими массивами, кроме того - он очень не родной по отношению к Windows. Наверное, проще написать собственный отладчик для Lazarus, чем эту ситуацию разруливать...
А сами динамические массивы работают очень даже нормально.
aag
незнакомец
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение aag »

Sergei I. Gorelkin писал(а):Отладчик gdb мало что знает о Паскале с его динамическими массивами, кроме того - он очень не родной по отношению к Windows.


Значит ли это, то, что под linux отладчик правильно отображает содержимое динамического массива? Или, все-таки, это уже действительно проблемы поддержки Pascal в gdb?
Pls. проверьте, у кого не на винде Lazarus бегает.
@lex
постоялец
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск
Контактная информация:

Сообщение @lex »

Лазарус ещё не вылез из беты! Поэтому может и не работает. Там ещё встречаются надписи типа: "Когда нибудь здесь будет ...."
aag
незнакомец
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение aag »

Ага, не вылез. По крайней мере, эту проблемму, судя по всему так и не решили (http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=777&start=0&postdays=0&postorder=asc&highlight=dynamic)

Таки все же, под Linux'om (или т.п.) subj. работает?
Аватара пользователя
noch
постоялец
Сообщения: 145
Зарегистрирован: 07.06.2005 09:45:49
Откуда: Armenia
Контактная информация:

Сообщение noch »

aag писал(а): for i:=0 to Length(A)-1 do begin


Можно еще писать HIGH(a) :)
aag
незнакомец
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение aag »

aag писал(а):for i:=0 to Length(A)-1 do


noch писал(а):Можно еще писать HIGH(a)


Всегда с сомнением относился к этой функции (High). Зачем плодить сущее без необходимости? Да и код менее понятным становится.
@lex
постоялец
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск
Контактная информация:

Сообщение @lex »

А в чём собственно их отличие?
Length - вроде бы понятно "длина" - пользуюсь постоянно :)
High - это как-бы "высшее значение" или "высота" чтоли? - первый раз слышу
aag
незнакомец
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение aag »

Все просто. Пусть

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

 var A: array of TSomeBody. 
Тогда Length(A) - число элементов в массиве, Low(A) и High(A) - нижний и верхний индексы в массиве.
Т.о. Length(A)=High(A)+1 (т.к. индексация в динамических массивах идет от нуля). Если Length(A)=0, то Low(A)=0 и High(A)=-1

Например, можно использовать так:

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

var i : integer; A: array of TSomeBody;
begin
  for i := low (A) to high (A) do
      writeln (i,'  ', A [i]);
end;


P.S. Так что, все же не высота, а на единичку меньше :wink:
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

Вообще некорректно отображаются все значения объектов, создаваемых динамически, или отображается, но бред... Видимо неправильно что-то передается ГРАБУ и грабит он явно не то (скорее всего передается неправильно ссылка на ячейку памяти). Как пофиксить пока не понял.
zub
долгожитель
Сообщения: 2892
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Вообще некорректно отображаются все значения объектов, создаваемых динамически, или отображается, но бред...

Такого не замечал, гдб ниразу ерунду не показывал. может дело в оптимизации? она включена?
Ответить