-
разве теперь так можно:
procedure TForm1.Button1Click(Sender: TObject)
var
a: array of integer;
b: integer;
begin
...
b:=summa(a);
...
end;
procedure summa(i: array of integer);
...
Ученик тупит или я?????????
(ученик не мой)
-
man ты очень сильно old ))
-
> Palladin © (24.09.08 18:43) [1]
Меня двадцать пять лет учили массивы параметрами не передавать.
Привычка...
-
Тогда уж function summa(...) : Integer;
-
> Ega23 © (24.09.08 18:48) [3]
Там много ляпов в коде, я ж для примера и общего смысла...
-
Тогда уж function summa(...) : Integer;
ага. вот так мне больше нравится
function summa(i: array of integer) : integer;
begin
for ...... do
MyGlobalvariable := MyGlobalvariable + ....
end;
-
Массивы передавали в параметрах даже в старом Паскале. И ничего в этом зазорного не было. Просто, дабы не загружать стек, раньше пользовались указателями.
в этом же случае, параметр определен как открытый массив, он прямо (но не обратно) совместим с динмассивом. т.е., динмассив в качестве открытого передать можно, но открытый в качестве динамического нельзя. динамический в параметрах указывается созданием типа
Type
TDynArray=Array of Integer;
Procedure pp(a:TDynArray);
Begin
// сюда уже открытый массив не передать
...
End;
и все это реализовано давным давно...
-
> Palladin © (24.09.08 18:54) [6]
> и все это реализовано давным давно...
А мы все по старинке :(
Через глобальные переменные и указатели...
ХАЧУ НА ПЕНСИЮ!!!
-
> oldman (24.09.2008 18:49:04) [4]
Смысл простой, вешает лапшу на уши, надеется, что предподователь OldMan не догадается.
Говоришь ученик чужой, тогда бить надо, что бы свои боялись, лучше ногами!
-
> oldman (24.09.2008 18:58:07) [7]
Это ты зря, объяви сложный тип и передавай, он будет передаваться как указатель. TDynArray
-
> Меня двадцать пять лет учили массивы параметрами не передавать.
А почему? Суть в чем? Почему нельзя?
-
> Tricky_ (24.09.2008 20:02:10) [10]
Его учили давно, когда массивы были большими, статическими. А динамический массив всего 4 байта.
-
Т.е. статический массив передается по стеку весь, не ссылка не него разве?
-
если я правильно помню делфи, он выдаст, что типы не совместимые...
-
> Tricky_ (24.09.2008 20:56:12) [12]
По другому мысли, при передаче по значению, на стек копируется вся "переменная", для динамического массива ее размер равен 4 байтам, и статический и динамический массива и другие переменные передаются в этом случае одинаково. Но размер статического много больше N*SizeOf(Element).
-
Открытые массивы
> procedure summa(i: array of integer);
появились намного раньше динамических
> var
> a: array of integer;
, ещё в паскале.
-
> Anatoly Podgoretsky © (24.09.08 21:02) [14]
Вобщем получается что если передавать по значению массив, то и динамический и статический копируется полностью в стек. Это можно увидеть в asm отладчике и по скорости (если задать большое кол. элементов).
Delphi 7
А я чтото раньше думал что дин. массивы передаются по ссылке..
procedure TForm1.qwe(Aasd: array of integer);
begin
Caption := IntToStr(Aasd[1]);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
qwe1: array of integer;
begin
SetLength(qwe1, 10000);
qwe(qwe1);
end;
-
> при передаче по значению, на стек копируется вся "переменная",
> для динамического массива ее размер равен 4 байтам
Т.е. ваше утверждение Анатолий не верно..
-
> Tricky_ (24.09.2008 21:57:16) [16]
Не знаю, что ты пропустил, но в объявление функции открытый массив.
-
procedure MyProcedure(var par);
var a : array[0..0] of byte absolute par;
begin
end;
:)