I've got a Problem building a DLL including a function in Intel's 
Lapack, not sure if this function is actually causing the trouble or if 
it's the way I build and call a DLL .
However here's a test case for the problem:

This code is built to be a dll..

#include<iostream>
#include<math.h>
#include <complex>
#include<intel/mkl_lapack.h>
#include<intel/mkl_blas.h>
using namespace std;

#ifdef __cplusplus // If used by C++ code,
extern "C" { // we need to export the C interface
//extern "C++" { does not work, but why??
#endif

__declspec(dllexport) void get_reflection(int matrix_size)
{
      MKL_Complex16 *Y_inv;
      int *piv;
      int i;
      int lda=matrix_size;
      int info;

                                                                                
 
Y_inv=(MKL_Complex16*)malloc(matrix_size*matrix_size*sizeof(MKL_Complex16));
      piv=(int*)malloc(matrix_size*sizeof(int));

      for(i=0;i<(matrix_size*matrix_size);i++){
           Y_inv[i].real=rand();
           Y_inv[i].imag=rand();
      }

      zgetrf(&matrix_size,&matrix_size,Y_inv,&lda,piv,&info);

}
#ifdef __cplusplus
}
#endif


This Program is calling the function get_reflection(int) from the DLL. A 
crash occurs when get_reflection is called with an Integer (which 
determines the size of an array) bigger than 18 (20 does not work). The 
message I get is: 0xC0000005: Access violation reading location 
0x00000000. Debugging the program line by line showed that the issue 
comes up during execution of the function zgetrf. This is part of an 
Lapack version distributed in intel's math kernel.

//reading location 0x00000000
#include<iostream>
#include <stdio.h>
#include<windows.h>
using namespace std;

typedef int(__cdecl *MYPROC)(int);

VOID main(VOID)
{
     HINSTANCE hinstLib;
     MYPROC ProcAdd;
     BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

     // Get a handle to the DLL module.

     hinstLib = LoadLibrary(TEXT("testcase.dll"));

     // If the handle is valid, try to get the function address.

     if (hinstLib != NULL)
     {
                ProcAdd = (MYPROC) GetProcAddress(hinstLib, "get_reflection");

        // If the function address is valid, call the function.

         if (NULL != ProcAdd)
         {
             fRunTimeLinkSuccess = TRUE;
             (ProcAdd)(20); //: 0xC0000005: Access violation reading 
location 0x00000000.
            //(ProcAdd)(18); //Works fine
         }

         // Free the DLL module.

         fFreeResult = FreeLibrary(hinstLib);
     }

     // If unable to call the DLL function, use an alternative.

     if (! fRunTimeLinkSuccess)
         printf("ERROR\n");
}

There is always a crash when calling get_reflection with a parameter 
(matrix_size) that is bigger than 20.



Funny thing is that the whole thing works just fine when I do not create 
a dll thing but just built a executable, which get_reflection() is part of.


Example:
#include<iostream>
#include<math.h>
#include <complex>
#include<intel/mkl_lapack.h>
#include<intel/mkl_blas.h>
using namespace std;

void get_reflection(int matrix_size)
{
      MKL_Complex16 *Y_inv;
      int *piv;
      int i;
      int lda=matrix_size;
      int info;

      Y_inv=(MKL_Complex16 
*)malloc(matrix_size*matrix_size*sizeof(MKL_Complex16));
      piv=(int*)malloc(matrix_size*sizeof(int));
      for(i=0;i<(matrix_size*matrix_size);i++){
           Y_inv[i].real=rand();
           Y_inv[i].imag=rand();
      }
      zgetrf(&matrix_size,&matrix_size,Y_inv,&lda,piv,&info);
}


void main(){
      get_reflection(20); //This call works
}



I would very much appreciate any help on that problem. Probably it's the 
way I build/call the DLL, or there's some memory allocation issue in the 
zgetrf routine.

Cheers
Sebastian


_______________________________________________
msvc mailing list
msvc@beginthread.com
See http://beginthread.com/mailman/listinfo/msvc_beginthread.com for 
subscription changes, and list archive.

Reply via email to