Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование массива из записи в процедуре (функции). / 25 сообщений из 27, страница 1 из 2
04.12.2017, 15:32
    #39563803
Использование массива из записи в процедуре (функции).
Вероятно дилетантский вопрос...

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;
...
Рейтинг: 0 / 0
04.12.2017, 15:33
    #39563805
Использование массива из записи в процедуре (функции).
Андрей Игоревич,

Так, я что-то нажал и оно отправилось, я ещё не успел сформулировать вопрос. Минуточку.
...
Рейтинг: 0 / 0
04.12.2017, 15:34
    #39563806
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
А теперь попробуй запихать всё это гомно в стек в виде локальных переменных! Я угадал вопрос?
...
Рейтинг: 0 / 0
04.12.2017, 15:37
    #39563810
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Умоляю, эту тему тоже в "Новости Delphi"!

...вслед за этой .
...
Рейтинг: 0 / 0
04.12.2017, 15:38
    #39563812
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
человек может памяти прикупил
гггг :)
...
Рейтинг: 0 / 0
04.12.2017, 15:42
    #39563820
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Tactical Nuclear Penguinчеловек может памяти прикупил
гггг :)

8 120 601 000 000 000 байт, если real == Double...
...
Рейтинг: 0 / 0
04.12.2017, 15:50
    #39563836
Использование массива из записи в процедуре (функции).
В общем, есть запись вида

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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;



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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Procedure procedure1 (mass: array of real)
begin
//работа с массивом
end;

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



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

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

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

Код: pascal
1.
a: array [5-10] of integer;



При использовании в процедуре индексы сбросятся до 0-4, как наиболее адекватно сохранять индексы массивов в процедурах? Можно конечно задавать массив 0-10 и не использовать элементы 0-4, но это как-то... Индексы используются как идентификаторы местоположения, использовать их с поправки (вместо 5-10 сразу 0-4) неудобно для восприятия.
...
Рейтинг: 0 / 0
04.12.2017, 15:53
    #39563842
Использование массива из записи в процедуре (функции).
Так и знал, что тут уже нашученно :).

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

...вслед за этой .
Эээ, что? Я что-то пропустил?
...
Рейтинг: 0 / 0
04.12.2017, 16:02
    #39563851
Использование массива из записи в процедуре (функции).
Дабы меня не в очередной раз не обвиняли в вранье (хз почему), похвастаюсь результатами прошлых трудов :), это только малая часть :), а то будут вруном звать.






...
Рейтинг: 0 / 0
04.12.2017, 16:13
    #39563859
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Андрей Игоревич...

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

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

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

Код: pascal
1.
a: array [5-10] of integer;



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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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():

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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;
...
Рейтинг: 0 / 0
04.12.2017, 16:15
    #39563860
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
А почему времменнЫх точек ?
...
Рейтинг: 0 / 0
04.12.2017, 16:16
    #39563861
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
это реактор??
...
Рейтинг: 0 / 0
04.12.2017, 16:24
    #39563870
Glays
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Tactical Nuclear Penguin, это улей. Дельфи на пасеках довольно активно используется. Не знал?
...
Рейтинг: 0 / 0
04.12.2017, 16:24
    #39563871
Использование массива из записи в процедуре (функции).
чччД.....

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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;



Спасибо, отлично работает, так значит в памяти где-то всё-таки хранятся индексы массивов (или границы?).
...
Рейтинг: 0 / 0
04.12.2017, 16:26
    #39563874
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.12.2017, 16:27
    #39563877
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Андрей ИгоревиччччД.....

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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 и <что-то еще>... просто так нет нужды знать размер массива при его переборе / передаче :)
...
Рейтинг: 0 / 0
04.12.2017, 16:27
    #39563878
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
GlaysTactical Nuclear Penguin, это улей. Дельфи на пасеках довольно активно используется. Не знал?

плотность потока нейтронов?
конечно пасека
...
Рейтинг: 0 / 0
04.12.2017, 16:28
    #39563879
Использование массива из записи в процедуре (функции).
schiА почему времменнЫх точек ?
Ну а как ещё ударение обозначить, жирный шрифт лень впихивать было, и символ со знаком ударения тоже лень было искать.
Точки не врЕменные, в временнЫе (хз как их на русском по человечески обозвать), короче keypoints :)

Tactical Nuclear Penguinэто реактор??
Думаю по записям в Memo справа это можно понять :).
...
Рейтинг: 0 / 0
04.12.2017, 16:29
    #39563881
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
А я сразу сказал - в "Новости Delphi". Тут и пасека, и секретный физик и петабайты в одном флаконе.
...
Рейтинг: 0 / 0
04.12.2017, 16:41
    #39563894
Использование массива из записи в процедуре (функции).
чччДА я сразу сказал - в "Новости Delphi". Тут и пасека, и секретный физик и петабайты в одном флаконе.

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

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

Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.
...
Рейтинг: 0 / 0
04.12.2017, 17:03
    #39563908
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Андрей Игоревич...
Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.
Тоже "напрямую".
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
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.
...
Рейтинг: 0 / 0
04.12.2017, 17:21
    #39563928
Использование массива из записи в процедуре (функции).
чччДчччДАндрей Игоревич...
Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.

Тоже "напрямую".
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
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 , то особых проблем в этом не будет?

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

чччД
Код: pascal
1.
2.
SetLength(aA, Length(aA) * 2);
   for i := Length(aA) div 2


А что тут происходит? Зачем?
...
Рейтинг: 0 / 0
04.12.2017, 17:33
    #39563933
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Андрей Игоревич...Но есть недостаток, если рассматриваемый массив находиться на верхнем уровне записи, то я буду через процедуру прогонять ещё хренову тучу данных. Хотя если там var , то особых проблем в этом не будет?

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

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

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

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

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

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


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

Смысла никакого нет, просто демонстрация работы с массивом. Можно не обращать внимания.
...
Рейтинг: 0 / 0
05.12.2017, 09:07
    #39564136
Использование массива из записи в процедуре (функции).
чччД....
Андрей Игоревич...
Ну и ещё такой совместный вопрос, если в записи будут как раз упомянутые массивы начинающиеся не с нулевого элемента, при использовании в процедуре как части записи - элементы сместятся или нет? Надо проверить...

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


Потестил, всё нормально. я боялся что индексы при инициализации (ну или как это грамотно называется) в процедуре опять уползут к нулю. Не уползли. Спасибо за способ.
...
Рейтинг: 0 / 0
05.12.2017, 12:48
    #39564317
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование массива из записи в процедуре (функции).
Андрей ИгоревичКак напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
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.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование массива из записи в процедуре (функции). / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]