Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
Вероятно дилетантский вопрос...

Есть запись вида:

Trecord3 = record
recod3: of array  [1...100500] of real;(ну например)
end;

Trecord2 = record
recod2: of array  [1...100500] of Trecord3;
end;

Trecord1 = record
recod1: of array  [1...100500] of Trecord2;
end;
4 дек 17, 15:32    [21004662]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
Андрей Игоревич,

Так, я что-то нажал и оно отправилось, я ещё не успел сформулировать вопрос. Минуточку.
4 дек 17, 15:33    [21004667]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
А теперь попробуй запихать всё это гомно в стек в виде локальных переменных! Я угадал вопрос?
4 дек 17, 15:34    [21004675]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
Умоляю, эту тему тоже в "Новости Delphi"!

...вслед за этой.
4 дек 17, 15:37    [21004694]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2420
человек может памяти прикупил
гггг :)
4 дек 17, 15:38    [21004699]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
Tactical Nuclear Penguin
человек может памяти прикупил
гггг :)


8 120 601 000 000 000 байт, если real == Double...
4 дек 17, 15:42    [21004724]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
В общем, есть запись вида

Trecord3 = record
arrray2: of array  [1...100500] of real;(ну например)
end;

Trecord2 = record
recod2: of array  [1...100500] of Trecord3;
arrray1: of array  [1...100500] of integer;(тоже например)
end;

Trecord1 = record
recod1: of array  [1...100500] of Trecord2;
end;


И есть процедуры:

Procedure procedure1 (mass: array of real)
begin
//работа с массивом
end;

Procedure procedure2 (mass: array of integer)
begin
//работа с массивом
end;


Вопрос1: как массивы являющиеся частью записи напрямую использовать в процедурах (указанные примеры). На данный момент я использую промежуточный массив и присвоение, но это не эстетично, несколько лишних переменных и действий, и если массивы большие, и действий с ними много уже занимает некоторое время (хотя, вероятно, и небольшое). Пробовал использовать absolute, но смог до конца понять как оно функционирует, да и упоминание как "устаревшее", немного пугает.

Вопрос2: (для общего развития): Процедура создает копию входного массива? А если я использую var - процедура всё так же делает копию с последующей заменой, или работает напрямую с памятью исходного массива?

Вопрос3: Немного из другой оперы, но рядом. Как сохранить обозначения индексов при использовании массива в процедуре, для пример есть массив:

a: array [5-10] of integer;


При использовании в процедуре индексы сбросятся до 0-4, как наиболее адекватно сохранять индексы массивов в процедурах? Можно конечно задавать массив 0-10 и не использовать элементы 0-4, но это как-то... Индексы используются как идентификаторы местоположения, использовать их с поправки (вместо 5-10 сразу 0-4) неудобно для восприятия.
4 дек 17, 15:50    [21004771]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
Так и знал, что тут уже нашученно :).

чччД
Умоляю, эту тему тоже в "Новости Delphi"!

...вслед за этой.

Эээ, что? Я что-то пропустил?
4 дек 17, 15:53    [21004788]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
Дабы меня не в очередной раз не обвиняли в вранье (хз почему), похвастаюсь результатами прошлых трудов :), это только малая часть :), а то будут вруном звать.
+

Картинка с другого сайта.
Картинка с другого сайта.
Картинка с другого сайта.
Картинка с другого сайта.
Картинка с другого сайта.
4 дек 17, 16:02    [21004823]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
Андрей Игоревич
...

Вопрос1: как массивы являющиеся частью записи напрямую использовать в процедурах (указанные примеры). На данный момент я использую промежуточный массив и присвоение, но это не эстетично, несколько лишних переменных и действий, и если массивы большие, и действий с ними много уже занимает некоторое время (хотя, вероятно, и небольшое). Пробовал использовать absolute, но смог до конца понять как оно функционирует, да и упоминание как "устаревшее", немного пугает.

Вопрос2: (для общего развития): Процедура создает копию входного массива? А если я использую var - процедура всё так же делает копию с последующей заменой, или работает напрямую с памятью исходного массива?

Вопрос3: Немного из другой оперы, но рядом. Как сохранить обозначения индексов при использовании массива в процедуре, для пример есть массив:

a: array [5-10] of integer;


При использовании в процедуре индексы сбросятся до 0-4, как наиболее адекватно сохранять индексы массивов в процедурах? Можно конечно задавать массив 0-10 и не использовать элементы 0-4, но это как-то... Индексы используются как идентификаторы местоположения, использовать их с поправки (вместо 5-10 сразу 0-4) неудобно для восприятия.

var, const, out => массивы копироваться не будут, в процедуре работа будет с переданными массивами "напрямую".
...
Процедуру можно объявить как

type
 Ta5_7 = array [5..7] of real;

procedure p(const a : Ta5_7);
var
  i: Integer;
  r: Real;
begin
  for i := 5 to 7 do
    r := a[i]
end;

Вместо этого все же советую пользоваться Low(), High():

procedure p(const a : array of real);
var
  i: Integer;
  r: Real;
begin
  for i := Low(a) to High(a) do
    r := a[i]
end;
4 дек 17, 16:13    [21004856]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
schi
Member

Откуда: Москва
Сообщений: 2353
А почему времменнЫх точек ?
4 дек 17, 16:15    [21004864]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2420
это реактор??
4 дек 17, 16:16    [21004869]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Glays
Member

Откуда:
Сообщений: 2345
Tactical Nuclear Penguin, это улей. Дельфи на пасеках довольно активно используется. Не знал?
4 дек 17, 16:24    [21004901]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
чччД
.....

Вместо этого все же советую пользоваться Low(), High():

procedure p(const a : array of real);
var
  i: Integer;
  r: Real;
begin
  for i := Low(a) to High(a) do
    r := a[i]
end;


Спасибо, отлично работает, так значит в памяти где-то всё-таки хранятся индексы массивов (или границы?).
4 дек 17, 16:24    [21004902]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28459

Картинка с другого сайта.

Posted via ActualForum NNTP Server 1.5

4 дек 17, 16:26    [21004910]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
Андрей Игоревич
чччД
.....

Вместо этого все же советую пользоваться Low(), High():

procedure p(const a : array of real);
var
  i: Integer;
  r: Real;
begin
  for i := Low(a) to High(a) do
    r := a[i]
end;


Спасибо, отлично работает, так значит в памяти где-то всё-таки хранятся индексы массивов (или границы?).


Если посмотреть (в отладчике на Low(a) и High(a) - там будет 0 и <что-то еще>... просто так нет нужды знать размер массива при его переборе / передаче :)
4 дек 17, 16:27    [21004917]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2420
Glays
Tactical Nuclear Penguin, это улей. Дельфи на пасеках довольно активно используется. Не знал?


плотность потока нейтронов?
конечно пасека
4 дек 17, 16:27    [21004919]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
schi
А почему времменнЫх точек ?

Ну а как ещё ударение обозначить, жирный шрифт лень впихивать было, и символ со знаком ударения тоже лень было искать.
Точки не врЕменные, в временнЫе (хз как их на русском по человечески обозвать), короче keypoints :)

Tactical Nuclear Penguin
это реактор??

Думаю по записям в Memo справа это можно понять :).
4 дек 17, 16:28    [21004920]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
А я сразу сказал - в "Новости Delphi". Тут и пасека, и секретный физик и петабайты в одном флаконе.
4 дек 17, 16:29    [21004922]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
чччД
А я сразу сказал - в "Новости Delphi". Тут и пасека, и секретный физик и петабайты в одном флаконе.


Как я уже писал, я не секретный :).

С вопросами 2,3 разобрался, спасибо, остался вопрос 1.

Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.
4 дек 17, 16:41    [21004964]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
Андрей Игоревич
...
Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.

Тоже "напрямую".
program Prg;

{$APPTYPE CONSOLE}

uses
  SysUtils;


type
  TDynRealArray = array of real;

  TR = record // Запись с массивом
   p : real;
   a: TDynRealArray;
  end;

 procedure p(var aA : TDynRealArray); // Процедура
 var
   i: Integer;
 begin
   SetLength(aA, Length(aA) * 2);
   for i := Length(aA) div 2 to High(aA) do
     aA[i] := Random ;
 end;

 var
   fR : TR;
  i: Integer;
begin
  fR.p := 3.14159265359;
  SetLength(fR.a, 3);
  for i := 0 to High(fR.a) do
    fR.a[i] := i;

  p(fR.a); // Обработка массива как части записи в процедуре

  for i := 0 to High(fR.a) do
    writeln(i, ' = ',  fR.a[i]);
  readln;
end.
4 дек 17, 17:03    [21005029]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
+ чччД
чччД
Андрей Игоревич
...
Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.

Тоже "напрямую".
program Prg;

{$APPTYPE CONSOLE}

uses
  SysUtils;


type
  TDynRealArray = array of real;

  TR = record // Запись с массивом
   p : real;
   a: TDynRealArray;
  end;

 procedure p(var aA : TDynRealArray); // Процедура
 var
   i: Integer;
 begin
   SetLength(aA, Length(aA) * 2);
   for i := Length(aA) div 2 to High(aA) do
     aA[i] := Random ;
 end;

 var
   fR : TR;
  i: Integer;
begin
  fR.p := 3.14159265359;
  SetLength(fR.a, 3);
  for i := 0 to High(fR.a) do
    fR.a[i] := i;

  p(fR.a); // Обработка массива как части записи в процедуре

  for i := 0 to High(fR.a) do
    writeln(i, ' = ',  fR.a[i]);
  readln;
end.


Использование записи нижнего уровня напрямую... И чего я сам не догадался.

Но есть недостаток, если рассматриваемый массив находиться на верхнем уровне записи, то я буду через процедуру прогонять ещё хренову тучу данных. Хотя если там var, то особых проблем в этом не будет?

Ну и ещё такой совместный вопрос, если в записи будут как раз упомянутые массивы начинающиеся не с нулевого элемента, при использовании в процедуре как части записи - элементы сместятся или нет? Надо проверить...

чччД
SetLength(aA, Length(aA) * 2);
   for i := Length(aA) div 2

А что тут происходит? Зачем?
4 дек 17, 17:21    [21005086]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
чччД
Guest
Андрей Игоревич
...Но есть недостаток, если рассматриваемый массив находиться на верхнем уровне записи, то я буду через процедуру прогонять ещё хренову тучу данных. Хотя если там var, то особых проблем в этом не будет?

Var такая хитрая штука. В процедуру передается не сам элемент, а лишь адрес передаваемого элемента, и она (процедура) работает прямо с "передаваемыми" данными, а сами данные остаются на прежнем месте ("снаружи" процедуры).

Если без var - то массивы передаются копированием. В процедуру передается копия массива. За исключением передачи динамических массивов (когда массив объявлен как array of, без указания параметров). В случае динамических массивов все равно как бы "var".
В общем, про динамические массивы советую почитать особо.

Если const - это все равно как var (т.е. "работа напрямую"), только компилятор смотрит за тем, чтобы ты не попортил передаваемые данные внутри процедуры.

Андрей Игоревич
...
Ну и ещё такой совместный вопрос, если в записи будут как раз упомянутые массивы начинающиеся не с нулевого элемента, при использовании в процедуре как части записи - элементы сместятся или нет? Надо проверить...

Не понял вопроса. Туплю. :)

Андрей Игоревич
...
чччД
SetLength(aA, Length(aA) * 2);
   for i := Length(aA) div 2

А что тут происходит? Зачем?

"Переданный"в процедуру массив увеличивается в длину в два раза. Добавленные элементы заполняются случайными значениями.

Смысла никакого нет, просто демонстрация работы с массивом. Можно не обращать внимания.
4 дек 17, 17:33    [21005105]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
чччД
....
Андрей Игоревич
...
Ну и ещё такой совместный вопрос, если в записи будут как раз упомянутые массивы начинающиеся не с нулевого элемента, при использовании в процедуре как части записи - элементы сместятся или нет? Надо проверить...

Не понял вопроса. Туплю. :)


Потестил, всё нормально. я боялся что индексы при инициализации (ну или как это грамотно называется) в процедуре опять уползут к нулю. Не уползли. Спасибо за способ.
5 дек 17, 09:07    [21006081]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 27665
Андрей Игоревич
Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.


Можно его вообще не объявлять в списке входно/выходных переменных процедуры, и пользовать как "внешнюю" для нее переменную. Это несколько выпадает из канонов, но не запрещается.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

const
  LowIndex = -15;
  HighIndex = 200100;

type
  TBigRec = record
              i1 : integer;
              k1 : double;
            end;
  TBigArray = array[ LowIndex .. HighIndex ] of TBigRec;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    VBigArray : TBigArray;
  public
    { Public declarations }
     procedure  FillBigArray; 
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.FillBigArray;
var m,i : integer;
      k : double;
begin
  for m := LowIndex to HighIndex
  do begin
       VBigArray[m].i1 := m;
       VBigArray[m].k1 := m / 2.0;
     end;
end;

end.
5 дек 17, 12:48    [21006905]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 33
S.G.
Андрей Игоревич
Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.


Можно его вообще не объявлять в списке входно/выходных переменных процедуры, и пользовать как "внешнюю" для нее переменную. Это несколько выпадает из канонов, но не запрещается.

unit Unit1;
.....


Можно.

Сейчас залез в свой в код и понял, что оба способа не подходят мне :).

Суть в том, что я стараюсь максимально универсивицировать процедуры и функции, то есть процедуры способны, например, сортировать массив, интерполировать по значению, найти ближайшее соответствие, ещё как-нибудь обрабатывать. И я использую её везде, где нужно, не повторяя код.

Но, что вариант с использованием записи, что с использованием глобальных переменных\записей делает этот кусок кода пригодным только под эту задачу, так и вообще можно без вызова процедуры обойтись.
5 дек 17, 13:12    [21007005]     Ответить | Цитировать Сообщить модератору
 Re: Использование массива из записи в процедуре (функции).  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 27665
Андрей Игоревич
S.G.
пропущено...


Можно его вообще не объявлять в списке входно/выходных переменных процедуры, и пользовать как "внешнюю" для нее переменную. Это несколько выпадает из канонов, но не запрещается.

unit Unit1;
.....



Можно.

Сейчас залез в свой в код и понял, что оба способа не подходят мне :).

Суть в том, что я стараюсь максимально универсивицировать процедуры и функции, то есть процедуры способны, например, сортировать массив, интерполировать по значению, найти ближайшее соответствие, ещё как-нибудь обрабатывать. И я использую её везде, где нужно, не повторяя код.

Но, что вариант с использованием записи, что с использованием глобальных переменных\записей делает этот кусок кода пригодным только под эту задачу, так и вообще можно без вызова процедуры обойтись.
Я не знаю, насколько универсальным вы хотите сделать свой код, но "капсулирование" данных и методов в один объект (как это делается в коде выше, да и вообще является основой Паскаля/Дельфи), делает именно это - универсальность.
У вас есть объект, "переменые" в нем (то есть, ваш массив), задают "состояние" объекта, а "методы" - процедуры и функции - переводят его из одного состояния в другое. Ну и решается типичная задача:
- начальное заполнение данных, (из другого объекта, из базы данных, из файла)
- обработка
- выгрузка (в другой объекта, в базу данных, в файл).

Как внутри проходит передача данных, через явное указание в виде параметров процедур, или в виде глобальной переменной, неважно (важно для компилятора, но не очень для нас)
5 дек 17, 13:42    [21007178]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить