OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 23 Апрель, 2024 21:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Как ложить RECORD на struct
СообщениеДобавлено: Четверг, 03 Август, 2006 15:21 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Здравствуйте. Вот два объявления

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 ?

Заранее благодарю.
С уважением,
Кубаныч.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 04 Август, 2006 07:05 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Если после 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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
У Вас неправильное объявление - двумерный безтеговый массив, естественно, существовать не может, т.к. у компилятора нет возможности узнать длину строки массива, чтобы организовать индексацию.

Конструкция int ** usualSeismToStabil в С - это не двумерный массив, а указатель на массив из указателей на массивы, т.е.:
Код:
usualSeismToStabil:POINTER TO ARRAY [untagged] OF
      POINTER TO ARRAY [untagged] OF INTEGER;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 07 Август, 2006 06:50 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Спасибо, заработало. Оказывается, в си нет настоящих многомерных массивов! А с [align8] (см. выше) я все правильно сделал? Результат получился правильным методом тыка.

С уважением,
Кубаныч.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB