powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование массива из записи в процедуре (функции).
25 сообщений из 27, страница 1 из 2
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #39563805
Андрей Игоревич,

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

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

8 120 601 000 000 000 байт, если real == Double...
...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #39563842
Так и знал, что тут уже нашученно :).

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

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






...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #39563860
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему времменнЫх точек ?
...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #39563861
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это реактор??
...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #39563870
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear Penguin, это улей. Дельфи на пасеках довольно активно используется. Не знал?
...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #39563874
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #39563878
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GlaysTactical Nuclear Penguin, это улей. Дельфи на пасеках довольно активно используется. Не знал?

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

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

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

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

Как напрямую использовать массив из записи в процедуре, минуя использование промежуточных массивов.
...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #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
Использование массива из записи в процедуре (функции).
    #39564136
чччД....
Андрей Игоревич...
Ну и ещё такой совместный вопрос, если в записи будут как раз упомянутые массивы начинающиеся не с нулевого элемента, при использовании в процедуре как части записи - элементы сместятся или нет? Надо проверить...

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


Потестил, всё нормально. я боялся что индексы при инициализации (ну или как это грамотно называется) в процедуре опять уползут к нулю. Не уползли. Спасибо за способ.
...
Рейтинг: 0 / 0
Использование массива из записи в процедуре (функции).
    #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
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование массива из записи в процедуре (функции).
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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