Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.54 MB
Время: 0.015 c
15-1222326187
Vlad Oshin
2008-09-25 11:03
2008.11.30
Дурацкое высказывание


2-1224230761
sbot
2008-10-17 12:06
2008.11.30
Видео из ресурса


15-1222657245
Slider007
2008-09-29 07:00
2008.11.30
С днем рождения ! 29 сентября 2008 понедельник


2-1223987459
Me
2008-10-14 16:30
2008.11.30
Tstringlist - сортировка по value


9-1175880657
GLProg
2007-04-06 21:30
2008.11.30
Ошибка в GL программе