Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / unsafe c# / 19 сообщений из 19, страница 1 из 1
22.04.2014, 14:43
    #38621601
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Это развитие вот этой темы .
Изопропил
Код: plaintext
1.
2.
3.
4.
5.
6.
extern  "C" __declspec(dllexport) void __stdcall   MyFunc(int*sz, double ** p){
	// ну для примера
	*sz= 4;
	*p= static_cast<double*>(:: CoTaskMemAlloc((*sz)*sizeof(double)));	
	for (int i=0;i<*sz;i++) (*p)[i]=i;	
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    public unsafe class Tst
    {
        [DllImport(@"C:\data\TEST\Win32Project2\Debug\Win32Project2.dll")]
        public static extern int MyFunc(out int sz, out double * p);

        public   static double* test()
        {
            int sz;
            double* d;
            MyFunc(out sz, out d);
            double s=0;
            for (int i = 0; i < sz; i++) s += d[i];
            return d;                                 
    }

    public unsafe class Tst1
    {
        [DllImport(@"C:\data\TEST\Win32Project2\Debug\Win32Project2.dll")]
        public static extern int MyFunc(out int sz, out IntPtr  p);

        public   static IntPtr test()
        {
            IntPtr p;
            int sz;            
            MyFunc(out sz, out p);
            double* d = (double*)p.ToPointer();
            double s=0;
            for (int i = 0; i < sz; i++) s += d[i];
            return p;                       
    }


Поехали вопросы:
Зачем этот цикл?: for (int i = 0; i < sz; i++) s += d[i] .
Нужно, чтобы метод Test возвратил массив L типа double.
Если я напушу вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public static int Test(out double[] L)
{
            IntPtr p;
            int sz;            
            var info = MyFunc(out sz, out p);
            double* L = (double*)p.ToPointer();
            return info; 
}


Это нормально?
...
Рейтинг: 0 / 0
22.04.2014, 14:53
    #38621620
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Нет. Не нормально. Указатели могут быть использованы только в контексте unsafe. Как же поиметь массив L?
...
Рейтинг: 0 / 0
22.04.2014, 15:08
    #38621657
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Не надо unsafe...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[DllImport(@"C:\data\TEST\Win32Project2\Debug\Win32Project2.dll")]
public static extern int MyFunc(out int sz, out IntPtr p);

..........

int sz;
IntPtr p;
MyFunc(out sz, out p);

var a = new double[sz];
Marshal.Copy(p, a, 0, sz);

Marshal.FreeCoTaskMem(p);
...
Рейтинг: 0 / 0
22.04.2014, 15:17
    #38621669
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Если на С-стороне использовать COM Safe Array, на C#-стороне всё упростится.

Маршалинг по умолчанию для массивов
...
Рейтинг: 0 / 0
22.04.2014, 15:20
    #38621678
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
vlsafНет. Не нормально. Указатели могут быть использованы только в контексте unsafe. Как же поиметь массив L?
пометь все свои классы unsafe
...
Рейтинг: 0 / 0
22.04.2014, 15:21
    #38621679
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Алексей К,

в библиотеке - malloc , не выйдет
...
Рейтинг: 0 / 0
22.04.2014, 15:21
    #38621682
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Алексей К,

топикстартеру нужно без копирования
...
Рейтинг: 0 / 0
22.04.2014, 15:23
    #38621684
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
vlsafЗачем этот цикл?: for (int i = 0; i < sz; i++) s += d[i] .
просто так для примера
...
Рейтинг: 0 / 0
22.04.2014, 15:26
    #38621691
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
ИзопропилАлексей К,

топикстартеру нужно без копированияЕсли выделять память под массив на дотнетной стороне, полагаю, копирования не будет?

Код: c#
1.
2.
var a= new double[123];
MyCFunc(a);


?
...
Рейтинг: 0 / 0
22.04.2014, 15:28
    #38621694
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Алексей КЕсли выделять память под массив на дотнетной стороне, полагаю, копирования не будет?
предлагалось - не годится ( Создание одномерного массива типа double размерности N )
...
Рейтинг: 0 / 0
22.04.2014, 15:31
    #38621699
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
vlsaf
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public static int Test(out double[] L)
{
            IntPtr p;
            int sz;            
            var info = MyFunc(out sz, out p);
            double* L = (double*)p.ToPointer();
            return info; 
}



Это нормально?
Это не может быть нормально - double* L скроет параметр
...
Рейтинг: 0 / 0
22.04.2014, 15:40
    #38621718
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
ИзопропилvlsafНет. Не нормально. Указатели могут быть использованы только в контексте unsafe. Как же поиметь массив L?
пометь все свои классы unsafeПолучается что так. Может лучше скопировать? Неужели там так много?
...
Рейтинг: 0 / 0
22.04.2014, 15:49
    #38621744
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
ИзопропилАлексей К,

в библиотеке - malloc , не выйдеток
...
Рейтинг: 0 / 0
22.04.2014, 16:00
    #38621773
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Алексей КПолучается что так. Может лучше скопировать? Неужели там так много?
грят - долго http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1089889&msg=15902770
...
Рейтинг: 0 / 0
22.04.2014, 16:29
    #38621836
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Изопропил, как быть с памятью, которая выделяется на С++ в нативном коде? Надо ее освобождать через Marshal.FreeCoTaskMem(p)? Хотя это уже будет после всех расчетов, даже пока не знаю где. Где-то в одной из секций unsafe{...}. Верно? Есть какие-то ходы, которые позволяют не следить за памятью. Например С++ код у нас прописан статическим, значит от вызова к вызову переменные в нем сохраняет свои значения. Можно-ли в коде на С++ следить за памятью? И перед CoTaskMemAlloc, если там что-то было , то освободить?
...
Рейтинг: 0 / 0
22.04.2014, 16:35
    #38621848
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
vlsafИзопропил, как быть с памятью, которая выделяется на С++ в нативном коде?
для используемой библиотеки, как я понял, нужно вызывать (раздел 2.2 документации)
SUPERLU_FREE ()
Destroy_CompCol_Matrix()
Destroy_SuperMatrix_Store()
Destroy_SuperNode_Matrix()
StatFree()


PS CoTaskMemAlloc библиотекой не используется
...
Рейтинг: 0 / 0
22.04.2014, 16:48
    #38621863
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Использует С++ оболочка над этой библиотекой. Вот твой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
extern  "C" __declspec(dllexport) void __stdcall   MyFunc(int*sz, double ** p){
	// ну для примера
	*sz= 4;
	*p= static_cast<double*>(:: CoTaskMemAlloc((*sz)*sizeof(double)));	
	for (int i=0;i<*sz;i++) (*p)[i]=i;	
}
...
Рейтинг: 0 / 0
22.04.2014, 16:50
    #38621865
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
vlsaf,

оболочка пусть и освобождает что нужно
...
Рейтинг: 0 / 0
22.04.2014, 17:15
    #38621915
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
unsafe c#
Изопропил, огромное спасибо!
Ты очень помог!!!


Пока вопросы иссякли.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / unsafe c# / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]