Программирование для STATISTICA на C++
COM-архитектура STATISTICA открывает доступ к библиотеки функций, который можно реализовать при помощи таких языков программирования как: Borland Delphi, Visual Basic, C#, и C++. В случае C++, разработчики могут интегрировать Объектную Модель STATISTICA также как и библиотеки Microsoft Foundation Classes, Стандартные библиотеки C++, и Standard Template Library. Например, алгоритмы и функции библиотек STL можно достаточно легко объеденить с библиотеками STATISTICA в пользовательском приложении.
Надстройки. Наиболее часто встречающийся случай использования C++ и библиотек STATISTICA является создание пользовательской динамической библиотеки (*.dll). Используя Active Template Library совместно с COM архитетурой STATISTICA, вы можете создать свой собственный интерфейс, который в дальнейшем может быть интегрирован в STATISTICA.
Производительность. Другой часто встречающийся случай использования C++ в пользовательском приложении STATISTICA, является увеличение скорости производительности программ. Связано это со возможностями C/C++.
Данный пример демонстрирует способ запуска приложения STATISTICA, настройки электронной таблицы и анализа основных статистик.
/*В данном примере мы вычислим размер доступной и свободной памяти
(физической памяти, страничной и виртуальной). Далее,
запустим описательные статистики для двух переменных (вся имеющаяся память и доступная).
И в конце итоги сохраним в таблице.*/
//Windows включения
#include <windows.h>
#include <comdef.h> //необходимо для COM
/*Директива "#import" импортирует описание классов выбранного файла.
В нашем случае, файл "statist.exe" открывает нам доступ к
интерфейсу и библиотекам документов STATISTICA. Для этого вам необходимо будет переписать
этот файл в вашу директорию проекта или вручную ввести полный путь к нему
в директиве #import. Замечание,
"#import" в Visual C++ является стандартной директивой,
если вы используете другой компилятор, то советуем вам внимательно ознакомится
с документацией к нему: каким образом происходит импортирование COM интерфейсов.*/
#import "statist.exe"
#import "sta_bas.dll"
//Исключение
редко используемые заголовки Windows
#define WIN32_LEAN_AND_MEAN
//окончание Windows включений
#define MEGABYTE 1048576 //2^20
#include <cstdio>
using namespace STATISTICA;
using namespace STABasicStatistics;
int main()
{
//получение информации о текущей памяти
MEMORYSTATUS Memory;
::GlobalMemoryStatus (&Memory);
//Физическая память
long TotalPhyMem = static_cast<long>(Memory.dwTotalPhys/MEGABYTE);
long FreePhyMem = static_cast<long>(Memory.dwAvailPhys/MEGABYTE);
//Страничная память
long TotalPageFile = static_cast<long>(Memory.dwTotalPageFile/MEGABYTE);
long FreePageFile = static_cast<long>(Memory.dwAvailPageFile/MEGABYTE);
//Виртуальная память
long TotalVirtMem = static_cast<long>(Memory.dwTotalVirtual/MEGABYTE);
long FreeVirtMem = static_cast<long>(Memory.dwAvailVirtual/MEGABYTE);
long TotalAvailMem = TotalPhyMem + TotalPageFile
+ TotalVirtMem;
long TotalFreeMem = FreePhyMem + FreePageFile + FreeVirtMem;
//Запуск STATISTICA
//Инициализация COM
::CoInitialize(NULL);
STATISTICA::_ApplicationPtr pApp;
//инициализация нового объекта STATISTICA через COM
HRESULT hr = ::CoCreateInstance(__uuidof(STATISTICA::Application),NULL,CLSCTX_SERVER,
__uuidof(STATISTICA::_Application),reinterpret_cast<void**>(&pApp));
//проверка возможности COM создания приложения STATISTICA
if (FAILED(hr))
{
::MessageBox(NULL,"Unable to intialize STATISTICA",
"Initialization Failure",MB_ICONHAND);
return EXIT_FAILURE;
}
try
{
//создание новой электронной таблицы под названием "Current Memory"
_SpreadsheetPtr pSpreadSheet = pApp->Spreadsheets->New("Current
Memory");
pSpreadSheet->Header->PutValue("Total and Available Computer
Memory");
//увеличение ширины наблюдений
pSpreadSheet->PutCaseNameWidth(1.5);
//переименовываем первые две переменных
pSpreadSheet->PutVariableName(1,"Total");
pSpreadSheet->PutVariableName(2,"Available");
//переименовываем первых три наблюдения
pSpreadSheet->PutCaseName(1,"Physical Memory");
pSpreadSheet->PutCaseName(2,"Page File Memory");
pSpreadSheet->PutCaseName(3,"Virtual Memory");
//заполнение электронной таблицы вычисленными данными
pSpreadSheet->PutValue(1,1,TotalPhyMem);
pSpreadSheet->PutValue(1,2,FreePhyMem);
pSpreadSheet->PutValue(2,1,TotalPageFile);
pSpreadSheet->PutValue(2,2,FreePageFile);
pSpreadSheet->PutValue(3,1,TotalVirtMem);
pSpreadSheet->PutValue(3,2,FreeVirtMem);
//удаление лишних переменных и наблюдений
pSpreadSheet->DeleteVariables(3,10);
pSpreadSheet->DeleteCases(4,10);
pSpreadSheet->Visible = true;
//запуск описательных статистик по нашим данным
_AnalysisPtr pBasDiag = pApp->Analysis(scBasicStatistics);
pBasDiag->Run();
BasDescriptiveStatisticsPtr pBasDesc = pBasDiag->Dialog;
//анализ переменных
pBasDesc->PutVariables("1 2");
//все статистики кроме стан. откл.
pBasDesc->StandardDeviation = false;
//также включаем суммы, размахи и медианы
pBasDesc->Sum = true;
pBasDesc->Range = true;
pBasDesc->Median = true;
//process the analysis output
pBasDiag->GetRouteOutput(pBasDesc->Summary.GetInterfacePtr())->PutVisible(true);
pBasDiag->Close();
//включаем наши статистики в таблицу
pSpreadSheet->AddCases(3,1);
pSpreadSheet->PutCaseName(4,"Totals:");
pSpreadSheet->PutValue(4,1,TotalAvailMem);
pSpreadSheet->PutValue(4,2,TotalFreeMem);
}
catch(_com_error Err)
{
::MessageBox(NULL,Err.Description(),pApp->Name,MB_ICONHAND);
return EXIT_FAILURE;
}
//очистка после инициализации COM
pApp.Release();
::CoUninitialize();
return EXIT_SUCCESS;
}
(c) Copyright StatSoft, Inc., 1984-2003
STATISTICA является торговой маркой StatSoft, Inc.