当前位置:编程学习 > C#/ASP.NET >>

c#调用c语言的dll 错误:尝试读取或写入受保护的内存,这通常指示其他内存已损坏。

extern _declspec(dllexport)  double SoluteTransportSimulation(double U_X, double U_Y, double Dast, double ALPHA_L, int TSTEP)
/*
 * INPUT:
 *    U_X:
 *    U_Y:
 *    Dast:
 *    ALPHA_L:
 *
 * OUTPUT:
 *    MaxDistance:   Furthest Distance
 *    Concentration: Corresponding Concentration
 */
{
   static double MaxDistance; 
    double Concentration;
    int ii, jj, kk;
    int tt;

    int NNX = XN + 1;
    int NNY = YN + 1;
    int NNZ = ZN + 1;

    double ct;
    int row = 0;
    int col = 0;

    double DeltaZ = DEPTH / ZN;
    double DeltaX = WIDTH_X / XN;
    double DeltaY = WIDTH_Y / YN;

    double rx = DeltaT / DeltaX / DeltaX;
    double ry = DeltaT / DeltaY / DeltaY;
    double rz = DeltaT / DeltaZ / DeltaZ;
    double rx2 = DeltaT / DeltaX / 2.0;
    double ry2 = DeltaT / DeltaY / 2.0;
    double rz2 = DeltaT / DeltaZ / 2.0;

    double *XX, *YY, *ZZ;

    /*------------ COMPUTATION RESULTS ------------*/
    double *HydraulicHead1D;            /* n time layer Hydraulic Head h^n (1D Model)*/
    double *HydraulicHead1D2;           /* n+1 time layer Hydraulic Head h^{n+1} (1D Model)*/
    double *SoluteConcentration1D;      /* n time layer Solute Concentration (c^n) (1D Model)*/
    double *SoluteConcentration2D;      /* n time layer Solute Concentration (c^n) (2D Model)*/

    /* 1D Vertical Flow Simulation & Solute Transport */
    ZZ = (double *)malloc(NNY * sizeof(*ZZ));
    for (kk = 0; kk < NNZ; kk++)
        ZZ[kk] = kk * DeltaZ;
    /* 2D Horizontal Flow Simulation & Solute Transport */
    XX = (double *)malloc(NNX * sizeof(*XX));
    YY = (double *)malloc(NNY * sizeof(*YY));
    for (ii = 0; ii < NNX; ii++)
        XX[ii] = ii * DeltaX;
    for (jj = 0; jj < NNY; jj++)
        YY[jj] = jj * DeltaY;

    HydraulicHead1D = (double *)malloc(NNZ * sizeof(*HydraulicHead1D));
    HydraulicHead1D2 = (double *)malloc(NNZ * sizeof(*HydraulicHead1D2));
    SoluteConcentration1D = (double *)malloc(NNZ * sizeof(*SoluteConcentration1D));
    SoluteConcentration2D = (double *)malloc(NNX * NNY * sizeof(*SoluteConcentration2D));

    /* Initial Values */
FuncGetValues1D(HydraulicHead1D, NNZ, ZZ, InitialHydraulicHead);
FuncGetValues1D(SoluteConcentration1D, NNZ, ZZ, InitialConcentration1D);
FuncGetValues2D(SoluteConcentration2D, NNX, NNY, XX, YY, InitialSoluteConcentration);

    for (tt= 1; tt <= TSTEP; tt++) {
     ct = tt * DeltaT;
     /*------------------------------------------------------------------
      * --------- 1D Vertical Flow Solute Transport Simulation ----------
      * -----------------------------------------------------------------*/
     /* n time layer to n+1 time layer hydraulic head */
     WaterMovement1D(HydraulicHead1D, HydraulicHead1D2, NNZ, ct, rz, rz2);

     /* n time layer to n+1 time layer solute concentration */
     SoluteTransport1D(HydraulicHead1D, HydraulicHead1D2, SoluteConcentration1D,
     NNZ, ct, rz2, DeltaZ);

     VecCopy(HydraulicHead1D, HydraulicHead1D2, NNZ);
     ZeroVec(HydraulicHead1D2, NNZ);
//     bzero(HydraulicHead1D2, NNZ * sizeof(double));

     /*------------------------------------------------------------------
      * ---------- 2D Plane Flow Solute Transport Simulation  -----------
      * -----------------------------------------------------------------*/
     SoluteTransport2D(SoluteConcentration2D, NNX, NNY, tt, SoluteConcentration1D[ZN],
     rx, rx2, ry, ry2, U_X, U_Y, Dast, ALPHA_L);

     /* Search distance and concentration */
     Concentration = SearchMax(SoluteConcentration2D, NNX, NNY, row, col);
     MaxDistance = DeltaX * row;
    }// time marching

    free(XX); free(YY); free(ZZ);
    free(HydraulicHead1D); free(HydraulicHead1D2);
    free(SoluteConcentration1D);
    free(SoluteConcentration2D);

    return MaxDistance;
}



  [DllImport("simulation.dll")]  

      public static  extern  Double SoluteTransportSimulation(double U_X, double U_Y, double Dast, double ALPHA_L, int TSTEP);
        double sss= SoluteTransportSimulation(0.4, 1.2, 1.3, 5.0, 10);
C# c语言的dll  --------------------编程问答-------------------- 确认调用约定是否正确,c++默认不是stdcall --------------------编程问答--------------------
引用
确认调用约定是否正确,c++默认不是stdcall 

什么意思?那我应该怎么做? --------------------编程问答-------------------- 问题还是没有解决啊。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- C++方法内部出错了吧。 --------------------编程问答-------------------- 学会自己调试吧,你代码太长,有些函数别人也不清楚具体如何实现,无法直接给出你答案,
据我猜测,非常有可能是你访问数组时候越界了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,