powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание одномерного массива типа double размерности N
8 сообщений из 33, страница 2 из 2
Создание одномерного массива типа double размерности N
    #38620871
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ммм, да.Согласен. Завтра буду пробовать. Спасибо за разъяснения.
...
Рейтинг: 0 / 0
Создание одномерного массива типа double размерности N
    #38621041
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут подумал. Все-же что-то не то. Я передаю данные из C# в функцию, написанную на С++. Функция решает СЛАУ. Результат помещает в массив. Решение СЛАУ это отдельная сторонняя dll. Программа на С++ это обертка над ней. И выделение памяти под массив решений происходит именно в этой сторонней dll. Обертка имеет уже ссылку на массив решений. И понятно, что в программе на C# выделить память не получится.

Отсюда выходит, что в программе на С++ нужно припиннеть массив решений. Уж не знаю как это делать. Или все-же в программе на C# как-то через fixed-unsave взять массив решений. Что скажет уважаемый мной Изопропил?
...
Рейтинг: 0 / 0
Создание одномерного массива типа double размерности N
    #38621050
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsafИ выделение памяти под массив решений происходит именно в этой сторонней dll.

ну раз так, и копировать в c# массив нежелательно, лучше остановиться на unsafe коде с указателями

P.S. возвращаемый IntPtr легко приводится к double* (double*)ptr.ToPointer()
P.P.S. если пишется обёртка для библиотеки решения СЛАУ - покажи оригинальные сигнатуры(а лучше ссылку на описание библиотеки дай)
...
Рейтинг: 0 / 0
Создание одномерного массива типа double размерности N
    #38621080
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы делаем LU факторизацию матрицы для дальнейшего решения СЛАУ.
Для этого используем бесплатную разработку с открытым кодом.
Вот ссылка на SuperLU
Работаем с версией 4.3. Это первая строка на скачивание: Download software (V4.3) -

Функции с которыми работаем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// получает вектор перестановок по столбцам
get_perm_c(options.ColPerm, &A, perm_c);

// переупорядочивает матрицу по полученому вектору перестановок и подготавливает данные к факторизации 
sp_preorder(&options, &A, perm_c, etree, &AP);

//основная функция делает факторизацию и возвращает нужные нам структуры L и U
dgstrf(&options, &AP, relax, panel_size, etree, NULL, lwork, perm_c, perm_r, &L, &U, &stat, &info_slu);




Имея структуры L и U вытаскиваем матрицы L и U в координатном прадставлении:
L, iL, jL - эти три массива имеют один размер sizeL
U, iU, jU - эти три массива имеют другой размер sizeU

Эти шесть матриц идут на выход, в C#.



На на вход обертки на C++ идет матрица А тоже в координатном представлении
A, iA, jA

Координатное представление:
A - массив ненулевых значений типа double
iA - массив строк типа int
jA - массив столбцов типа int
Размер всех трех массивов sizeA


Если еще осталось желание, то могу приложить сольюшен для Visual Studio, где мой коллега пытается написать на С++ код.
...
Рейтинг: 0 / 0
Создание одномерного массива типа double размерности N
    #38621283
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsaf,

ничего страшного нет,
можно обойтись даже без обёртки, хотя обёртку может оказаться проще сделать, чем P/Invoke напрямую

в случае обёртки
возвращать IntPtr, входные массивы - по ссылке

если есть разумная оценка размеров L и U - можно свой буфер подать (п 1.4.4 документации)
...
Рейтинг: 0 / 0
Создание одномерного массива типа double размерности N
    #38621426
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумной оценки размерности L и U нет. Может доходить до 10 000 000. Но заранее выделять такого размера буфер нет смысла, т.к. практически 99% расчетов будут идти с размерами гораздо меньшими.

Изопропил, можешь показать чем как инициализировать IntPtr в C# программе. И как без Marshal.Copy поиметь нужный массив на выходе, преобразовав intPtr, как ты писал к
double* (double*)ptr.ToPointer() .
...
Рейтинг: 0 / 0
Создание одномерного массива типа double размерности N
    #38621532
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;                       
    }



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


Давай вот тут .
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание одномерного массива типа double размерности N
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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