![]() |
| ||
|
|
Новости |
Поиск |
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?
KSergey (2004-08-11 16:54:00) [1]Доктор, меня игнорируют! ;)
Все, я потерял интерес, т.к. ничего уже не понимаю.
cvg (2004-08-11 16:52:00) [2]Согласен, что вычисления придется переписывать там, где идет проверка условий.
Задача в грубом виде такая:
1-й вариант (был): на основе ряда некоторых динамично изменяющихся данных принимать некоторые решения;
2-й вариант (сейчас): делать то же самое на основании нескольких рядов данных.
KSergey (2004-08-11 16:42:00) [3]> [42] cvg (11.08.04 16:33)
По поводу [33] KSergey © (11.08.04 15:49)что-то сказать можем?
Во только по поводу приведенного куска - я никак не пойму как он состыкуется с func(abc);
В каждой строчке - работаем с разными полями структуры. Это все внутри одного цикла или как? Нормально можно задачу объяснять??
Erik1 (2004-08-11 16:41:00) [4]Если переменые дублируются, то должны быть представлены тойже структорой. Тоесть:
Type
MyType := Array of MyRecord;
A: MyType;
B: MyType;
...
Копирование:
B := Copy(A);
Тоесть сначала надо вычислить один случай, все скопировать и только после этого идем дальше. Иначе получается то, что имеем. И еще мне кажется вычисления сильно перерисать надо. Тоесть начать с изменения алгоритма.
cvg (2004-08-11 16:33:00) [5]Ну не надо ж прямо думать, что я все поля обрабатываю прямо-таки одной функцией. Фишка ж в том, что все переменные дублируются для нескольких параллельно идущих процессов. Соответственно, для их вычисления хочется писать не много разных
for i:=low(a) to high(a)
func(a[i].abc);
а что-нить типа
func(abc);
А пример кода я уже приводил. Ну, вот еще:
A[n].MA0 := pushing(A[n].avg0,A[n].ar[3]/A[n].start*100);
A[n].MA3 := A[n].arr[3] - A[n].MA1;
A[n].MA4 := A[n].arr[4] - A[n].MA2;
A[n].MA7 := pushing(A[1].avg7,A[n].ar[3]/A[n].start*100);
A[n].MA8 := pushing(A[1].avg8,A[n].qu);
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]);
if A[n].MA1 = 0 then A[n].MA1 := A[n].ar[1]/A[n].start*100;
if A[n].MA1 - A[n].ar[1]/A[n].start*100 >= 0.005
then A[n].MA1 := A[n].ar[1]/A[n].start*100
else A[n].MA1 := max(A[n].MA1,A[n].ar[1]/A[n].start*100);
if A[n].MA2 = 0 then A[n].MA2 := A[n].ar[2]/A[n].start*100;
if A[n].ar[2]/A[n].start*100 - A[n].MA2 >= 0.005
then A[n].MA2 := A[n].ar[2]/A[n].start*100
else A[n].MA2 := min(A[n].MA2,A[n].ar[2]/A[n].start*100);
Digitman (2004-08-11 16:17:00) [6]
> причем вычислять все параллельно
да уж .. из другой оперы это ария
KSergey (2004-08-11 16:15:00) [7]Параллельно - это прикольно.
Но вы можете ответить на [35] KSergey © (11.08.04 15:51)?? Просто из любопытства? Приведите небольшой пример кода обработки...
cvg (2004-08-11 16:11:00) [8]Просто сначала это были отдельные переменные и массивы, потом оказалось, что их надо дублировать для нескольких случаев, причем вычислять все параллельно. Вот. TDataSet погляжу.
Erik1 (2004-08-11 16:01:00) [9]To cvg
Каша у тебя в голове. Сделай проще создай клас, в классе опиши нужные тебе структуры. Причем делай Array of record а не наоборот. После переворота тебе легче станет, а область видемости будет ограничена классом. Действйу по правилу если значения ненужны для совместного вычисления дели на разные структуры или даже классы.
Digitman (2004-08-11 15:58:00) [10]
> cvg (11.08.04 15:49) [34]
при таких требованиях ты подходишь к концепции и реализации не с той стороны
смотри, к примеру, как реализовано св-во Fields[] класса TDataset и делай как минимум по образу и подобию
begin...end (2004-08-11 15:52:00) [11]
> [35] KSergey © (11.08.04 15:51)
Я это с поста [5] пытаюсь понять, обрати внимание :-)
KSergey (2004-08-11 15:51:00) [12]> [34] cvg (11.08.04 15:49)
Я что-то не пойму: как вы собираетесь одним и тем же кодом обрабатывать Integer, String, DateTime и т.д.???!! Или я вообще нифига не понял?
cvg (2004-08-11 15:49:00) [13]Так это если поля одного типа. А если разных -- то у каждого свою длину учитывать? А если типа string или массив?
KSergey (2004-08-11 15:49:00) [14]> [31] cvg (11.08.04 15:40)
> А как-нить по номеру поля в структуре обращаться к этому
> полю можно?
Нет, ибо нет у поля номера
Впрочем, тут есть еще такой вариант.
Вместо всех String полей сделать массив (границы в примере - условны)
type MyRec =
record
arrStr[1..5]: String
....
end;
В arrStr под разными индексами хранить определенные по смыслу значения.
А если еще вместо [1..5] определить перечислимый тип с осмысленными названиями - то и вообще вполне читабельный код получится, надо дтметить..
Тогда просто передавать ссылку на массив структур и индекс в arrStr, предназначенный к обработке.
А что, вполне паскалевое решение.
А то я все по нездоровой привычке чуть что - так сразу указатели ;)
begin...end (2004-08-11 15:42:00) [15]
> [31] cvg (11.08.04 15:40)
> А как-нить по номеру поля в структуре обращаться к этому полю можно?
Ну только смещение вычислять, как KSergey предложил. ИМХО.
cvg (2004-08-11 15:40:00) [16]А как-нить по номеру поля в структуре обращаться к этому полю можно?
KSergey (2004-08-11 15:33:00) [17]> [28] KSergey © (11.08.04 15:29)
Дополнение.
Если бы строки были фиксированной длины - то по 3-му варианту вполне можно идти.
Ну т.е. для обработки не динамических строк, а статических по размеру элеменетов - вообще милое дело (в том числе числа).
Digitman (2004-08-11 15:30:00) [18]
> cvg (11.08.04 15:22) [25]
ты для начала сформулируй задачу максимально точно и терминологически корректно - будет и подсказка.. хотя, думаю, она тебе и не понадобится, если ты это сделаешь) ... решение придет само собой, в ходе формулировки)
KSergey (2004-08-11 15:29:00) [19]Лучше. На выбор.
а) создать несколько массивов вместо одной структуры (да, вроде как не красиво)
б) копировать перед вызовом в промежуточный массив.
Вообще, есть еще 3-й, но будет ли он лучше и понятнее, особенно в разрезе паскаля? ;) Хотя в Си я бы так и сделал ;)
Смысл в передаче указателя на массив структур и относительного смещения в структуре требуемой строки.
Но тут тоже голову поломать немного надо, да и над вопросом - будет ли это эффективнее, т.е. возможно каздый раз при обработке будет генерится (может и не явно компилятором) временная строка, тогда решение с временным массивом будет хотя бы понятнее. Ну либо надо хорошо знать тонкости как компилируются конкретны выражения со строками в дельфи. Увы, я в деталях не знаю.
begin...end (2004-08-11 15:27:00) [20]
> cvg
Желательно было с самого начала привести полное описание записи. Ну да ладно.
Теперь сформулируй задачу снова - какие поля из этой записи надо обрабатывать? И - одинаковым образом или нет?