Исключение: место записи нарушения прав доступа для Matlab Coder в Visual Studio - PullRequest
0 голосов
/ 21 мая 2019

У меня есть следующий код:

addstruct.h:

#ifndef ADDSTRUCT_H
#define ADDSTRUCT_H

typedef struct {
    double* x;
    double* y;
} StructC;

void addstruct(double *a, double *b, const StructC *structc, int len);

#endif

addstruct.c:

#include "addstruct.h"

void addstruct(double *a, double *b, StructC *structc, int len)
{
    for (int i=0; i<len; i++)
    {
        structc->x[i]=a[i]+b[i];
        structc->y[i]=-1*(a[i]+b[i]);
    }
}

calladdstruct.m:

function S = calladdstruct(A,B)  %#codegen
    if coder.target('MATLAB')
    else
        coder.updateBuildInfo('addSourceFiles','addstruct.c');
        L=1000;
        Sx=zeros(1,L); Sy=zeros(1,L);
        StructC=struct('x',{Sx}, 'y',{Sy});
        coder.cstructname(StructC, 'StructC', 'extern', 'HeaderFile', 'addstruct.h');
        coder.ceval('addstruct', coder.rref(A), coder.rref(B), coder.ref(StructC), int32(numel(Sx)));
        S=sum(StructC.x);
        sprintf('sumx: %s', char( num2ascii(S,0) ))
        S=sum(StructC.y);
        sprintf('sumy: %s', char( num2ascii(S,0) ))
    end
end

и main.c в Visual Studio:

#include "calladdstruct.h"
#include "calladdstruct_initialize.h"
#include "calladdstruct_terminate.h"
#include <stdio.h>

int main()
{
   double S;
   double xarr[3]={1,2,3};
   double yarr[3]={1,2,3};
   calladdstruct_initialize();
   S = calladdstruct(xarr, yarr);
   printf("%f\n", S);
   calladdstruct_terminate();
   getchar();
   return 0;
}

Когда я запускаю это в Visual Studio, я получаю сообщение об ошибке

Exception Thrown at (calladdstruct.dll) in calladdstruct.exe: Access violation writing location

Почему это так?

1 Ответ

0 голосов
/ 29 мая 2019

Объявление для вашей структуры "StructC" не соответствует ожиданиям MATLAB Coder.Попробуйте сгенерировать код без параметра "extern" в coder.cstructname, чтобы увидеть ожидаемый тип.Затем используйте это в своем рукописном определении.

Если вам нужен определенный формат структуры, используйте coder.opaque и coder.ceval для взаимодействия с ним исключительно, чтобы вы не выдвинули предположений о расположении памяти, которые должны соответствоватьмежду данными, генерируемыми MATLAB Coder, и вашим рукописным кодом.

Надеюсь, это поможет.

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