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?


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

Желательно было с самого начала привести полное описание записи. Ну да ладно.
Теперь сформулируй задачу снова - какие поля из этой записи надо обрабатывать? И - одинаковым образом или нет?


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

Наверх

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