С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 17

Передать в C# массив переменной длины.

28.01.2011, 18:31. Показов 6085. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет форумчане.
Подскажите как передать в С# из dll-ки массив заранее не известного размера.
Dllка генерит массив не извесного заранее размера. Как его принять в проге на С#/
Dll-ка сделана на С.
Массив фиксированного размера я передал тема (C# принять массив по указателю).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2011, 18:31
Ответы с готовыми решениями:

Как передать из Delphi в функцию PL/SQL массив переменной длины?
к примеру такой вариант: TYPE TTestArray IS VARRAY(10) OF VARCHAR(12); FUNCTION Test1(TestArray TTestArray) RETURN STRING IS ...

массив переменной длины
Как в С++ сделать массив переменной длины (увеличивающийся), чтобы сохранялись хранящиеся там данные? Покопался, но нигде не могу найти. ...

Массив переменной длины
Здравствуйте форумчане. Написал программу для копирования содержимого одного массива в другой. Массивы переменной длины. #include...

7
20 / 20 / 2
Регистрация: 27.08.2009
Сообщений: 71
28.01.2011, 20:08
я с длл не работал... а что так не помогает?
C#
1
2
3
void p(int[] i)
{
}
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2011, 22:04
Kotte, чтобы получить элементы массива обязательно нужно знать либо кол-во элементов, либо размер выделенной памяти под массив, либо чтобы конец массива был как-то обозначен (как например конец строки обозначается \0). Иначе это как из пушки по воробьям.
1
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
28.01.2011, 23:56
А как генерится?
Если передавать целый массив, то все нормально будет
C#
1
string[] massive = dllmethod();
длина massive будет такой, какая длина у переданного методом dllmethod() массива.
1
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 17
29.01.2011, 17:11  [ТС]
Привет Всем.
Фишка в чем: есть у меня функция в dll скажем
C++
1
2
3
4
5
DWORD EncodeArray(byte* p_inArray, int cb_inArray,byte* p_outArray, int* cb_outArray);
//  byte* p_inArray  указатель на входной массив данных
//  int cb_inArray  колич байт в нем.
//  byte* p_outArray указатель на выходной массив
//  int* cb_outArray колич данных в выходном массиве.
и все работает и все нормально. знаю что размер выходного массива можно посчитать
как sizeof(inArray)+20.
Но мне коллега юзающий мою dll в С# не доверяет и грит "вот какой массив мне выделять.
Хотелось бы что бы ты его выделил и мне передал".
если бы С# поддерживал технику

C++
1
2
byte p_outArray = NULL;
EncodeArray(p_inArray,cb_inArray,p_outArray,cb_outArray);
я бы полагаю в функции сделал
C
1
2
3
4
5
6
EncodeArray(p_inArray,cb_inArray,p_outArray,cb_outArray)
{
...
p_outArray = (byte*)malloc(cb_outArray);
for(i = 0;i<cb_outArray;i++)p_outArray[i] = data;
}
Я бы в этом случае выделил бы памяти сколько нужно заполнил бы и отдал.
Как такое сделать если вызыващая программа пишется на С#
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
29.01.2011, 18:27
в winapi обычно передают указатели на структуры вида
{
размер массива
указатель на массив
}
и все довольны, размер легко читается, а с размером и массив не проблема
1
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 17
29.01.2011, 20:58  [ТС]
Это все понятно. Но если стать на точку зрения вызывающей программы откуда ей знать какого размера вернется массив и сколько ей выделить памяти.
Понятно что можно сработать в два этапа сначала запросить размер. Потом сделать в C# new. Потом вызвать функцию заполняющую массив. Но вот хочется что бы все отработало одной функцией.
0
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 17
31.01.2011, 12:27  [ТС]
Превет всем. А решается мой вопрос вот так.
C#
1
2
3
4
5
6
IntPtr buffer = new IntPtr();
MyLib.GetDataArray(ref buffer, ref size);
 
byte[] arrayRes = new byte[size];
Marshal.Copy(buffer, arrayRes, 0, size);
Marshal.FreeCoTaskMem(buffer);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.01.2011, 12:27
Помогаю со студенческими работами здесь

Двумерный динамический массив char переменной длины, realloc()
Доброго времени, коллеги! Пытаюсь по немногу изучать разные языки, попал такую позу: надо нагенерить для БД много рандомной информации,...

Нужен массив переменной длины с возможностью добавления элементов
нужен массив переменной длины, чтобы потом его примерно так заполнить: switch (XXX) { case 1: A = {0.6, 1, 2, 2.5, 4}; ...

Как сделать массив (переменной длины) элементов управления в VBA?
Как сделать массив (переменной длины) элементов управления в VBA?

Организация формы ввода в массив записей заданной переменной длины
Решил спросить совета у форумского разума. Есть массив TRadiusArray записей TEditRadius переменной длины (может быть от 5 до 50 записей)...

Передать массив без предварительного создания переменной
Добрый день. Есть у меня вот такая функция: int _assert_array_equals(int *arr1, int *arr2, int len, char *msg) {//сравнивает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru