Конференция "Прочее" » Я что-то упустил?
 
  • oldman © (24.09.08 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 © (24.09.08 18:43) [1]
    man ты очень сильно old ))
  • oldman © (24.09.08 18:46) [2]

    > Palladin ©   (24.09.08 18:43) [1]


    Меня двадцать пять лет учили массивы параметрами не передавать.
    Привычка...
  • Ega23 © (24.09.08 18:48) [3]
    Тогда уж function summa(...) : Integer;
  • oldman © (24.09.08 18:49) [4]

    > Ega23 ©   (24.09.08 18:48) [3]


    Там много ляпов в коде, я ж для примера и общего смысла...
  • Поросенок Винни-Пух © (24.09.08 18:51) [5]
    Тогда уж function summa(...) : Integer;

    ага. вот так мне больше нравится

    function summa(i: array of integer) : integer;
    begin
    for ...... do
     MyGlobalvariable := MyGlobalvariable + ....
    end;
  • Palladin © (24.09.08 18:54) [6]
    Массивы передавали в параметрах даже в старом Паскале. И ничего в этом зазорного не было. Просто, дабы не загружать стек, раньше пользовались указателями.

    в этом же случае, параметр определен как открытый массив, он прямо (но не обратно) совместим с динмассивом. т.е., динмассив в качестве открытого передать можно, но открытый в качестве динамического нельзя. динамический в параметрах указывается созданием типа
    Type
    TDynArray=Array of Integer;

    Procedure pp(a:TDynArray);
    Begin
    // сюда уже открытый массив не передать
    ...
    End;

    и все это реализовано давным давно...
  • oldman © (24.09.08 18:58) [7]

    > Palladin ©   (24.09.08 18:54) [6]
    > и все это реализовано давным давно...


    А мы все по старинке :(
    Через глобальные переменные и указатели...

    ХАЧУ НА ПЕНСИЮ!!!
  • Anatoly Podgoretsky © (24.09.08 19:57) [8]
    > oldman  (24.09.2008 18:49:04)  [4]

    Смысл простой, вешает лапшу на уши, надеется, что предподователь OldMan не догадается.
    Говоришь ученик чужой, тогда бить надо, что бы свои боялись, лучше ногами!
  • Anatoly Podgoretsky © (24.09.08 19:58) [9]
    > oldman  (24.09.2008 18:58:07)  [7]

    Это ты зря, объяви сложный тип и передавай, он будет передаваться как указатель. TDynArray
  • Tricky_ (24.09.08 20:02) [10]

    > Меня двадцать пять лет учили массивы параметрами не передавать.


    А почему? Суть в чем? Почему нельзя?
  • Anatoly Podgoretsky © (24.09.08 20:14) [11]
    > Tricky_  (24.09.2008 20:02:10)  [10]

    Его учили давно, когда массивы были большими, статическими. А динамический массив всего 4 байта.
  • Tricky_ (24.09.08 20:56) [12]
    Т.е. статический массив передается по стеку весь, не ссылка не него разве?
  • boa_kaa © (24.09.08 21:00) [13]
    если я правильно помню делфи, он выдаст, что типы не совместимые...
  • Anatoly Podgoretsky © (24.09.08 21:02) [14]
    > Tricky_  (24.09.2008 20:56:12)  [12]

    По другому мысли, при передаче по значению, на стек копируется вся "переменная", для динамического массива ее размер равен 4 байтам, и статический и динамический массива и другие переменные передаются в этом случае одинаково. Но размер статического много больше N*SizeOf(Element).
  • guav © (24.09.08 21:11) [15]
    Открытые массивы

    > procedure summa(i: array of integer);

    появились намного раньше динамических

    > var
    > a: array of integer;

    , ещё в паскале.
  • Tricky_ (24.09.08 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_ (24.09.08 22:12) [17]

    >  при передаче по значению, на стек копируется вся "переменная",
    >  для динамического массива ее размер равен 4 байтам


    Т.е. ваше утверждение Анатолий не верно..
  • Anatoly Podgoretsky © (24.09.08 22:21) [18]
    > Tricky_  (24.09.2008 21:57:16)  [16]

    Не знаю, что ты пропустил, но в объявление функции открытый массив.
  • korneley © (24.09.08 22:33) [19]

    procedure MyProcedure(var par);
    var a : array[0..0] of byte absolute par;
    begin
    // всё, что угодно, на свой страх и риск с массивом "a"
    // "рейнджчекинг" не забыть снять :))
    // Счастливого приземления, "тейсинтай"
    end;


    :)
  • Tricky_ (24.09.08 22:45) [20]

    > По другому мысли, при передаче по значению, на стек копируется
    > вся "переменная", для динамического массива ее размер равен
    > 4 байтам, и статический и динамический массива и другие
    > переменные передаются в этом случае одинаково. Но размер
    > статического много больше N*SizeOf(Element).



    > статический и динамический массива и другие
    > > переменные передаются в этом случае одинаково. Но размер
    >
    > > статического много больше N*SizeOf(Element).


    А пример можно посмотреть для статического? А то чето до меня не доходит :)
  • GrayFace © (25.09.08 04:39) [21]
    Лучше всего
    function Summ(const a:array of Integer):Integer;



    Tricky_   (24.09.08 21:57) [16]
    Точнее, вызывающая функция передает ссылку и длину, а вызванная создает в стэке копию.
  • Городской Шаман (25.09.08 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 © (25.09.08 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 © (25.09.08 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 © (25.09.08 08:00) [25]
    еще до кучи: если в заголовке процедуре объявлять параметр не открытым массивом, а использовать предварительно объявленный тип динамического массива, то копирования не будет.
    type
    TBA = array of Byte;

    function GetFirst(A: TBA): Byte;
  • Дуб © (25.09.08 08:33) [26]
    Открытые массивы вроде в П7 появились.
  • DeadMeat (25.09.08 08:34) [27]

    > MBo ©   (25.09.08 08:00) [25]

    А если этот тип будет не динамическим массивом, а обычным?
  • Anatoly Podgoretsky © (25.09.08 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 © (25.09.08 09:30) [29]

    > А если этот тип будет не динамическим массивом, а обычным?

    Уже несколько раз написано.
    Передача по значению не отличается, на стек посылается SizeOf(var)
    Для динамического это 4 байта, для статического N*SizeOf(Element)
    И [25] доказывает, что на стек помещается не 10 мб, стек размером меньше, а только 4 байта.
  • GrayFace © (28.09.08 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;

 
Конференция "Прочее" » Я что-то упустил?
Есть новые Нет новых   [134442   +15][b:0][p:0.002]