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

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

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

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

Сообщение aag » 21.07.2006 00:23:01

Трям!

Я не совсем в теме, просто пока пробую перевести куски своего кода с 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.
aag
незнакомец
 
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

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

Сообщение record » 21.07.2006 04:32:42

Код: Выделить всё
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
record
новенький
 
Сообщения: 29
Зарегистрирован: 11.02.2006 16:34:51

Сообщение @lex » 21.07.2006 09:46:55

{$mode Delphi} - уходят многие странные ошибки!
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Сообщение aag » 21.07.2006 09:47:06

Ну да, в том-м то и дело, что код выдает правильный результат. Например:
Код: Выделить всё
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 » 21.07.2006 09:48:29

{$mode delphi} - то же не помогает. Да и вообще, это должно работать и в {$mode objfpc}
aag
незнакомец
 
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение Sergei I. Gorelkin » 21.07.2006 10:50:05

То, что не видно в WatchList - это, увы, проблема WatchList'a. Он показывает то, что отдает ему отладчик gdb. Отладчик gdb мало что знает о Паскале с его динамическими массивами, кроме того - он очень не родной по отношению к Windows. Наверное, проще написать собственный отладчик для Lazarus, чем эту ситуацию разруливать...
А сами динамические массивы работают очень даже нормально.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение aag » 21.07.2006 12:36:28

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


Значит ли это, то, что под linux отладчик правильно отображает содержимое динамического массива? Или, все-таки, это уже действительно проблемы поддержки Pascal в gdb?
Pls. проверьте, у кого не на винде Lazarus бегает.
aag
незнакомец
 
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение @lex » 23.07.2006 09:10:09

Лазарус ещё не вылез из беты! Поэтому может и не работает. Там ещё встречаются надписи типа: "Когда нибудь здесь будет ...."
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Сообщение aag » 23.07.2006 12:53:25

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

Таки все же, под Linux'om (или т.п.) subj. работает?
aag
незнакомец
 
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

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

Сообщение noch » 27.07.2006 00:45:30

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


Можно еще писать HIGH(a) :)
Аватара пользователя
noch
постоялец
 
Сообщения: 145
Зарегистрирован: 07.06.2005 09:45:49
Откуда: Armenia

Сообщение aag » 27.07.2006 01:24:45

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


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


Всегда с сомнением относился к этой функции (High). Зачем плодить сущее без необходимости? Да и код менее понятным становится.
aag
незнакомец
 
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение @lex » 27.07.2006 08:40:25

А в чём собственно их отличие?
Length - вроде бы понятно "длина" - пользуюсь постоянно :)
High - это как-бы "высшее значение" или "высота" чтоли? - первый раз слышу
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Сообщение aag » 27.07.2006 10:50:45

Все просто. Пусть
Код: Выделить всё
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:
aag
незнакомец
 
Сообщения: 7
Зарегистрирован: 21.07.2006 00:08:21

Сообщение wavebvg » 28.02.2008 05:00:58

Вообще некорректно отображаются все значения объектов, создаваемых динамически, или отображается, но бред... Видимо неправильно что-то передается ГРАБУ и грабит он явно не то (скорее всего передается неправильно ссылка на ячейку памяти). Как пофиксить пока не понял.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Сообщение zub » 28.02.2008 11:37:47

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

Такого не замечал, гдб ниразу ерунду не показывал. может дело в оптимизации? она включена?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru