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

Тема в разделе "MS Visual C++", создана пользователем mirmikot, 13 сен 2014.

  1. mirmikot

    mirmikot New Member

    Регистрация:
    13 сен 2014
    Сообщения:
    1
    Симпатии:
    0
    Здравствуйте!

    Помогите пожалуйста исправить ошибку 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);
    }
     

Поделиться этой страницей