Здравствуйте, 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++
Здравствуйте, 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).
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 мне вообще его очень тяжело сейчас осилить
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 ссылочная модель, поэтому "просто данные" (те же массивы) описывать внутри класса нельзя.
HX>>Насколько я понимаю конструктор GlobalVars() наследуется от m_p, PD>Конструктор никогда не наследуется. Это лишь, должно быть, инициализация поля m_p в конструкторе. Точнее сказать не могу, описания m_p не вижу. >>зачем это я не совсем понимаю ... MSDN отличается замудренностью некоторых примеров ((( PD>Не обижайся, но дело не в MSDN, а действительно в твоем незнании С++. Надо сначала его освоить, а потом уж браться за CLI приложения. HX>>p.s. а можно просто написать код, потому что я новичек в C++, а C++/CLI мне вообще его очень тяжело сейчас осилить PD>Понимаешь, все не так просто. В CLI ссылочная модель, поэтому "просто данные" (те же массивы) описывать внутри класса нельзя.
Тогда такой вопрос: КАК и ГДЕ мне хранить данные по ходу работы программы. Типы, которые я использую — неуправляемые. Мне нужно ПРОСТО хранить эти данные по ходу работы программы, чтобы эти данные были глобальными и могли использоваться в различных функциях. В C++ с этим проблем нет, так как весь код неуправляемый и подобных ошибок нет — там все интуитивно понятно (насчет наследования я ступил — не спорю, просто кодю на C# )
Хочу реализовать примерно следующее:
Как это реализовать на C++/CLI ? Может быть я не совсем правильно написал это жалкое подобие псевдокода, но моя задача состоит в хранении данных по ходу работы программы, чтобы эти данные были глобальными и могли использоваться в различных функциях!
p.s. возможно это кажется глупо, но мне сейчас необходимо быстро реализовать библиотеку на C++/CLI. Библиотека почти готова, а я ТУПО ВСТРЯЛ на особенностях C++/CLI (все из-за того, что решил из одной функции сделать десять). Если я реализую данный модуль (а осталось всего-ничего), я покажу его заказчику, а после возьмусь за изучение C++ & C++/CLI. По C# у меня не возникает настолько глупых вопросов
Здравствуйте, 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#.
Либо оставить эти типы неуправляемыми, но тогда надо смотреть, как из управляемого кода добраться к неуправляемым переменным.
Точнее сказать не могу, так как этим не занимался.
Здравствуйте, 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>Точнее сказать не могу, так как этим не занимался.
Встречный вопрос, почему C++/CLI а не C#? Обычно C#, Nemerle, VB.NET, F# для .NET. С++ для native code. А C++/CLI для тех кто делает смешанные assembly или портирует с C++ на .NET (флаг ему в руки). Для использования C++/CLI нужны отличные знания C++ и .NET.