Еrror C2230 Visual C++ .net 2003, Неуправляемый Тип Данных (non-manage

mirmikot

New Member
13.09.2014
1
0
#1
Здравствуйте!

Помогите пожалуйста исправить ошибку error C2230: 'GenerateRandomHReal' : a member function of a managed class cannot return a non-managed class or struct 'HReal' unless it is an aggregate

Пишу проект на базе Windows Form Application .NET в Microsoft Visual C++ .NET 2003. Логика программы реализуется прямо в файле класса формы Form1.h (я понимаю, не очень правильно, но это детали). Программа по нажатию кнопки заполняет матрицы случайными числами и выполняет некие расчеты. Есть сторонняя математическая библиотека, написанная на неуправляемом (non-managed) С++. В этой библиотеке описан тип данных (повышенной точности) HReal. Получается, что как бы в управляемом С++ (__gc class Form1) используется функция-метод, которая принимает аргументы и возвращает значение неуправляемого типа HReal. Вот и выдается такая ошибка. Но как ее исправить???

Я читала, наткнулась на такие понятия как 1.шаблонный класс gcroot <ТИП>, структура GCHandle, 2. написание Wrappera для класса, 3. использование директив # pragma managed и # pragma unmanaged для совмещения в одном модуле управляемого и неуправляемого С++.

Подскажите, как исправить может быть используя приведенные выше понятия? Или я ищу в неправильном направлении??? Подскажите пожалуйста! Спасибо!

C++:
#include <string.h>
#include <cstringt.h>
#include <afxwin.h>

#using <mscorlib.dll>

#pragma once

namespace SolveSLAU
{
using namespace std;
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

public __gc class Form1 : public System::Windows::Forms::Form
{

// Глобальные переменные
private: bool IsButton1Pressed;
bool IsMatrixSet; // Флаг: "Матрица уже инициализирована?"
HReal **A01, **A02, *B01, *B02, *X1_2, *X2_1;

double Eps; // Точность расчетов Эпсилон
int m1, m2, n0;
int MantissPrecision; // Точность мантиссы

private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{

int n = 0, i,j;
HReal ** A1, ** A2, *X1;
HReal * B1, * B2, *X2;
HReal alfa_0, alfa_1;
CString myStr1(""); 
CString myStr2("");
CString myStr3("");
CString myStr0("");
CString myspace(" ");

MantissPrecision = System::Int32::Parse(this->textBox1->Text);

Eps = System::Double::Parse(this->textBox2->Text);

*****
this->listBox6->Items->Add(System::Convert::ToString(myStr0));

X1[i] = GenerateRandomHReal(alfa_0, alfa_1, MantissPrecision);
X1_2[i] = GenerateRandomHReal(alfa_0, alfa_1, MantissPrecision);
myStr0.Format(_T("%lf\n"), X1[i] );
this->listBox2->Items->Add(System::Convert::ToString(myStr0));

X2[i] = GenerateRandomHReal(alfa_0, alfa_1, MantissPrecision);
X2_1[i] = GenerateRandomHReal(alfa_0, alfa_1, MantissPrecision);
myStr0.Format(_T("%lf\n"), X2[i] );
this->listBox5->Items->Add(System::Convert::ToString(myStr0));
}
}
else 
{

// -------------------- генератор ----------------
private: gcroot<HReal> GenerateRandomHReal(const gcroot<HReal> &a, const gcroot<HReal> &b, int MantissPrecision) // [a,b] - диапазон
{
CString s = "0.", s1;
int j;
for (int i = 0; i < MantissPrecision; i++)
{
j = rand() % 10;
s1.Format("%i", j);
s += s1;
}
HReal result(s);
return a + result * (b - a);
}