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']);


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


Семен Сорокин   (2004-09-06 19:04:00) [21]


> Извените, но кому адресуется сообщение [10]? Мне или QQ?

[10] -> QQ


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

Извените, но кому адресуется сообщение [10]? Мне или QQ?


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

А вы думаете на стек указателей не бывает?


Семен Сорокин   (2004-09-06 18:57:00) [24]

Хм. ну раз Вы в этом так уверены, то что Вам стоит сделать вот так:

procedure TMyClass.SomeProc(AArr : array of String);
begin
FArr := @AArr[0];
end;


?


Anton_K   (2004-09-06 18:49:00) [25]

['s1', 's2', 's3'] - это всё передаётся через стек.


QQ   (2004-09-06 18:47:00) [26]

Эффективность, батенька!
эффективность не та!

а указатель на ['s1', 's2', 's3']
это указатель на (в некотором смысле) константную область памяти, где лежат указатели на строки (опять же констатны)

а AArr : array of String это указатель на такие области!
(см дисассемблер дельфи)


Семен Сорокин   (2004-09-06 18:38:00) [27]

как один из вариантов:
procedure TMyClass.SomeProc(AArr : array of String);
var
 _i: integer;
begin
SetLength(FArr, Length(AArr));
for _i := 0 to High(AArr) do
 FArr[_i] := AArr[_i]
end;


дело в том, что ссылка и массив - это по-сути
одно и тоже

> AMyClass.SomeProc(['s1', 's2', 's3']);
а какой должен быть указатель на ['s1', 's2', 's3']?


QQ   (2004-09-06 18:37:00) [28]

см. мой вопрос


Anton_K   (2004-09-06 18:35:00) [29]

я имел в виду динамический массив

А кто вам сказал, что Delphi не даёт преобразовать их?


QQ   (2004-09-06 18:34:00) [30]

я имел в виду динамический массив


Anton_K   (2004-09-06 18:31:00) [31]

...ссылка и массив - это по-сути одно и тоже

Не согласен с вами.


QQ   (2004-09-06 18:29:00) [32]

дело в том, что ссылка и массив - это по-сути
одно и тоже.
но дельфи не дает преобразовать одно в другое.
ищу обходные пути


Fay   (2004-09-06 18:28:00) [33]

Ущербность явно имеет место быть. Но причём тут Delphi?


Страницы:   1 2

Наверх

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