![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать в функцию массив из структуры -- как??? [D7, WinXP]
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 одинаковым образом, то можно, конечно, перед вызовом функции формировать соответствующий массив (из нужных полей) и уже его передавать в функцию.