VS调用MATLAB绘制驻波异常

img


0x00007FFF94BF428C 处(位于 Project3.exe 中)引发的异常: Microsoft C++ 异常: foundation::core::except::detail::AnonymousInternalExceptionfoundation::usm::NoActiveContextTypeError,位于内存位置 0x000000D9E8B5EC78 处。

这是代码


#include "engine.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main()
{
    Engine* ep;
    mxArray* t = NULL, * l = NULL, * x = NULL, * y_fwd = NULL, * y_bwd = NULL, * y_res = NULL;
    double* t_data, * l_data, * x_data;
    double amp_fwd, freq_fwd, wavelen_fwd, amp_bwd, freq_bwd, wavelen_bwd;
    int i, j, n;

    // 连接到 MATLAB 引擎
    if (!(ep = engOpen(NULL)))
    {
        fprintf(stderr, "无法连接到 MATLAB 引擎\n");
        return EXIT_FAILURE;
    }
    // 添加禁用硬件加速代码
    engEvalString(ep, "matlab.graphics.Renderer.use('software')");
    engEvalString(ep, "set(groot,'DefaultFigureRenderer','painters')");

    // 创建 t 向量
    t = mxCreateDoubleMatrix(1, 1001, mxREAL);
    t_data = mxGetPr(t);
    for (i = 0; i < 1001; i++)
    {
        t_data[i] = i * 0.1;
    }

    // 创建 l 向量
    l = mxCreateDoubleScalar(10);
    l_data = mxGetPr(l);

    // 创建 x 向量
    x = mxCreateDoubleMatrix(1, 101, mxREAL);
    x_data = mxGetPr(x);
    for (i = 0; i < 101; i++)
    {
        x_data[i] = i * (*l_data) / 200;
    }

    // 获取用户输入参数
    printf("请输入正向波的振幅:\n");
    scanf_s("%lf", &amp_fwd);
    printf("请输入正向波的频率:\n");
    scanf_s("%lf", &freq_fwd);
    printf("请输入正向波的波长:\n");
    scanf_s("%lf", &wavelen_fwd);
    printf("请输入反向波的振幅:\n");
    scanf_s("%lf", &amp_bwd);
    printf("请输入反向波的频率:\n");
    scanf_s("%lf", &freq_bwd);
    printf("请输入反向波的波长:\n");
    scanf_s("%lf", &wavelen_bwd);

    // 循环每个时间点,计算波形并绘图
    for (n = 0; n < 1001; n++)
    {
        y_fwd = mxCreateDoubleMatrix(1, 101, mxREAL);
        y_bwd = mxCreateDoubleMatrix(1, 101, mxREAL);
        y_res = mxCreateDoubleMatrix(1, 101, mxREAL);
        for (j = 0; j < 101; j++)
        {
            *(mxGetPr(y_fwd) + j) = amp_fwd * sin(2 * 3.1416 * (t_data[n] * freq_fwd - x_data[j] / wavelen_fwd));
            *(mxGetPr(y_bwd) + j) = amp_bwd * sin(2 * 3.1416 * (t_data[n] * freq_bwd + x_data[j] / wavelen_bwd));
            *(mxGetPr(y_res) + j) = *(mxGetPr(y_fwd) + j) + *(mxGetPr(y_bwd) + j);
        }
        mxArray* pArray[3] = { y_fwd, y_bwd, y_res };
        for (int k = 0; k < 3; k++)
        {
            if (pArray[k] != NULL)
            {
                char command[256];
                sprintf(command, "x%d=x',y%d=y(:,%d)',", k, k, k + 1);
                engEvalString(ep, command);
                engPutVariable(ep, command + 1, pArray[k]);
            }
        }
        engEvalString(ep, "clf");
        engEvalString(ep, "subplot(3,1,1);plot(x,y_fwd,'r');title('正向波');axis([0 10 -2 2]);");
        engEvalString(ep, "subplot(3,1,2);plot(x,y_bwd,'b');title('反向波');axis([0 10 -2 2]);");
        engEvalString(ep, "subplot(3,1,3);plot(x,y_res,'g');title('合成波形');axis([0 10 -4 4]);");
        engEvalString(ep, "drawnow;");
        // 暂停等待界面加载完成
        engEvalString(ep, "uiwait(gcf)");

        mxGetPr(y_fwd);
        mxGetPr(y_bwd);
        mxGetPr(y_res);
        mxDestroyArray(y_fwd);
        mxDestroyArray(y_bwd);
        mxDestroyArray(y_res);
        Sleep(1000);
    }
    // 释放内存并关闭 MATLAB 引擎
    mxDestroyArray(t);
    mxDestroyArray(l);
    mxDestroyArray(x);
    engClose(ep);

    return EXIT_SUCCESS;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^