The idea is simple - native C++ program gets initial data, makes some calculations (about several seconds) and output results array with a lot of data. I need to make a lot of these calculations for various initial data. So I made it like this:
C# parse file with initial data
C# launches a parallel.for cycle:--------------------------------------------------------------------------------parallelOptions.MaxDegreeOfParallelism = 8; // for 100% load on 8 coresParallel.For(0, data.NUM_TRAJECTORIES, parallelOptions, i => { // call Visual C++ to call native C++});--------------------------------------------------------------------------------
In unsafe ('cause I need pointers in C# to fill C# array from C++) void function C# creates an array for results:data.dataFromCPP[i] = new double[result.GetSize(), 8]; // 8 - is the number of output parameters. result.GetSize() - returns number of rows for current finished calculation
Using pointer to array, C++ fills C# array with output data:fixed (double* p = data.dataFromCPP[i]){ result.CopyResults(p);}--------------------------------------------------------------------------------And here's the function from native C++:void cSolver::copyResults(double *externalArray){ for(int i = 0 ; i < resultsVector.size(); i++) { externalArray[i*8 + 0] = resultsVector[i].lat; externalArray[i*8 + 1] = resultsVector[i].lon; externalArray[i*8 + 2] = resultsVector[i].altitude; externalArray[i*8 + 3] = resultsVector[i].tendency; externalArray[i*8 + 4] = resultsVector[i].time; externalArray[i*8 + 5] = resultsVector[i].Vx; externalArray[i*8 + 6] = resultsVector[i].Vy; externalArray[i*8 + 7] = resultsVector[i].Vz; }}
The Problem:
The problem is in AccessViolationException while copying data from C++ to C#, last time it occurred on this line
externalArray[i*8 + 3] = resultsVector[i].tendency;
It appears rarely - I've launched program 4 times, for the first 3 times it done everything excellent, and on the fourth it stopped with this exception. But that's really bad, 'cause for 3200 calculations - it takes about 20 minutes to calculate them all. And when it is stopped on 3197' trajectory - it is reeeealy terrible...
So, can anyone help me with this problem? What am I doing wrong, and what should I do to avoid this exception.
Best regards,Nikita Petrov.