![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк с массивами
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?