Передача массива в указатель на функцию из C # - PullRequest
0 голосов
/ 22 сентября 2018

Я реализовал некоторые функции в программе на C и заключил их в dll, которая будет вызываться в другом проекте на C #.Одна из функций в dll принимает указатель функции в качестве входного аргумента, то есть в исходном коде, генерирующем dll, одна из функций выглядит следующим образом:

void functionA(
    int* a,
    int* b,
    double *c,
    double[] inputArr,
    double[] outputtArr,
    void(*fun)(int*, int*,double[],double[])
)

Внутри функции A inputArr будет иметь видиспользуется в качестве входных данных для указателя на функцию, а outputArr будет использоваться в качестве выходных данных.Параметр inputArr должен иметь размерность * a, а размер outputtArr должен быть * b.

. В C # я попытался импортировать dll и вызвать функцию A следующим образом:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Test{    
class Program
    {
     public delegate void costfun(ref int a, ref int b, double[] x, double[] fx);         
     static void Main(string[] args)
        {
            int a = 5, b = 3,
            double c= 1e-14

            double[] x = new double[5] { 1, 3, 5, 7, 9 };                              
            double[] y= new double[3] { 100, 100, 100 };
            costfun F = new costfun(fun);
          functionA(ref a, ref b,  ref c, x,y  Marshal.GetFunctionPointerForDelegate(F));

        }

        public static void fun(ref int na, ref int nb, double[] inX, double[] outY)
        {
            int i = 0;
            outY= new double[nb];

            if (outY.Length != nb)
            {
                //Console.WriteLine("output incorrect");
                return;
            }
            if (inX.Length != na)
            {
               // Console.WriteLine("input incorrect");
                return;
            }
            for (i = 0; i < nb; i++)
            { outY[i] = inX[i] * inX[i + 1] + 1; }
        }

        // import the dll
        [DllImport("cdll.dll", EntryPoint = "functionA", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]    
        public static extern void functionA(int* a, int* b, double*c,double[] inputArr, double[] outputtArr, IntPtr fcpointer);
}
}

Программа успешно скомпилирована и может быть выполнена.все же я обнаружил, что во время выполнения всякий раз, когда функция fun вызывается из dll, входной массив inX имеет только один элемент, то есть передается только inX [0].Если я прокомментирую два оператора if внутри функции fun, Visual Studio прекратит работу из-за исключения исключения индекса из оператора:

outY[i] = inX[i] * inX[i + 1] + 1; 

из-за inX [i + 1]. Может кто-нибудь датьмне несколько советов, как решить эту проблему?Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...