C++/CLI & error C4368
От: HunteX http://troyashka.ru/
Дата: 05.02.11 07:33
Оценка:
Всем привет! Проблема такая:
Мне необходимо хранить двумерный массив ...
Есть библиотека на C++/CLI:

public ref class MyClass
    {
        ref struct GlobalStruct
        {
            static int corners[4][2];
        };

        GlobalStruct ^globalV;

        ... различные функции ...

    };


Код не компилируется — вылезает следующая ошибко:

error C4368: не удается определить "corners" как член управляемого "MyProject::MyClass::GlobalStruct": смешанные типы не поддерживаются


Да и обязательно объявлять статичное поле (static) ... может есть варианты обойтись без него?
Re: C++/CLI & error C4368
От: Pavel Dvorkin Россия  
Дата: 05.02.11 13:27
Оценка:
Здравствуйте, HunteX, Вы писали:

HX>Всем привет! Проблема такая:

HX>Мне необходимо хранить двумерный массив ...
HX>Есть библиотека на C++/CLI:

HX>
HX>public ref class MyClass
HX>    {
HX>        ref struct GlobalStruct
HX>        {
HX>            static int corners[4][2];
HX>        };

HX>        GlobalStruct ^globalV;

HX>        ... различные функции ...

HX>    };
HX>


HX>Код не компилируется — вылезает следующая ошибко:


HX>
HX>error C4368: не удается определить "corners" как член управляемого "MyProject::MyClass::GlobalStruct": смешанные типы не поддерживаются
HX>


Так ясно же в MSDN сказано :

You cannot embed a native data member in a CLR type.

You can, however, declare a pointer to a native type and control its lifetime in the constructor and destructor and finalizer of your managed class (see Destructors and Finalizers in Visual C++ for more information).
With best regards
Pavel Dvorkin
Re[2]: C++/CLI & error C4368
От: HunteX http://troyashka.ru/
Дата: 07.02.11 06:04
Оценка:
А пример можно ?
Re[3]: C++/CLI & error C4368
От: Pavel Dvorkin Россия  
Дата: 07.02.11 06:33
Оценка:
Здравствуйте, HunteX, Вы писали:

HX>А пример можно ?


В MSDN по индексу C4368
With best regards
Pavel Dvorkin
Re[4]: C++/CLI & error C4368
От: HunteX http://troyashka.ru/
Дата: 07.02.11 11:33
Оценка:
а всё же можно пример, применительно к моей ситуации ...
Re[5]: C++/CLI & error C4368
От: Pavel Dvorkin Россия  
Дата: 07.02.11 12:28
Оценка:
Здравствуйте, HunteX, Вы писали:

HX>а всё же можно пример, применительно к моей ситуации ...


Так в MSDN'овском примере именно твоя ситуация. Нельзя в ref-структуру помещать нативные данные, вот и все.

У тебя

ref struct GlobalStruct
{
static int corners[4][2]; };


а в MSDN

ref struct R {
R() : m_p( new N ) {}
~R() { delete m_p; }

property N prop; // C4368
int i[10]; // C4368

static или нет — не важно, видимо.
With best regards
Pavel Dvorkin
Re[6]: C++/CLI & error C4368
От: HunteX http://troyashka.ru/
Дата: 07.02.11 14:03
Оценка:
struct unm // error C2814: MyProject::IJ::unm: собственный тип не может быть вложенным в управляемом типе "MyProject::IJ"
{
    static int dst_corners[4][2];
};

ref struct GlobalVars
{
    GlobalVars(): m_p (new unm) {} // error C2614: MyProject::IJ::GlobalVars: недопустимая инициализация члена: "m_p" не является базовым классом или членом
    ~GlobalVars() { delete m_p; } // error C2065: m_p: необъявленный идентификатор // error C2541: delete: нельзя удалять объекты, не являющиеся указателями

    static IplImage * object = 0;
    static IplImage * image = 0;
    static IplImage * newImg = 0;

    static char * objectPath = 0;
    static char * imagePath = 0;

    static CvMat * homo = 0;
};

GlobalVars ^globalV;


Насколько я понимаю конструктор GlobalVars() наследуется от m_p, зачем это я не совсем понимаю ... MSDN отличается замудренностью некоторых примеров (((
p.s. а можно просто написать код, потому что я новичек в C++, а C++/CLI мне вообще его очень тяжело сейчас осилить
Re[7]: C++/CLI & error C4368
От: Pavel Dvorkin Россия  
Дата: 07.02.11 14:34
Оценка:
Здравствуйте, HunteX, Вы писали:

HX>
HX>struct unm // error C2814: MyProject::IJ::unm: собственный тип не может быть вложенным в управляемом типе "MyProject::IJ"
HX>{
HX>    static int dst_corners[4][2];
HX>};

HX>ref struct GlobalVars
HX>{
HX>    GlobalVars(): m_p (new unm) {} // error C2614: MyProject::IJ::GlobalVars: недопустимая инициализация члена: "m_p" не является базовым классом или членом
HX>    ~GlobalVars() { delete m_p; } // error C2065: m_p: необъявленный идентификатор // error C2541: delete: нельзя удалять объекты, не являющиеся указателями

HX>    static IplImage * object = 0;
HX>    static IplImage * image = 0;
HX>    static IplImage * newImg = 0;

HX>    static char * objectPath = 0;
HX>    static char * imagePath = 0;

HX>    static CvMat * homo = 0;
HX>};

HX>GlobalVars ^globalV;
HX>


HX>Насколько я понимаю конструктор GlobalVars() наследуется от m_p,


Конструктор никогда не наследуется. Это лишь, должно быть, инициализация поля m_p в конструкторе. Точнее сказать не могу, описания m_p не вижу.

>зачем это я не совсем понимаю ... MSDN отличается замудренностью некоторых примеров (((


Не обижайся, но дело не в MSDN, а действительно в твоем незнании С++. Надо сначала его освоить, а потом уж браться за CLI приложения.


HX>p.s. а можно просто написать код, потому что я новичек в C++, а C++/CLI мне вообще его очень тяжело сейчас осилить


Понимаешь, все не так просто. В CLI ссылочная модель, поэтому "просто данные" (те же массивы) описывать внутри класса нельзя.
With best regards
Pavel Dvorkin
Re[8]: C++/CLI & error C4368
От: HunteX http://troyashka.ru/
Дата: 07.02.11 14:54
Оценка:
HX>>Насколько я понимаю конструктор GlobalVars() наследуется от m_p,
PD>Конструктор никогда не наследуется. Это лишь, должно быть, инициализация поля m_p в конструкторе. Точнее сказать не могу, описания m_p не вижу.
>>зачем это я не совсем понимаю ... MSDN отличается замудренностью некоторых примеров (((
PD>Не обижайся, но дело не в MSDN, а действительно в твоем незнании С++. Надо сначала его освоить, а потом уж браться за CLI приложения.
HX>>p.s. а можно просто написать код, потому что я новичек в C++, а C++/CLI мне вообще его очень тяжело сейчас осилить
PD>Понимаешь, все не так просто. В CLI ссылочная модель, поэтому "просто данные" (те же массивы) описывать внутри класса нельзя.

Тогда такой вопрос: КАК и ГДЕ мне хранить данные по ходу работы программы. Типы, которые я использую — неуправляемые. Мне нужно ПРОСТО хранить эти данные по ходу работы программы, чтобы эти данные были глобальными и могли использоваться в различных функциях. В C++ с этим проблем нет, так как весь код неуправляемый и подобных ошибок нет — там все интуитивно понятно (насчет наследования я ступил — не спорю, просто кодю на C# )
Хочу реализовать примерно следующее:

/clr

Структура
{
   ГлобальныйНеуправляемыйТипДанных;
}

Структура МояСуперКрутаяСтруктура;

void foo1()
{
    ГлобальныйНеуправляемыйТипДанных = 1;
}

void foo2()
{
    cout << ГлобальныйНеуправляемыйТипДанных; // вывод 1
}

void main()
{
    foo1();
    foo2();
}


Как это реализовать на C++/CLI ? Может быть я не совсем правильно написал это жалкое подобие псевдокода, но моя задача состоит в хранении данных по ходу работы программы, чтобы эти данные были глобальными и могли использоваться в различных функциях!

p.s. возможно это кажется глупо, но мне сейчас необходимо быстро реализовать библиотеку на C++/CLI. Библиотека почти готова, а я ТУПО ВСТРЯЛ на особенностях C++/CLI (все из-за того, что решил из одной функции сделать десять). Если я реализую данный модуль (а осталось всего-ничего), я покажу его заказчику, а после возьмусь за изучение C++ & C++/CLI. По C# у меня не возникает настолько глупых вопросов
Re[9]: C++/CLI & error C4368
От: Pavel Dvorkin Россия  
Дата: 07.02.11 15:06
Оценка:
Здравствуйте, HunteX, Вы писали:

HX>Тогда такой вопрос: КАК и ГДЕ мне хранить данные по ходу работы программы. Типы, которые я использую — неуправляемые. Мне нужно ПРОСТО хранить эти данные по ходу работы программы, чтобы эти данные были глобальными и могли использоваться в различных функциях. В C++ с этим проблем нет, так как весь код неуправляемый и подобных ошибок нет — там все интуитивно понятно (насчет наследования я ступил — не спорю, просто кодю на C# )


Скорее всего надо идти вот по какому пути

You can, however, declare a pointer to a native type and control its lifetime in the constructor and destructor and finalizer of your managed class (see Destructors and Finalizers in Visual C++ for more information).

То есть вместо этого массива надо определить указатель на него и выделять память в кострукторе с помощью gcnew . Это будет аналогом ссылок C#.

Либо оставить эти типы неуправляемыми, но тогда надо смотреть, как из управляемого кода добраться к неуправляемым переменным.

Точнее сказать не могу, так как этим не занимался.
With best regards
Pavel Dvorkin
Re[10]: C++/CLI & error C4368
От: HunteX http://troyashka.ru/
Дата: 07.02.11 15:07
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, HunteX, Вы писали:


HX>>Тогда такой вопрос: КАК и ГДЕ мне хранить данные по ходу работы программы. Типы, которые я использую — неуправляемые. Мне нужно ПРОСТО хранить эти данные по ходу работы программы, чтобы эти данные были глобальными и могли использоваться в различных функциях. В C++ с этим проблем нет, так как весь код неуправляемый и подобных ошибок нет — там все интуитивно понятно (насчет наследования я ступил — не спорю, просто кодю на C# )


PD>Скорее всего надо идти вот по какому пути


PD>You can, however, declare a pointer to a native type and control its lifetime in the constructor and destructor and finalizer of your managed class (see Destructors and Finalizers in Visual C++ for more information).


PD>То есть вместо этого массива надо определить указатель на него и выделять память в кострукторе с помощью gcnew . Это будет аналогом ссылок C#.


PD>Либо оставить эти типы неуправляемыми, но тогда надо смотреть, как из управляемого кода добраться к неуправляемым переменным.


PD>Точнее сказать не могу, так как этим не занимался.


Окей! Огромное спасибо! Буду копать ))
Re: C++/CLI & error C4368
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 09.02.11 15:39
Оценка:
Здравствуйте, HunteX, Вы писали:

HX>Всем привет! Проблема такая:

HX>Мне необходимо хранить двумерный массив ...
HX>Есть библиотека на C++/CLI:

В managed code лучше использовать managed массивы.
Первая ссылка в гугле по запросу C++/CLI array: http://www.codeproject.com/KB/mcpp/cppcliarrays.aspx

Встречный вопрос, почему C++/CLI а не C#? Обычно C#, Nemerle, VB.NET, F# для .NET. С++ для native code. А C++/CLI для тех кто делает смешанные assembly или портирует с C++ на .NET (флаг ему в руки). Для использования C++/CLI нужны отличные знания C++ и .NET.
getboost.codeplex.com
citylizard.codeplex.com
Re[2]: C++/CLI & error C4368
От: HunteX http://troyashka.ru/
Дата: 09.02.11 16:16
Оценка: 1 (1)
Здравствуйте, sergey_shandar, Вы писали:

_>Здравствуйте, HunteX, Вы писали:


HX>>Всем привет! Проблема такая:

HX>>Мне необходимо хранить двумерный массив ...
HX>>Есть библиотека на C++/CLI:

_>В managed code лучше использовать managed массивы.

_>Первая ссылка в гугле по запросу C++/CLI array: http://www.codeproject.com/KB/mcpp/cppcliarrays.aspx

_>Встречный вопрос, почему C++/CLI а не C#? Обычно C#, Nemerle, VB.NET, F# для .NET. С++ для native code. А C++/CLI для тех кто делает смешанные assembly или портирует с C++ на .NET (флаг ему в руки). Для использования C++/CLI нужны отличные знания C++ и .NET.


Спасибо за ссылку, но я перешел на чистый C++ ... просто мне действительно не хватает знаний С++, а C++/CLI — тем более
В своем проекте я использую библиотеку OpenCV, а она только под C++, хотя и есть враппер под .NET, но он мне не нравится. Вот решил ядро сделать на C++/CLI, а оболочку на C# ... но я реально запарился с C++/CLI ... в итоге и ядро и оболочку напишу на C++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.