Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2012, 12:38   #1
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
Восклицание Передача массива C# в Delphi

Доброе время суток! Возникла необходимость передать массив структур из C# в Delphi DLL. Все успешно передается, но плюс к нужным данным передаются дополнительные строки в массиве..

Вызов процедуры в DLL Delphi:

Код:
TypeRowIn = record
                          a : TDateTime;
                          b : TDateTime;

                          v : real;
                          vv : real;
                          vvv : real;
                          vvvv : real;
                        end;

    TypeRowsIn = array of TypeRowIn;

procedure cl_Calc(inRows : TypeRowsIn); stdcall;
var test1 : real;
begin
 test1 := (inRows [0].v + inRows [0].vv+ inRows [0].vvv+ inRows [0].vvvv)/4;
end;
вызов в C#:

Код:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct Row
        {
            public DateTime a;
            public DateTime b;
            
            public double v; 
            public double vv; 
            public double vvv; 
            public double vvvv;
        }
        
        [DllImport(@"Ind.dll", EntryPoint = "cl_Calc", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        static public extern void Calc(Row[] inRows);

...

static void Main(string[] args)
        {
            int count = 2;
            Row[] Rows = new Row[count];

            Rows [0].a = new DateTime(2012, 01, 29);
            Rows [0].b= new DateTime(2012, 01, 29, 14, 00, 00);
            Rows [0].v= 0.25658;
            Rows [0].vv= 9.55678452;
            Rows [0].vvv = 2.3455658;
            Rows [0].vvvv= 6.243458;

            Rows [1].a = new DateTime(2012, 01, 29);
            Rows [1].b= new DateTime(2012, 01, 29, 15, 00, 00);
            Rows [1].v = 1.25658;
            Rows [1].vv= 5.95758;
            Rows [1].vvv= 2.95688;
            Rows [1].vvvv= 2.85958;

            Calc(Rows);

            Console.ReadLine();
        }
В итоге первые две строки массива передаются верно, но вместе с ними еще передается более 100 000 строк в массиве)) как сделать, чтобы передались только эти две строки? Заранее спасибо!
atagilov вне форума Ответить с цитированием
Старый 29.01.2012, 12:44   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

отдельным параметром надо передавать количество строк в массиве.
Делфи то ничего не знает о массиве из шарпа.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.01.2012, 12:48   #3
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
По умолчанию

это конечно я сделаю, изначально было задумано передавать кол-во строк, но это ведь не поможет отсечь ненужные данные..
Мне нужно чтобы я отправил к примеру массив из 5 строк и в Delphi пришел массив из 5 строк, о размере которого я узнал из параметра, к примеру Count, а не массив из 100 000 строк))
atagilov вне форума Ответить с цитированием
Старый 29.01.2012, 12:55   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дело не в том что приходит больше, а в том что вы читаете больше чем надо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.01.2012, 13:28   #5
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
По умолчанию

Ок, спасибо за совет! Эту проблему решим передачей кол-ва переданных строк. А если усложнить задачу и сделать чтобы еще он возвращал в C# массив..

Delphi:
Код:
TypeRowIn = record
                          a : TDateTime;
                          b : TDateTime;
 
                          v : real;
                          vv : real;
                          vvv : real;
                          vvvv : real;
                        end;
 
    TypeRowsIn = array of TypeRowIn;
 
procedure cl_Calc(inRows : TypeRowsIn, inCount : integer; var OutRows : TypeRowsIn); stdcall;
var i : integer;
begin
 for i := 0 to inCount - 1
 do begin
      OutRows[i].a := inRows[i].a;
      OutRows[i].b := inRows[i].b;
      OutRows[i].v := inRows[i].v;
      OutRows[i].vv := inRows[i].vv;
      OutRows[i].vvv := inRows[i].vvv;
      OutRows[i].vvvv := inRows[i].vvvv;
     end;
end;
Вызов в C#
Код:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct Row
        {
            public DateTime a;
            public DateTime b;
            
            public double v; 
            public double vv; 
            public double vvv; 
            public double vvvv;
        }
        
        [DllImport(@"Ind.dll", EntryPoint = "cl_Calc", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        static public extern void Calc(Row[] inRows, int inCount, ref Row[] OutRows);
 
...
 
static void Main(string[] args)
        {
            int count = 2;
            Row[] Rows = new Row[count];
            Row[] RowsOut = new Row[count];

            Rows [0].a = new DateTime(2012, 01, 29);
            Rows [0].b= new DateTime(2012, 01, 29, 14, 00, 00);
            Rows [0].v= 0.25658;
            Rows [0].vv= 9.55678452;
            Rows [0].vvv = 2.3455658;
            Rows [0].vvvv= 6.243458;
 
            Rows [1].a = new DateTime(2012, 01, 29);
            Rows [1].b= new DateTime(2012, 01, 29, 15, 00, 00);
            Rows [1].v = 1.25658;
            Rows [1].vv= 5.95758;
            Rows [1].vvv= 2.95688;
            Rows [1].vvvv= 2.85958;
 
            Calc(Rows, Rows.length, ref RowsOut);
 
            Console.ReadLine();
        }
Возвращает всего 1 строку в RowsOut, первую, переданную в Rows.. Как можно решить данную проблему?
atagilov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача массива в Delphi atagilov C# (си шарп) 1 30.01.2012 15:42
Произведение элементов массива в функции (передача массива в функцию) (Delphi) Toxa16 Помощь студентам 1 23.04.2011 04:42
Передача динамического массива krosh87 Работа с сетью в Delphi 3 24.02.2011 18:39
Передача массива в функцию GladiatoR24 Общие вопросы C/C++ 3 24.11.2010 22:51
Передача массива в метод Sempe4 Общие вопросы .NET 6 16.06.2010 17:25