Главная страница
    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.52 MB
Время: 0.006 c
9-1175692825
Ford
2007-04-04 17:20
2008.11.30
Электронные книги по созданию игр.


2-1224497497
tonick2001
2008-10-20 14:11
2008.11.30
Не ловится исключение


3-1210660109
Михаил
2008-05-13 10:28
2008.11.30
Диапазон типа DATE у FB2.03


2-1224496702
JustI
2008-10-20 13:58
2008.11.30
Проблема с получением параметров метода из 1C


2-1224589591
SkyN
2008-10-21 15:46
2008.11.30
как правильно освобождать память от динамического массива?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский