Текущий архив: 2008.11.30;
Скачать: CL | DM;
ВнизЯ что-то упустил? Найти похожие ветки
← →
oldman © (2008-09-24 18:41) [0]разве теперь так можно:
procedure TForm1.Button1Click(Sender: TObject)
var
a: array of integer;
b: integer;
begin
...
b:=summa(a);
...
end;
procedure summa(i: array of integer);
...
Ученик тупит или я?????????
(ученик не мой)
← →
Palladin © (2008-09-24 18:43) [1]man ты очень сильно old ))
← →
oldman © (2008-09-24 18:46) [2]
> Palladin © (24.09.08 18:43) [1]
Меня двадцать пять лет учили массивы параметрами не передавать.
Привычка...
← →
Ega23 © (2008-09-24 18:48) [3]Тогда уж function summa(...) : Integer;
← →
oldman © (2008-09-24 18:49) [4]
> Ega23 © (24.09.08 18:48) [3]
Там много ляпов в коде, я ж для примера и общего смысла...
← →
Поросенок Винни-Пух © (2008-09-24 18:51) [5]Тогда уж function summa(...) : Integer;
ага. вот так мне больше нравится
function summa(i: array of integer) : integer;
begin
for ...... do
MyGlobalvariable := MyGlobalvariable + ....
end;
← →
Palladin © (2008-09-24 18:54) [6]Массивы передавали в параметрах даже в старом Паскале. И ничего в этом зазорного не было. Просто, дабы не загружать стек, раньше пользовались указателями.
в этом же случае, параметр определен как открытый массив, он прямо (но не обратно) совместим с динмассивом. т.е., динмассив в качестве открытого передать можно, но открытый в качестве динамического нельзя. динамический в параметрах указывается созданием типа
Type
TDynArray=Array of Integer;
Procedure pp(a:TDynArray);
Begin
// сюда уже открытый массив не передать
...
End;
и все это реализовано давным давно...
← →
oldman © (2008-09-24 18:58) [7]
> Palladin © (24.09.08 18:54) [6]
> и все это реализовано давным давно...
А мы все по старинке :(
Через глобальные переменные и указатели...
ХАЧУ НА ПЕНСИЮ!!!
← →
Anatoly Podgoretsky © (2008-09-24 19:57) [8]> oldman (24.09.2008 18:49:04) [4]
Смысл простой, вешает лапшу на уши, надеется, что предподователь OldMan не догадается.
Говоришь ученик чужой, тогда бить надо, что бы свои боялись, лучше ногами!
← →
Anatoly Podgoretsky © (2008-09-24 19:58) [9]> oldman (24.09.2008 18:58:07) [7]
Это ты зря, объяви сложный тип и передавай, он будет передаваться как указатель. TDynArray
← →
Tricky_ (2008-09-24 20:02) [10]
> Меня двадцать пять лет учили массивы параметрами не передавать.
А почему? Суть в чем? Почему нельзя?
← →
Anatoly Podgoretsky © (2008-09-24 20:14) [11]> Tricky_ (24.09.2008 20:02:10) [10]
Его учили давно, когда массивы были большими, статическими. А динамический массив всего 4 байта.
← →
Tricky_ (2008-09-24 20:56) [12]Т.е. статический массив передается по стеку весь, не ссылка не него разве?
← →
boa_kaa © (2008-09-24 21:00) [13]если я правильно помню делфи, он выдаст, что типы не совместимые...
← →
Anatoly Podgoretsky © (2008-09-24 21:02) [14]> Tricky_ (24.09.2008 20:56:12) [12]
По другому мысли, при передаче по значению, на стек копируется вся "переменная", для динамического массива ее размер равен 4 байтам, и статический и динамический массива и другие переменные передаются в этом случае одинаково. Но размер статического много больше N*SizeOf(Element).
← →
guav © (2008-09-24 21:11) [15]Открытые массивы
> procedure summa(i: array of integer);
появились намного раньше динамических
> var
> a: array of integer;
, ещё в паскале.
← →
Tricky_ (2008-09-24 21:57) [16]
> 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;
← →
Tricky_ (2008-09-24 22:12) [17]
> при передаче по значению, на стек копируется вся "переменная",
> для динамического массива ее размер равен 4 байтам
Т.е. ваше утверждение Анатолий не верно..
← →
Anatoly Podgoretsky © (2008-09-24 22:21) [18]> Tricky_ (24.09.2008 21:57:16) [16]
Не знаю, что ты пропустил, но в объявление функции открытый массив.
← →
korneley © (2008-09-24 22:33) [19]
procedure MyProcedure(var par);
var a : array[0..0] of byte absolute par;
begin
// всё, что угодно, на свой страх и риск с массивом "a"
// "рейнджчекинг" не забыть снять :))
// Счастливого приземления, "тейсинтай"
end;
:)
← →
Tricky_ (2008-09-24 22:45) [20]
> По другому мысли, при передаче по значению, на стек копируется
> вся "переменная", для динамического массива ее размер равен
> 4 байтам, и статический и динамический массива и другие
> переменные передаются в этом случае одинаково. Но размер
> статического много больше N*SizeOf(Element).
> статический и динамический массива и другие
> > переменные передаются в этом случае одинаково. Но размер
>
> > статического много больше N*SizeOf(Element).
А пример можно посмотреть для статического? А то чето до меня не доходит :)
← →
GrayFace © (2008-09-25 04:39) [21]Лучше всего
function Summ(const a:array of Integer):Integer;
Tricky_ (24.09.08 21:57) [16]
Точнее, вызывающая функция передает ссылку и длину, а вызванная создает в стэке копию.
← →
Городской Шаман (2008-09-25 06:13) [22]
> GrayFace © (25.09.08 04:39) [21]
>
> Лучше всего function Summ(const a:array of Integer):Integer;
>
>
> Tricky_ (24.09.08 21:57) [16]
> Точнее, вызывающая функция передает ссылку и длину, а вызванная
> создает в стэке копию.
Динамические массивы всегда передаются по ссылке.
← →
MBo © (2008-09-25 07:28) [23]Городской Шаман (25.09.08 06:13) [22]
procedure TForm3.Button2Click(Sender: TObject);
function GetFirst(A: array of Byte): Byte;
begin
Result := A[0];
end;
var
A: array of Byte;
begin
SetLength(A, 10000000);
Caption := IntToStr(GetFirst(A));
end;
← →
MBo © (2008-09-25 07:31) [24]до кучи насчет копии:
procedure ChangeFirst(A: array of Byte);
begin
A[0] := 100;
end;
var
A: array of Byte;
begin
SetLength(A, 10);
ChangeFirst(A);
Caption := IntToStr(A[0]);
end;
← →
MBo © (2008-09-25 08:00) [25]еще до кучи: если в заголовке процедуре объявлять параметр не открытым массивом, а использовать предварительно объявленный тип динамического массива, то копирования не будет.
type
TBA = array of Byte;
function GetFirst(A: TBA): Byte;
← →
Дуб © (2008-09-25 08:33) [26]Открытые массивы вроде в П7 появились.
← →
DeadMeat (2008-09-25 08:34) [27]
> MBo © (25.09.08 08:00) [25]
А если этот тип будет не динамическим массивом, а обычным?
← →
Anatoly Podgoretsky © (2008-09-25 08:43) [28]> Городской Шаман (25.09.2008 6:13:22) [22]
Нифига, они передаются как по ссылке, так и по значению, просто динамический массив сам является ссылкой, как строка или класс.
Вот вызовы
func x(ar: tStatArray);
func x(var ar: tStatArray);
func x(const ar: tStatArray);
func x(ar: tDynArray);
func x(var ar: tDynArray);
func x(const ar: tDynArray);
func y(s: string);
func y(var s: string);
func y(const s: string);
← →
Anatoly Podgoretsky © (2008-09-25 09:30) [29]
> А если этот тип будет не динамическим массивом, а обычным?
Уже несколько раз написано.
Передача по значению не отличается, на стек посылается SizeOf(var)
Для динамического это 4 байта, для статического N*SizeOf(Element)
И [25] доказывает, что на стек помещается не 10 мб, стек размером меньше, а только 4 байта.
← →
GrayFace © (2008-09-28 10:42) [30]Я немного ошибся. Когда параметр - открытый массив, передается ссылка(на первый элемент) и high(var), а не длина.
Когда параметр - динамический массив (TBA = array of Byte;
), передается только ссылка на первый элемент. Т.е. обычная передача по ссылке, как у объектов.
SizeOf(var) не передается никогда.
(Delphi 2006)
На всякий случай тоже приведу код, который смотрел в отладчике:type TIArr = array of integer;
function aaa(a: array of integer):integer;
begin
Result:= a[0];
end;
function bbb(a: TIArr):integer;
begin
Result:=a[0];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
a1: TIArr;
a2: array[0..599] of integer;
begin
SetLength(a1, 600);
aaa(a1);
aaa(a2);
bbb(a1);
end;
Страницы: 1 вся ветка
Текущий архив: 2008.11.30;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.006 c