![]() |
| ||
|
|
Новости |
Поиск |
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']);
Вывод:
Дельфи - ущербный языченок!
что делать?
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'] - это всё передаётся через стек.
Вы правы. значит, правильно делает, что не дает преобразовать.