powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / unsafe c#
19 сообщений из 19, страница 1 из 1
unsafe c#
    #38621601
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это развитие вот этой темы .
Изопропил
Код: 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
unsafe c#
    #38621620
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Не нормально. Указатели могут быть использованы только в контексте unsafe. Как же поиметь массив L?
...
Рейтинг: 0 / 0
unsafe c#
    #38621657
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо 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
unsafe c#
    #38621669
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на С-стороне использовать COM Safe Array, на C#-стороне всё упростится.

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

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

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

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

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


?
...
Рейтинг: 0 / 0
unsafe c#
    #38621694
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЕсли выделять память под массив на дотнетной стороне, полагаю, копирования не будет?
предлагалось - не годится ( Создание одномерного массива типа double размерности N )
...
Рейтинг: 0 / 0
unsafe c#
    #38621699
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
unsafe c#
    #38621718
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилvlsafНет. Не нормально. Указатели могут быть использованы только в контексте unsafe. Как же поиметь массив L?
пометь все свои классы unsafeПолучается что так. Может лучше скопировать? Неужели там так много?
...
Рейтинг: 0 / 0
unsafe c#
    #38621744
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей К,

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


PS CoTaskMemAlloc библиотекой не используется
...
Рейтинг: 0 / 0
unsafe c#
    #38621863
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использует С++ оболочка над этой библиотекой. Вот твой пример:
Код: 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
unsafe c#
    #38621865
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsaf,

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


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


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