1 Pages (3 items)
Вложенные структуры (массивы) - Messages
#1 Posted: 6/4/2009 3:16:17 PM
Вижу, что в SMath Studio 0.80 (build 3408) от 01.01.1601 г (ну и старьё) есть попытки поддерживать нечто вложенное в матрицах.
Могу показать как были устроены структуры, называемые nested arrays, у Mathcad. По крайней мере те, что передавались внутрь пользовательских библиотек. Вот два работающих варианта на С и на Паскале.
Описание структур на С:
Чтобы понять, что в элементе матрицы находится нечто отличное от числа типа double, второе двойное слово (DWORD 4 байта) равнялось 0xFFFFFFFF, а первое было указателем на расширенное описание. Первое и второе при просмотре от младших адресов к старшим. Если нет такой метки, то считалось, что в памяти находится число типа double (8 байт).
Вот пример кода дешифровки
из Отладчика. Этот код рисует список переданных переменных в окне списка переменных:
Ещё один пример из Delphi. Описание структур:
В общем, так как это сделано в Mathcad, думаю, что делать не надо. Не красиво.
Могу показать как были устроены структуры, называемые nested arrays, у Mathcad. По крайней мере те, что передавались внутрь пользовательских библиотек. Вот два работающих варианта на С и на Паскале.
Описание структур на С:
typedef struct
{
DWORD dwType;
char * str;
} EXTPTR, *PEXTPTR;
typedef struct
{
PEXTPTR pMCType;
DWORD dwMark;
} EXTCELL, *PEXTCELL;
typedef struct
{
DWORD dwType; // тип расширенного содержимого
DWORD dwUnknown1;
DWORD dwBytesSize;// размер реальной (мнимой) части в байтах
DWORD dwUnknown2;
double* pReal; // pReal[...], == NULL когда реальная часть равна нулю
double* pImag; // pImag[...], == NULL когда мнимая часть равна нулю
DWORD dwRows;
DWORD dwCols;
} EXTCMPLXARR, *PEXTCMPLXARR;
Чтобы понять, что в элементе матрицы находится нечто отличное от числа типа double, второе двойное слово (DWORD 4 байта) равнялось 0xFFFFFFFF, а первое было указателем на расширенное описание. Первое и второе при просмотре от младших адресов к старшим. Если нет такой метки, то считалось, что в памяти находится число типа double (8 байт).
Вот пример кода дешифровки

////////////////////////////////////
// 1. Сначала отображаем информацию
// Очищаем список переменных
m_pLView->SetRedraw( FALSE );
m_pLView->DeleteAllItems();
LVITEM lvi;
TCHAR szRe[32], szIm[32];
int strmark, rows, cols;
PEXTCELL ptr;
PEXTCMPLXARR m_pExtCmplxArr;
// Формируем новый список
for ( i = 0; i < (int)Vars->rows; i++ ) {
for ( j = 0; j < (int)Vars->cols; j++ ) {
nItemIndx = i * int(Vars->cols) + j;
// Insert the first item
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
strItem.Format(_T("#%i"
, nItemIndx);
lvi.iItem = nItemIndx;
lvi.iSubItem = 0;
lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
// Выбираем картинку в соответствии с типом переменной
lvi.iImage = VarTypeFromAddress( (PDWORD) &Vars->hReal[j][i] );
m_pLView->InsertItem(&lvi);
// Находим для каждой переменной значение
// Узнаём что находится в ячейке массива
ptr = (PEXTCELL)((PDWORD)Vars->hReal[j] + i*sizeof(double)/sizeof(DWORD));
strmark = int(~ptr->dwMark);
if (strmark == 0) {
switch ( ptr->pMCType->dwType ) {
case 0x03: { // Если параметр задан в виде строки, то ...
strItem.Format("\"%s\"", (LPCTSTR)ptr->pMCType->str );
break;
}
case 0x05: {
m_pExtCmplxArr = ( PEXTCMPLXARR ) ptr->pMCType;
rows = m_pExtCmplxArr->dwRows;
cols = m_pExtCmplxArr->dwCols;
if ( ( rows == 1 ) && ( cols == 1 ) ) {
int strmark2;
PEXTCELL ptr2;
PEXTCMPLXARR pTmpArr;
ptr2 = (PEXTCELL)((PDWORD) m_pExtCmplxArr->pReal );
strmark2 = int(~ptr2->dwMark);
if (strmark2 == 0) {
switch ( ptr2->pMCType->dwType ) {
case 0x03: { // Если параметр задан в виде строки
strItem.Format("{\"%s\"}", (LPCTSTR)ptr2->pMCType->str );
break;
}
case 0x05: {
pTmpArr = ( PEXTCMPLXARR ) ptr2->pMCType;
strItem.Format("{{%i,%i}}", pTmpArr->dwRows, pTmpArr->dwCols ) ;
break;
}
case 0x08: {
strItem.Format("{function}"
;
break;
}
default:
wsprintf(szRe, "[%#08x]?", ptr2->pMCType->dwType );
strItem.Format("{%s}", szRe );
}
} else { // нет признака указателя, будем считать, что это число типа double
if ( ( m_pExtCmplxArr->pImag != NULL ) && ( m_pExtCmplxArr->pReal != NULL ) ) {
if ( m_pExtCmplxArr->pReal[ 0 ] == 0.) {
if ( m_pExtCmplxArr->pImag[ 0 ] == 0. ) {
strItem.Format( "{0}" );
break;
}
sprintf_s(szIm, _T("%.*G"
, nPrecision, m_pExtCmplxArr->pImag[ 0 ] );
strItem.Format("{%si}", szIm );
break;
}
if ( m_pExtCmplxArr->pImag[ 0 ] == 0.) {
sprintf_s(szRe, _T("%.*G"
, nPrecision, m_pExtCmplxArr->pReal[ 0 ] );
strItem.Format("{%s}", szRe );
break;
}
sprintf_s(szRe, _T("%.*G"
, nPrecision, m_pExtCmplxArr->pReal[ 0 ] );
sprintf_s(szIm, _T("%.*G"
, nPrecision, m_pExtCmplxArr->pImag[ 0 ] );
strItem.Format("{%s %s %si}", szRe, (szIm[0]=='-'
?("-"
"+"
,
(szIm[0]=='-'
?(szIm + 1)
szIm) );
break;
}
if ( m_pExtCmplxArr->pReal != NULL ) {
sprintf_s(szRe, _T("%.*G"
, nPrecision, m_pExtCmplxArr->pReal[ 0 ] );
strItem.Format("{%s}", szRe );
break;
}
if ( m_pExtCmplxArr->pImag != NULL ) {
if ( m_pExtCmplxArr->pImag[ 0 ] == 0. ) {
strItem.Format("{0}"
;
break;
} else {
sprintf_s(szIm, _T("%.*G"
, nPrecision, m_pExtCmplxArr->pImag[ 0 ] );
strItem.Format("{%si}", szIm );
break;
}
}
}
} else strItem.Format("{%i,%i}", rows, cols ) ;
break;
}
case 0x08: {
strItem.Format("function"
;
break;
}
default:
wsprintf(szRe, "[%#08x]?", ptr->pMCType->dwType );
strItem.Format("%s", szRe );
}
} else { // нет признака указателя, будем считать, что это число типа double
if ( ( Vars->hImag != NULL ) && ( Vars->hReal != NULL ) ) {
if ( Vars->hReal[j][i] == 0.) {
if ( Vars->hImag[j][i] == 0. ) {
strItem.Format( "0" );
} else {
sprintf_s(szIm, _T("%.*G"
, nPrecision, Vars->hImag[j][i] );
strItem.Format("%si", szIm );
}
} else
if ( Vars->hImag[j][i] == 0.) {
sprintf_s(szRe, _T("%.*G"
, nPrecision, Vars->hReal[j][i] );
strItem.Format("%s", szRe );
} else {
sprintf_s(szRe, _T("%.*G"
, nPrecision, Vars->hReal[j][i] );
sprintf_s(szIm, _T("%.*G"
, nPrecision, Vars->hImag[j][i] );
strItem.Format("%s %s %si", szRe, (szIm[0]=='-'
?("-"
"+"
,
(szIm[0]=='-'
?(szIm + 1)
szIm) );
}
} else
if ( Vars->hReal != NULL ) {
sprintf_s(szRe, _T("%.*G"
, nPrecision, Vars->hReal[j][i] );
strItem.Format("%s", szRe );
} else
if ( Vars->hImag != NULL ) {
if ( Vars->hImag[j][i] == 0. ) {
strItem.Format("0"
;
} else {
sprintf_s(szIm, _T("%.*G"
, nPrecision, Vars->hImag[j][i] );
strItem.Format("%si", szIm );
}
}
}
m_pLView->SetItemText( nItemIndx, 1, strItem);
// В поле адреса вписываем адрес переменной в памяти
wsprintf(szRe, "%#08x", (DWORD) &Vars->hReal[j][i] );
strItem.Format("%s", szRe );
m_pLView->SetItemText( nItemIndx, 2, strItem);
// Set item data
m_pLView->SetItemData( nItemIndx, (DWORD) &Vars->hReal[j][i] );
}
}
if (m_pLView->GetItemCount() > 1) {
m_pLView->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED | LVIS_FOCUSED);
m_pLView->EnsureVisible(0, FALSE);
}
m_pLView->SetRedraw();
//////////////////////////////////////////
Ещё один пример из Delphi. Описание структур:
type
EXTCMPLXARR = record
dwType : DWORD;
dwUnknown1 : DWORD;
dwBytesSize : DWORD;
dwUnknown2 : DWORD;
pReal : ^tColumn; // столбец матрицы в Mathcad
pImag : ^tColumn;
dwRows : DWORD;
dwCols : DWORD;
end;
EXTCELL = record
pMCType : ^EXTCMPLXARR;
dwMark : DWORD;
end;
var
i, i1, k : longint;
NumPoints : LongInt;
pExtCell: ^EXTCELL;
pExtArr: ^EXTCMPLXARR;
[/code]Далее я сам создаю вложенный массив, который Mathcad благополучно принимает.[code]// Сам массив точек находится в массивах zz1, zz2, zz3
// Чтобы отрисовать точки нужно создать вектор из
// трёх элементов, каждый элемент содержит вектор
// координат, соответственно X, Y, Z.
MathcadArrayAllocate(OutArr, 3, 1, TRUE, FALSE);
// -=[ Вставляем вектор координат X ]=-
// OutArr.hReal^[Столбец]^[Строка] - отсчёт с нуля
pExtCell := @ OutArr.hReal^[0]^[0];
pExtCell^.dwMark := DWORD(-1);
// Выделяем память под заголовок расширенного массива
// pExtArr := MathcadAllocate(sizeof(EXTCMPLXARR));
pExtArr := AllocMem(sizeof(EXTCMPLXARR));
// Заполняем структуру расширенного массива
with pExtArr^ do begin
dwType := $05; // тип - расширенный комплексный массив
dwUnknown1 := NumPoints; // здесь должно быть число не менее 5
dwBytesSize := dwUnknown1 * sizeof(double); // размер массива в байтах
dwUnknown2 := $00;
// pReal := MathcadAllocate(dwBytesSize);
pReal := AllocMem(dwBytesSize);
pImag := nil;
dwRows := NumPoints; // количество строк
dwCols := 1; // количество столбцов
end;
// Подцепляем её к элементу массива
pExtCell^.pMCType := @ pExtArr^;
// В расширенном массиве столбцы расположены в памяти
// один за другим
for i1 := 0 to NumPoints - 1 do begin
pExtArr^.pReal^[i1] := double(zz1[i1]);
end;
// -=[ Вставляем вектор координат Y ]=-
// OutArr.hReal^[Столбец]^[Строка] - отсчёт с нуля
pExtCell := @ OutArr.hReal^[0]^[1];
pExtCell^.dwMark := DWORD(-1);
// Выделяем память под заголовок расширенного массива
// pExtArr := MathcadAllocate(sizeof(EXTCMPLXARR));
pExtArr := AllocMem(sizeof(EXTCMPLXARR));
// Заполняем структуру расширенного массива
with pExtArr^ do begin
dwType := $05; // тип - расширенный комплексный массив
dwUnknown1 := NumPoints; // здесь должно быть число не менее 5
dwBytesSize := dwUnknown1 * sizeof(double); // размер массива в байтах
dwUnknown2 := $00;
// pReal := MathcadAllocate(dwBytesSize);
pReal := AllocMem(dwBytesSize);
pImag := nil;
dwRows := NumPoints; // количество строк
dwCols := 1; // количество столбцов
end;
// Подцепляем её к элементу массива
pExtCell^.pMCType := @ pExtArr^;
// В расширенном массиве столбцы расположены в памяти
// один за другим
for i1 := 0 to NumPoints - 1 do begin
pExtArr^.pReal^[i1] := double(zz2[i1]);
end;
// -=[ Вставляем вектор координат Z ]=-
// OutArr.hReal^[Столбец]^[Строка] - отсчёт с нуля
pExtCell := @ OutArr.hReal^[0]^[2];
pExtCell^.dwMark := DWORD(-1);
// Выделяем память под заголовок расширенного массива
// pExtArr := MathcadAllocate(sizeof(EXTCMPLXARR));
pExtArr := AllocMem(sizeof(EXTCMPLXARR));
// Заполняем структуру расширенного массива
with pExtArr^ do begin
dwType := $05; // тип - расширенный комплексный массив
dwUnknown1 := NumPoints; // здесь должно быть число не менее 5
dwBytesSize := dwUnknown1 * sizeof(double); // размер массива в байтах
dwUnknown2 := $00;
// pReal := MathcadAllocate(dwBytesSize);
pReal := AllocMem(dwBytesSize);
pImag := nil;
dwRows := NumPoints; // количество строк
dwCols := 1; // количество столбцов
end;
// Подцепляем её к элементу массива
pExtCell^.pMCType := @ pExtArr^;
// В расширенном массиве столбцы расположены в памяти
// один за другим
for i1 := 0 to NumPoints - 1 do begin
pExtArr^.pReal^[i1] := double(zz3[i1]);
end;
// Выходной массив имеет недокументированную организацию,
// чтобы можно было сразу отображать результат
Result := 0;
В общем, так как это сделано в Mathcad, думаю, что делать не надо. Не красиво.
Россия навсегда!
Вячеслав Мезенцев
#2 Posted: 6/4/2009 3:37:32 PM
Хотя, я конечно сомневаюсь, что в самом MC всё было так, скорее всего объекты "деградировали" до структур именно для организации упрощённого интерфейса с MC, но с другой стороны сами данные по-моему не копировались. Т.е. если я создам миллионный массив чисел, то не имеет особого смысла ворочать повторно его в памяти при передаче из пользовательской библиотеки. Классы наверное там есть. У Вас видимо тоже есть некие классы.
Просьба писать эти классы с закладкой на будущее. В ячейках матрицы могут быть: функции, строки, другие матрицы, кусок программы... короче не комплексное число, а то же выражение, только в частном (подавляющем) случае являющимся числом
Вот тока не знаю как покомпактнее это разместить и надо ли. Лично я довольно часто в MC пользовался вложенными массивами, т.к. они используются при отрисовке (задании) 3D объектов.
Просьба писать эти классы с закладкой на будущее. В ячейках матрицы могут быть: функции, строки, другие матрицы, кусок программы... короче не комплексное число, а то же выражение, только в частном (подавляющем) случае являющимся числом

Вот тока не знаю как покомпактнее это разместить и надо ли. Лично я довольно часто в MC пользовался вложенными массивами, т.к. они используются при отрисовке (задании) 3D объектов.
Россия навсегда!
Вячеслав Мезенцев
#3 Posted: 6/4/2009 4:26:59 PM
Вот ещё пример из одной сишной библиотеки. Эта библиотека содержала функцию по отрисовке неявной поверхности по методу марширующих кубов 33. На вход функции подавались некие промежуточные данные, посчитанные в MC, а на выходе функции мы уже получали набор координат треугольников для рисования 3D объекта в MC. Здесь уже я чуть дополнил описание вложенности:А вот и кусок кода:
В общем и целом, я мало встречал народа, кто писал что-нить в виде пользовательских библиотек для MC. Сам знаю только двоих по всей России. Плюс я, итого 3 человека
Из этих троих один маньяк сделал интерфейс на Дельфи, т.к. видимо Си не любил (нее, это не я). Всё работало.
typedef struct
{
DWORD dwType;
char * str;
} EXTPTR, *PEXTPTR;
typedef struct
{
PEXTPTR pMCType;
DWORD dwMark;
} EXTCELL, *PEXTCELL;
typedef struct
{
DWORD dwType; // тип расширенного содержимого
DWORD dwUnknown1;
DWORD dwBytesSize;// размер реальной (мнимой) части в байтах
DWORD dwUnknown2;
double* pReal; // pReal[...], == NULL когда реальная часть равна нулю
double* pImag; // pImag[...], == NULL когда мнимая часть равна нулю
DWORD dwRows;
DWORD dwCols;
DWORD dwUnknown3;
DWORD dwUnknown4;
DWORD dwUnknown5;
DWORD dwUnknown6;
} EXTCMPLXARR, *PEXTCMPLXARR;
LRESULT mcad_implicitplot3d( LPCOMPLEXARRAY Out, LPCCOMPLEXARRAY In)
{
int strmark, rows, cols;
PEXTCELL ptr;
PEXTCMPLXARR m_pExtCmplxArr;
int i;
double xmin, ymin, zmin, xmax, ymax, zmax, dx, dy, dz, nx, ny, nz;
// Первый параметр - coords()
ptr = (PEXTCELL)(PDWORD)In->hReal[0];
strmark = int(~ptr->dwMark);
if (strmark == 0) {
if (ptr->pMCType->dwType == 0x05) {
m_pExtCmplxArr = ( PEXTCMPLXARR ) ptr->pMCType;
xmax = m_pExtCmplxArr->pReal[0]; xmin = m_pExtCmplxArr->pReal[1];
ymax = m_pExtCmplxArr->pReal[2]; ymin = m_pExtCmplxArr->pReal[3];
zmax = m_pExtCmplxArr->pReal[4]; zmin = m_pExtCmplxArr->pReal[5];
}
}
// Второй параметр - grids()
ptr = (PEXTCELL)(PDWORD) (In->hReal[0] + 1);
strmark = int(~ptr->dwMark);
if (strmark == 0) {
if (ptr->pMCType->dwType == 0x05) {
m_pExtCmplxArr = ( PEXTCMPLXARR ) ptr->pMCType;
nx = m_pExtCmplxArr->pReal[0];
ny = m_pExtCmplxArr->pReal[1];
nz = m_pExtCmplxArr->pReal[2];
rows = m_pExtCmplxArr->dwRows;
cols = m_pExtCmplxArr->dwCols;
if ( ( rows == 3 ) && ( cols == 1 ) ) {
mc.set_resolution( (int) nx, (int) ny, (int) nz );
}
}
}
// Расчёт дельт
dx = (xmax - xmin) / nx;
dy = (ymax - ymin) / ny;
dz = (zmax - zmin) / nz;
// Инициализация
mc.init_all() ;
// Импорт данных из Mathcad (Третий параметр)
compute_data( mc, (PEXTCELL)(PDWORD)(In->hReal[0] + 2) ) ;
// Расчёт
mc.run() ;
mc.clean_temps() ;
// Экспорт данных в Mathcad
// Чтобы отрисовать треугольники нужно создать вектор из
// трёх элементов, каждый элемент содержит массив
// координат, соответственно X, Y, Z.
MathcadArrayAllocate(Out, 3, 1, TRUE, FALSE);
// -=[ Вставляем массив координат X ]=-
ptr = (PEXTCELL) & Out->hReal[0][0];
ptr->dwMark = (DWORD) (-1);
// Выделяем память под заголовок расширенного массива
//m_pExtCmplxArr = (PEXTCMPLXARR) malloc( sizeof(EXTCMPLXARR) / sizeof(char) );
m_pExtCmplxArr = (PEXTCMPLXARR) MathcadAllocate( sizeof(EXTCMPLXARR) / sizeof(char) );
// Заполняем структуру расширенного массива
m_pExtCmplxArr->dwType = 0x05; // тип - расширенный комплексный массив
m_pExtCmplxArr->dwUnknown1 = 2; // здесь должно быть число не менее 5 (или количество строк)
m_pExtCmplxArr->dwBytesSize = 2 * 4 * mc._ntrigs * sizeof(double); // размер массива в байтах
m_pExtCmplxArr->dwUnknown2 = 0;
//m_pExtCmplxArr->pReal = (double *) malloc(m_pExtCmplxArr->dwBytesSize);
m_pExtCmplxArr->pReal = (double *) MathcadAllocate(m_pExtCmplxArr->dwBytesSize);
m_pExtCmplxArr->pImag = NULL;
m_pExtCmplxArr->dwRows = 2; // количество строк
m_pExtCmplxArr->dwCols = 4 * mc._ntrigs; // количество столбцов
m_pExtCmplxArr->dwUnknown3 = 0x03;
m_pExtCmplxArr->dwUnknown4 = 0x06;
// Подцепляем её к элементу массива
ptr->pMCType = (PEXTPTR) m_pExtCmplxArr;
// В расширенном массиве столбцы расположены в памяти
// один за другим
for ( i = 0; i < mc._ntrigs; i++ ) {
m_pExtCmplxArr->pReal[0 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].x * dx + xmin ;
m_pExtCmplxArr->pReal[1 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].x * dx + xmin ;
m_pExtCmplxArr->pReal[2 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].x * dx + xmin ;
m_pExtCmplxArr->pReal[3 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].x * dx + xmin ;
m_pExtCmplxArr->pReal[4 + i*8] = (double) mc._vertices[ mc._triangles[i].v2 ].x * dx + xmin ;
m_pExtCmplxArr->pReal[5 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].x * dx + xmin ;
m_pExtCmplxArr->pReal[6 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].x * dx + xmin ;
m_pExtCmplxArr->pReal[7 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].x * dx + xmin ;
}
// -=[ Вставляем массив координат Y ]=-
ptr = (PEXTCELL) & Out->hReal[0][1];
ptr->dwMark = (DWORD) (-1);
// Выделяем память под заголовок расширенного массива
//m_pExtCmplxArr = (PEXTCMPLXARR) malloc( sizeof(EXTCMPLXARR) / sizeof(char) );
m_pExtCmplxArr = (PEXTCMPLXARR) MathcadAllocate( sizeof(EXTCMPLXARR) / sizeof(char) );
// Заполняем структуру расширенного массива
m_pExtCmplxArr->dwType = 0x05; // тип - расширенный комплексный массив
m_pExtCmplxArr->dwUnknown1 = 2; // здесь должно быть число не менее 5
m_pExtCmplxArr->dwBytesSize = 2 * 4 * mc._ntrigs * sizeof(double); // размер массива в байтах
m_pExtCmplxArr->dwUnknown2 = 0;
//m_pExtCmplxArr->pReal = (double *) malloc(m_pExtCmplxArr->dwBytesSize);
m_pExtCmplxArr->pReal = (double *) MathcadAllocate(m_pExtCmplxArr->dwBytesSize);
m_pExtCmplxArr->pImag = NULL;
m_pExtCmplxArr->dwRows = 2; // количество строк
m_pExtCmplxArr->dwCols = 4 * mc._ntrigs; // количество столбцов
m_pExtCmplxArr->dwUnknown3 = 0x03;
m_pExtCmplxArr->dwUnknown4 = 0x06;
// Подцепляем её к элементу массива
ptr->pMCType = (PEXTPTR) m_pExtCmplxArr;
// В расширенном массиве столбцы расположены в памяти
// один за другим
for ( i = 0; i < mc._ntrigs; i++ ) {
m_pExtCmplxArr->pReal[0 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].y * dy + ymin ;
m_pExtCmplxArr->pReal[1 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].y * dy + ymin ;
m_pExtCmplxArr->pReal[2 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].y * dy + ymin ;
m_pExtCmplxArr->pReal[3 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].y * dy + ymin ;
m_pExtCmplxArr->pReal[4 + i*8] = (double) mc._vertices[ mc._triangles[i].v2 ].y * dy + ymin ;
m_pExtCmplxArr->pReal[5 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].y * dy + ymin ;
m_pExtCmplxArr->pReal[6 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].y * dy + ymin ;
m_pExtCmplxArr->pReal[7 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].y * dy + ymin ;
}
// -=[ Вставляем массив координат Z ]=-
ptr = (PEXTCELL) & Out->hReal[0][2];
ptr->dwMark = (DWORD) (-1);
// Выделяем память под заголовок расширенного массива
//m_pExtCmplxArr = (PEXTCMPLXARR) malloc( sizeof(EXTCMPLXARR) / sizeof(char) );
m_pExtCmplxArr = (PEXTCMPLXARR) MathcadAllocate( sizeof(EXTCMPLXARR) / sizeof(char) );
// Заполняем структуру расширенного массива
m_pExtCmplxArr->dwType = 0x05; // тип - расширенный комплексный массив
m_pExtCmplxArr->dwUnknown1 = 2; // здесь должно быть число не менее 5
m_pExtCmplxArr->dwBytesSize = 2 * 4 * mc._ntrigs * sizeof(double); // размер массива в байтах
m_pExtCmplxArr->dwUnknown2 = 0;
//m_pExtCmplxArr->pReal = (double *) malloc(m_pExtCmplxArr->dwBytesSize);
m_pExtCmplxArr->pReal = (double *) MathcadAllocate(m_pExtCmplxArr->dwBytesSize);
m_pExtCmplxArr->pImag = NULL;
m_pExtCmplxArr->dwRows = 2; // количество строк
m_pExtCmplxArr->dwCols = 4 * mc._ntrigs; // количество столбцов
m_pExtCmplxArr->dwUnknown3 = 0x03;
m_pExtCmplxArr->dwUnknown4 = 0x06;
// Подцепляем её к элементу массива
ptr->pMCType = (PEXTPTR) m_pExtCmplxArr;
// В расширенном массиве столбцы расположены в памяти
// один за другим
for ( i = 0; i < mc._ntrigs; i++ ) {
m_pExtCmplxArr->pReal[0 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].z * dz + zmin ;
m_pExtCmplxArr->pReal[1 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].z * dz + zmin ;
m_pExtCmplxArr->pReal[2 + i*8] = (double) mc._vertices[ mc._triangles[i].v1 ].z * dz + zmin ;
m_pExtCmplxArr->pReal[3 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].z * dz + zmin ;
m_pExtCmplxArr->pReal[4 + i*8] = (double) mc._vertices[ mc._triangles[i].v2 ].z * dz + zmin ;
m_pExtCmplxArr->pReal[5 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].z * dz + zmin ;
m_pExtCmplxArr->pReal[6 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].z * dz + zmin ;
m_pExtCmplxArr->pReal[7 + i*8] = (double) mc._vertices[ mc._triangles[i].v3 ].z * dz + zmin ;
}
// Освобождение памяти
mc.clean_all() ;
return 0;
}

Россия навсегда!
Вячеслав Мезенцев
1 Pages (3 items)
-
New Posts
-
No New Posts