OberonCore https://forum.oberoncore.ru/ |
|
Как ложить RECORD на struct https://forum.oberoncore.ru/viewtopic.php?f=2&t=287 |
Страница 1 из 1 |
Автор: | Kubanych [ Четверг, 03 Август, 2006 15:21 ] |
Заголовок сообщения: | Как ложить RECORD на struct |
Здравствуйте. Вот два объявления tInit=RECORD [noalign] dimensions:SHORTINT; verticalAxe:SHORTINT (* 0 - x 1 - y 2 - z*); waitedIntensity:SHORTINT; (* 6 7 8 9 10 *) ground:SHORTINT; (* 1 2 3 *) K0:REAL; K1:REAL; K2:REAL; K3:REAL; Kpsi:REAL; Ag:REAL; Av:REAL; fix:REAL; (* quatient for manual fixing *) how3d:SHORTINT;(* 0 - classic vector summ, 1 - p. 5.1, 2 - p. 5.2 *) jointTypeEpsilon:REAL; lenNodes:INTEGER; nodes:POINTER TO ARRAY [untagged] OF INTEGER; lenCoords:INTEGER; coords:POINTER TO ARRAY [untagged] OF ARRAY [untagged] OF REAL; lenMassLoadCases:INTEGER; massLoadCases:POINTER TO ARRAY [untagged] OF SHORTINT; (*numbers of initial dynamic loadcases*) massLoadCasesCos:POINTER TO ARRAY [untagged] OF ARRAY [untagged] OF REAL; (* second param [0] - x , [1] - y, [2] -z*) massDefType:SHORTINT(* 0 - get given masses, 1 collect masses from static loads*); lenMassNodes:INTEGER; massNodes:POINTER TO ARRAY [untagged] OF INTEGER; lenMassDirs:INTEGER; massDirs:POINTER TO ARRAY [untagged] OF SHORTINT; mass:POINTER TO ARRAY [untagged] OF ARRAY [untagged] OF ARRAY [untagged] OF REAL(* dynamic loadcases, nodes, dirs *); width:REAL; howMoment:SHORTINT; (* 0 - define application node number at each level and make sums 1 - calculate and apply moment for each node *) lenMomentNodes:INTEGER; momentNodes:POINTER TO ARRAY [untagged] OF INTEGER; lenUsualSeismToRotate:INTEGER; usualSeismToRotate:POINTER TO ARRAY [untagged] OF ARRAY [untagged] OF INTEGER (*second size is 2, [0] - usual seismic load case, [1] - rotate check load case*); lenUsualSeismToStabil:INTEGER; usualSeismToStabil:POINTER TO ARRAY [untagged] OF ARRAY [untagged] OF INTEGER (*second size is 2, [0] - usual seismic load case, [1] - stability check load case longituduinal 1.0 [2] - stability check load case lateral 0.4 [3] - stability check load case longituduinal 0.4 [4] - stability check load case lateral 1.0 *) END; typedef struct tInit { short dimensions; short verticalAxe /* 0 - x 1 - y 2 - z*/; short waitedIntensity; /* 6 7 8 9 10 */ short ground; /* 1 2 3 */ double K0; double K1; double K2; double K3; double Kpsi; double Ag; double Av; double fix; /* quatient for manual fixing */ short how3d;/* 0 - classic vector summ, 1 - p. 5.1, 2 - p. 5.2 */ double jointTypeEpsilon; int lenNodes; int *nodes; int lenCoords; double ** coords; int lenMassLoadCases; short * massLoadCases; /*numbers of initial dynamic loadcases*/ double ** massLoadCasesCos; /* second param [0] - x , [1] - y, [2] -z*/ short massDefType /* 0 - get given masses, 1 collect masses from static loads*/; int lenMassNodes; int * massNodes; int lenMassDirs; short * massDirs; double *** mass/* dynamic loadcases, nodes, dirs */; double width; short howMoment; /* 0 - define application node number at each level and make sums 1 - calculate and apply moment for each node */ int lenMomentNodes; int * momentNodes; int lenUsualSeismToRotate; int ** usualSeismToRotate /*second size is 2, [0] - usual seismic load case, [1] - rotate check load case*/; int lenUsualSeismToStabil; int ** usualSeismToStabil /*second size is 2, [0] - usual seismic load case, [1] - stability check load case longituduinal 1.0 [2] - stability check load case lateral 0.4 [3] - stability check load case longituduinal 0.4 [4] - stability check load case lateral 1.0 */; }; Эта запись передается как параметр из msvc exe в blackbox dll. до how3d включительно данные передаются ровно, далее идет мусор. Как правильно объявлять записи, чтобы они совпадали в аналогичными struct ? Заранее благодарю. С уважением, Кубаныч. |
Автор: | Kubanych [ Пятница, 04 Август, 2006 07:05 ] |
Заголовок сообщения: | |
Если после RECORD дать флаг [align8], то вроде все значения скаляров проходят нормально. Теперь вопрос в другом. При обращении к элементу массива, объявленном, как usualSeismToStabil:POINTER [untagged] TO ARRAY [untagged] OF ARRAY [untagged] OF INTEGER получается сообщение компилятора об ошибке FOR i :=0 TO in.lenUsualSeismToStabil-1 DO FOR j :=0 TO 5-1 DO txt.Tab; <длина массива неизвестна>n:=in.usualSeismToStabil[i][j]; txt.Int(n); END; END; Как правильно работать с многомерными динамическими массивами, передаваемыми внутри записей - параметров через длл ? Заранее благодарю. С уважением, Кубаныч. |
Автор: | Илья Ермаков [ Пятница, 04 Август, 2006 21:56 ] |
Заголовок сообщения: | |
У Вас неправильное объявление - двумерный безтеговый массив, естественно, существовать не может, т.к. у компилятора нет возможности узнать длину строки массива, чтобы организовать индексацию. Конструкция int ** usualSeismToStabil в С - это не двумерный массив, а указатель на массив из указателей на массивы, т.е.: Код: usualSeismToStabil:POINTER TO ARRAY [untagged] OF
POINTER TO ARRAY [untagged] OF INTEGER; |
Автор: | Kubanych [ Понедельник, 07 Август, 2006 06:50 ] |
Заголовок сообщения: | |
Спасибо, заработало. Оказывается, в си нет настоящих многомерных массивов! А с [align8] (см. выше) я все правильно сделал? Результат получился правильным методом тыка. С уважением, Кубаныч. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |