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

Can I describe a shared variable in multiple C++ functions that can be called in Octave?

是否可以保留由 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, args, , "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 的类型简化了示例。我知道我可以 return 它到 Octave 并为两个函数提供 x 的更新值。然而,x的类型实际上是一个结构,我无法实现return到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, args, , "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中找到不同的方法。