Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюк с массивами


Страницы:   1 2

QQ ©   (2004-09-06 18:26:00) 


type
 TMyClass = class
   ...
   FArr : array of String;
   ...
 public
   procedure SomeProc(AArr : array of String);
 end;

...
procedure TMyClass.SomeProc(AArr : array of String);
begin
 FArr := AArr;//ТУТ НЕ КОМПИЛИРУЕТСЯ
end;


причем даже
Pointer(FArr) := Pointer(AArr);
не помагает - не приводится!

Вариант:

type
 TStringArray = array of String;

 TMyClass = class
   ...
   FArr : TStringArray;
   ...
 public
   procedure SomeProc(AArr : TStringArray);
 end;

...
procedure TMyClass.SomeProc(AArr : TStringArray);
begin
 FArr := AArr;//ТУТ работает
end;


это вроде компилируется, но теперь перестает компилироваться
 
 AMyClass = TMyClass.Create;
 AMyClass.SomeProc(['s1', 's2', 's3']);


Вывод:
Дельфи - ущербный языченок!
что делать?


Erik1   (2004-09-07 12:18:00) [1]

Вобщето ерундовая проблема, а эфективность даже на 200 элементах этоже милисекнды! Вобщето такое предпологается делать так:
procedure TMyClass.SomeProc(AArr : TStringArray);
begin
 FArr := Copy(AArr);
end;
Или так, если поизвращатся охота:
procedure TMyClass.SomeProc(AArr : TStringArray);
Var
  Size: Integer;
begin
 Size := Length(AArr);
 SetLength(FArr, Size);
 Move(AArr[0], FArr[0], Size*SizeOf(FArr[0]));
end;


QQ   (2004-09-07 10:36:00) [2]

Господа - приношу свои извинения по поводу Delphi -
это была минутная слабость. Я сам пишу на Дельфи, поэтому считаю его удачным для своих целей языком. Просто я некоторое время писал на С++ и не привык к некоторым особенностям Дельфи. (Кстати у Дельфи есть некоторые преимущества перед С++).

Я воспользовался решением Семена Сорокина [10].


TUser   (2004-09-07 10:28:00) [3]

Ну понятно - если у озабоченного препода нет времени прояснить себе правила языка Паскаль, то тут понятно D ущербен. Уважаемый, правила в языках разные, и ничего в том страшного нет. Иначе зачем бы создавать такое кол-во различных языков. А то, что вы описали - это не глюк, а фича, причем довольно известная.


QQ   (2004-09-07 09:44:00) [4]


> DiamondShark ©   (07.09.04 00:15) [28]
>
> > Вывод:
> > Дельфи - ущербный языченок!
> > что делать?
>
> Удавиться.
>
> В строчках
>   FArr : array of String;
> и
>   procedure SomeProc(AArr : array of String);
>
> одинаковая последовательность слов "array of String" означает
> семантически совершенно различные вещи.
> Первое -- динамический массив, второе -- открытый параметр-массив.
>
> Справку читать, ущербный человеченок.


Это я и сообщении об ошибке видел, молодой человек.
Что хамить-то мы можем, а вот решение предложить - нет?
;)


pasha_golub   (2004-09-07 00:40:00) [5]

DiamondShark ©   (07.09.04 00:15) [28]

Не, Димон, лучше повеситься. ;0)


DiamondShark   (2004-09-07 00:15:00) [6]


> Вывод:
> Дельфи - ущербный языченок!
> что делать?

Удавиться.

В строчках
  FArr : array of String;
и
  procedure SomeProc(AArr : array of String);

одинаковая последовательность слов "array of String" означает семантически совершенно различные вещи.
Первое -- динамический массив, второе -- открытый параметр-массив.

Справку читать, ущербный человеченок.


QQ   (2004-09-06 20:17:00) [7]

угу
DynArraySetLength
в system.pas

но мне везет - могла бы по другой ветке пойти


Anton_K   (2004-09-06 20:12:00) [8]

вот она что делает

Ты уверен?


QQ   (2004-09-06 20:03:00) [9]

GetMem
FillChar
CopyArray

вот она что делает
;)


QQ   (2004-09-06 20:02:00) [10]

чтобы как раньше писать вот так:
AMyClass.SomeProc(['s1', 's2', 's3']);


QQ   (2004-09-06 20:01:00) [11]

хотя нет, ошибаюсь - она копирует массив
причем в момент SetLength ;)


Anton_K   (2004-09-06 19:57:00) [12]

А зачем тебе это вообще нужно?


QQ   (2004-09-06 19:56:00) [13]

да, конструкция нестабильная :(


Anton_K   (2004-09-06 19:49:00) [14]

Этим кодом вы создаёте утечку памяти.

Нет, я ошибся, утечки не будет. Только после этого FArr не будет равен @AArr[0].


Anton_K   (2004-09-06 19:45:00) [15]

Там нету указателей на строки, сами строки передаются.


Anton_K   (2004-09-06 19:44:00) [16]

И стек при завершении процедуры очищается.


Anton_K   (2004-09-06 19:43:00) [17]

FArr := @AArr[0];
SetLength(FArr, Length(AArr));


Этим кодом вы создаёте утечку памяти.


QQ   (2004-09-06 19:40:00) [18]

но тем не менее,

>Семен Сорокин ©   (06.09.04 18:57) [10]
>Хм. ну раз Вы в этом так уверены, то что Вам стоит сделать вот >так:
>
>procedure TMyClass.SomeProc(AArr : array of String);
>begin
>FArr := @AArr[0];
>end;
>
>?
>
>
>--------------------------------------------------------------->Anton_K ©   (06.09.04 19:00) [11]
>А вы думаете на стек указателей не бывает?
>

так как адреса строк она запихивает в адрес _подряд_
@AArr[0] это как раз и есть ссылка на массив
только нужно пометить его размерность:
FArr := @AArr[0];
SetLength(FArr, Length(AArr));


Anton_K   (2004-09-06 19:05:00) [19]

Тогда сообщение [11] можно не читать :)


QQ   (2004-09-06 19:05:00) [20]

>Anton_K ©   (06.09.04 18:49) [9]
>['s1', 's2', 's3'] - это всё передаётся через стек.
Вы правы. значит, правильно делает, что не дает преобразовать.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо