Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передать в функцию массив из структуры -- как??? [D7, WinXP]


Страницы:   1 2 3

cvg ©   (2004-08-11 13:40:00) 

Hi Masters! Имеется структурка типа:

type MyRec =
record
 name:string;
 ar:array [0..5] of double;
......
end;
MyArr = array of MyRec;
var A:MyArr;

Как передать в функцию не один элемент -- скажем, A[n].name, -- а массив всех names?


cvg   (2004-08-11 15:25:00) [21]

To KSergey
Это ж я идеальный вариант нарисовал. Мне бы что-нить, чтоб громоздкие циклы перед каждым обращениям к функциям не писать.


cvg   (2004-08-11 15:22:00) [22]

Ну, согласен, каша. Ты лучше как быть подскажи.


KSergey   (2004-08-11 15:21:00) [23]

> [12] cvg   (11.08.04 14:40)
> ну, можноЮ конечно и так... Но мне-то бы хотелось что-нить
> типа
> func(A.name); func(A.name1);

Нельзя так.
По той простой причине, что A.не существует в принципе. Только A[x].


Digitman   (2004-08-11 15:18:00) [24]


> cvg   (11.08.04 15:14) [21]


у тебя полная каша в голове с понятиями "структура" и "массив"


> все соответствующие поля из структуры A


что за "структура A" ? нет в приведенном коде никаких "структур A" ! есть массивА !


begin...end   (2004-08-11 15:17:00) [25]

Уф-ф...
И после этого ты будешь утверждать, что у тебя куча полей обрабатывается одной и той же функцией?


cvg   (2004-08-11 15:14:00) [26]

Проблема в том, что структурка у меня вышла такая:

type MyRec =
record
 name:string;
 ar:array [0..5] of double;
 avg0:array of double;
 avg7:array of double;
 avg8:array of double;
 ar1:array[0..4] of double;
 ar2:array[0..4] of double;
 arr:array [0..5] of double;
 buff:array [1..6] of double;
 es_war:integer;
 in_lot:integer;
 lots:integer;
 lpp:integer;
 MA_:double;
 MA_0:double;
 MA0:double;
 MA1:double;
 MA2:double;
 MA3:double;
 MA4:double;
 MA7:double;
 MA8:double;
 mass:array of double;
 mass1:array of double;
 mass2:array of double;
 max:double;
 max1:double;
 min:double;
 min1:double;
 op:integer;
 pair:integer;
 qu:double;
 start:double;
 switch:Boolean;
 zahl1:integer;
 zahl2:integer;
end;
MyArr = array of MyRec;

а существующие обращения к функциям такого типа:

A[n].arr[1] := combing(A[n].ar[1]/A[n].start*100,A[n].arr[1],1);
A[n].arr[2] := combing(A[n].ar[2]/A[n].start*100,A[n].arr[2],1);
A[n].buff[5] := A[n].arr[3]; A[n].buff[6] := A[n].arr[4];
A[n].arr[3] := combing(A[n].arr[1],A[n].arr[3],10);
A[n].arr[4] := combing(A[n].arr[2],A[n].arr[4],10);
putting(A[n].mass1,A[n].arr[3]); putting(A[n].mass2,A[n].arr[4]);
A[n].arr[5] := mixing(A[n].mass1,A[n].mass2,A[n].mass,index);
putting(A[n].mass,A[n].arr[5]);

где вместо A[n] должны иметься ввиду "все соответствующие поля из структуры A".


begin...end   (2004-08-11 15:03:00) [27]


>  [19] cvg   (11.08.04 14:59)

Типа да.

Ну или см. [7], второй вариант. Но это будет хреново с точки зрения производительности. Да и коряво.


cvg   (2004-08-11 14:59:00) [28]

To begin...end
То есть, типа, переименовать их всех под одну гребенку?


cvg   (2004-08-11 14:57:00) [29]

Коточе, если есть возможность соорудить что-нить типа

function f(word);
begin
for i := 0 to length(A) - 1 do
 
end;

begin
f('name');

я был бы практически счастлив.


begin...end   (2004-08-11 14:56:00) [30]

type
 MyRec = record
   Names: array [0..29] of String;
   ...
 end;

 MyArr = array of MyRec;

var
 A: MyArr;

...

for I := Low(A) to High(A) do
 for J := 0 to 29 do
   Func(MyArr[I].Names[J]) // обработка одного поля одной записи


cvg   (2004-08-11 14:50:00) [31]

to begin...end
Ну это ж я для примера сказал, что name и name1. На самом-то деле их там до фига (штук 30) и с разными именами.


Digitman   (2004-08-11 14:48:00) [32]


> Если бы только цикл for запихать в чего-нить типа функции
> и


это что же, я еще и "запихивать" что-то куда-то за тебя должен ? совсем беда с головой у тебя приключилась ?


cvg   (2004-08-11 14:45:00) [33]

To Digitman
Вот, уже теплее... Если бы только цикл forзапихать в чего-нить типа функции и вызов ее делать не внутри функции ааа, а вне ее...


begin...end   (2004-08-11 14:42:00) [34]


> [10] cvg   (11.08.04 14:36)

Передавать НОМЕР ПАРАМЕТРА, ПОДЛЕЖАЩЕГО ОБРАБОТКЕ.
Или пусть у тебя будет не name и name1, а Name: array[0..1] of String, тогда передаёшь соответственно 0 или 1.

> [12] cvg   (11.08.04 14:40)


> func(A.name); func(A.name1);

Сделай функцию, в которую передаётся ТОЛЬКО ОДНА запись.
for I := Low to High do
 func(A[I].name);


?


cvg   (2004-08-11 14:40:00) [35]

To begin...end
ну, можноЮ конечно и так... Но мне-то бы хотелось что-нить типа

func(A.name); func(A.name1);


Digitman   (2004-08-11 14:36:00) [36]

function aaa( vararr: MyArr, bbb:integer): ResultType;
begin
...
case bbb of
0: for i := low(arr) to High(arr) do Processing(arr[i].names);
1: for i := low(arr) to High(arr) do Processing(arr[i].names1);

2: и т.д.
...
end;


cvg   (2004-08-11 14:36:00) [37]

Типа, номер вызова передавать? Но это же страшно коряво! По идее функция вообще знать не должна, что ети массивы являются частью какой-то там структуры.


wal   (2004-08-11 14:32:00) [38]

function aaa(arr: MyArr, bbb:integer): ResultType;
begin
...
case bbb of
0: Do(arr[I].names);
1: Do(arr[I].names1)
2: и т.д.
...
end;

С уважением.


Digitman   (2004-08-11 14:32:00) [39]


> хотелось бы лишнее не пердавать


передавай массив не по значению, а по ссылке


> при первом вызове должна обработать все поля name, а при
> втором -- все поля name1


организуй 2-й параметр в ф-ции, принимающей первым параметром массив по ссылке ... этот 2-й параметр будет указывать "номер вызова"


begin...end   (2004-08-11 14:31:00) [40]

Тогда, ИМХО, этой функции нужно передавать некий дополнительный параметр - какое поле обрабатывать.
Если функция должна обрабатывать name и names1 одинаковым образом, то можно, конечно, перед вызовом функции формировать соответствующий массив (из нужных полей) и уже его передавать в функцию.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо