Я пытаюсь использовать DLL-файл из python с ctypes, но застрял в проблеме
OSError: исключение: чтение нарушения доступа 0x00000000
Код:
import ctypes as ctypes
NS = ctypes.oledll.LoadLibrary ("D:\\XXX\\nsga2.dll")
NS.Initialise(360,2,2,5,0,5,2)
NS.Randomise()
В файле DLL функция Randomise()
определяется следующим образом:
ADDAPI void
ADDCALL Randomise(){
randomize();
initialize_pop (parent_pop);
ngen = 0;}
А функция randomize()
определяется как:
# include "rand.h"
double seed;
double oldrand[55];
int jrand;
void randomize()
{
int j1;
for(j1=0; j1<=54; j1++)
{
oldrand[j1] = 0.0;
}
jrand=0;
warmup_random (seed);
return;
}
У меня вопрос, почему у меня возникает эта проблема и как я могу ее исправить?
Спасибо всем!
РЕДАКТИРОВАТЬ 1 согласно запросу
Функция Initialise()
определяется как:
ADDAPI void
ADDCALL Initialise(int populationSize, int objectives, int constraints,
int realvars, int binvars, int intvars, int nfix)
{
popsize = populationSize;
nobj = objectives;
ncon = constraints;
nreal = realvars;
nint = intvars;
nbin = binvars;
nfixed = nfix;
nbits = (int *)malloc(binvars*sizeof(int));
for (int i = 0 ; i <binvars ; i++)
{
nbits[i]=24 ;
}
nints = (int *)malloc(nint*sizeof(int));
bints = (int *)malloc(nint*sizeof(int));
for (int i = 0 ; i <nfixed/(2*nswitch+1); i++)
{
bints[i*(2*nswitch+1)]=0;
nints[i*(2*nswitch+1)]=1;
//nints[i*(2*nswitch+1)]=2;
for (int j =(2*nswitch+1)*i+1 ; j<(2*nswitch+1)*(i+1); i++)
{
bints[j]=0;
nints[j]=TimeLength;
//nints[j]=25;
}
}
min_realvar = (double *)malloc(nreal*sizeof(double));
max_realvar = (double *)malloc(nreal*sizeof(double));
intvar = NULL;
min_binvar = NULL;
max_binvar = NULL;
parent_pop = (population *)malloc(sizeof(population));
child_pop = (population *)malloc(sizeof(population));
mixed_pop = (population *)malloc(sizeof(population));
allocate_memory_pop (parent_pop, popsize);
allocate_memory_pop (child_pop, popsize);
allocate_memory_pop (mixed_pop, 2*popsize);
seed = 0.232; // for random functions
bitlength = 0;
pcross_bin = 0;
pcross_int = 0;
pmut_bin = 0 ;
pmut_int = 0;
eta_c = 50 ; // distribution index for crossover
eta_m = 100 ; // distrubution index for mutations
nbits = 0 ;
nints = 0;
fitness_func = NULL;
}