我可以在可以在 Octave 中调用的多个 C++ 函数中描述一个共享变量吗?

问题描述

是否可以保留由 Octave 调用的多个 C++ 函数共享的状态变量?我试图在下面解释我在做什么:

#include <iostream>
#include <octave/oct.h>
#include "stdlib.h"

int x = 0;

DEFUN_DLD(foo,args,"foo"){
    x++;
    std::cout << "foo=" << x << "\n";
    octave_value_list retVal = ovl(x);
    return retVal;
}

DEFUN_DLD(bar,"bar"){
    x++;
    std::cout << "bar=" << x << "\n";
    octave_value_list retVal = ovl(x);
    return retVal;
}

在我用 mkoctfile 编译上述 .cpp 文件后,我可以在 Octave 中调用它们。我对这段代码的期望是在每次调用 foo 和 bar 时将全局变量 x 增加 1。显然 foo 和 bar 函数在不同的上下文中识别 x 。当我调用 foo 和 bar 时,两个函数都会在屏幕上打印 1。有没有办法定义一个两个函数都可以访问的公共变量?

顺便说一下,我通过更改 x 的类型来简化示例。我知道我可以将它返回给 Octave 并用 x 的更新值提供两个函数。但是,x 的类型实际上是一个结构体,我无法实现返回 Octave。

解决方法

根据评论中的信息,你是这样编译的:

mkoctfile -c sandbox.cpp
mkoctfile -o foo sandbox.o
mkoctfile -o bar sandbox.o

相反,您应该这样做:

mkoctfile sandbox.cpp -o sandbox
ln -s sandbox.oct foo.oct
ln -s sandbox.oct bar.oct

有关详细信息,请参阅手册中的相关页面:https://octave.org/doc/v6.1.0/Overloading-and-Autoloading.html#Overloading-and-Autoloading

,

您可以将静态变量放在共享库中并创建两个链接到共享库的 .oct 文件:

x.h
//---------------
extern int x;


x.cc
//---------------
#include "x.h"
int x = 0;


foo.cc
//---------------
#include <iostream>
#include <octave/oct.h>
#include "stdlib.h"
#include "x.h"

DEFUN_DLD(foo,args,"foo"){
    x++;
    std::cout << "foo=" << x << "\n";
    octave_value_list retVal = ovl(x);
    return retVal;
}


bar.cc
//---------------
#include <iostream>
#include <octave/oct.h>
#include "stdlib.h"
#include "x.h"

DEFUN_DLD(bar,"bar"){
    x++;
    std::cout << "bar=" << x << "\n";
    octave_value_list retVal = ovl(x);
    return retVal;
}

在 Windows 上,所有文件都位于同一目录中并使用它就足够了:

g++ -shared -o libx.dll x.cc

mkoctfile -lx foo.cc
mkoctfile -lx bar.cc

在 Linux 上,您需要将包含 libx.so 的目录添加到 LD_LIBRARY_PATH 环境变量并使用:

g++ -shared -o libx.so x.cc

mkoctfile -lx foo.cc
mkoctfile -lx bar.cc

如果其中一个函数被清除,共享变量将保留在内存中。只有当两个功能都被清除时才被清除。

,

可以在 Octave discussion group 中为未来的读者找到不同的方法。