C++ Scilab汇编“;无法分配此内存量“;

C++ Scilab汇编“;无法分配此内存量“;,c++,c,scilab,C++,C,Scilab,编译后,我在Scilab中面临内存分配问题 我正在ppc64(POWER8)上的红帽上编译。堆栈限制已设置为无限(ulimit-s unlimited)。/configure脚本(带有几个我在这里没有显示的选项)成功运行,但是make all失败并停止。当它停止时,会在Scilab命令提示符处显示以下消息: ./bin/scilab-cli -ns -noatomsautoload -f modules/functions/scripts/buildmacros/buildmacros.sce

编译后,我在Scilab中面临内存分配问题

我正在ppc64(POWER8)上的红帽上编译。堆栈限制已设置为无限(
ulimit-s unlimited
)。
/configure
脚本(带有几个我在这里没有显示的选项)成功运行,但是
make all
失败并停止。当它停止时,会在Scilab命令提示符处显示以下消息:

./bin/scilab-cli -ns -noatomsautoload -f modules/functions/scripts/buildmacros/buildmacros.sce
stacksize(5000000);
                   !--error 10001
stacksize: Cannot allocate memory.
%s: Cannot allocate this quantity of memory.

at line      27 of exec file called by :
exec('modules/functions/scripts/buildmacros/buildmacros.sce',-1)

-->
我已经进行了一些调查,在
buildmatros.sce
中的
00027行调用了错误消息,其中调用了函数
stacksize(5000000)

此功能在中定义:

 scilab-5.5.1/modules/core/sci_gateway/c/sci_stacksize.c
我在此页面上找到了文件的版本:。 在我看来,触发消息的假条件似乎出现在第00295行

在该文件中,只要作为输入提供的
stacksize
大于从类中获取\u scilab\u stack()的
get\u max\u memory\u方法返回的值,就会显示该错误:

scilab-5.5.1/modules/core/src/c/stackinfo.c
我在以下页面再次在线找到了一个版本: 该方法是从第
109行声明的

它似乎调用了一个名为
MAXLONG
的变量,但该变量从未明确声明过!如您所见,它被声明了好几次(行
00019
00035
00043
00050
),但所有行都被注释了![更正:这些行没有注释,这是我对#作为注释符号的错误理解,但不是]

因此我猜测:
MAXLONG
未声明,因此函数不返回值(或返回0),因此会触发错误消息,因为作为输入给定的
stacksize
大于0或
NULL
N/a

我的问题是:

  • 为什么定义了MAXLONG的所有行都要注释
  • MAXLONG来自哪里?它是从内核传递的吗
  • 我怎样才能解决这个问题
谢谢

PS-我试图取消对
buildmacros
中的行的注释,它编译和安装时没有出现问题。但是,当我启动scilab cli时,它再次显示相同的消息


进一步调查后编辑:

经过进一步的调查,我发现我所认为的注释实际上是编译器的指令。。。但是我保留了我的错误,所以我的问题的答案是可以理解的

以下是我的新观点

在Scilab中,我注意到通过给输入stacksize越界,调用了相同的方法
get\u max\u memory\u for\u Scilab\u stack()
,以获取上限。我看到的下限是默认定义的

-->stacksize(1)
             !--error 1504
stacksize: Out of bounds value. Not in [180000,268435454].
此外,所使用的堆栈大小似乎很好:

-->stacksize()
 ans  =

    7999994.    332.
但是,当尝试在中间为这样的值提供输入时,它失败了

-->stacksize(1)
             !--error 1504
stacksize: Out of bounds value. Not in [180000,268435454].
它似乎调用了一个名为MAXLONG的变量

它不是一个变量,而是一个预处理器宏

为什么定义了MAXLONG的所有行都要注释

你应该向评论台词的人询问这个问题。在scilab-5.5.1中没有对它们进行评论

MAXLONG来自哪里?它是从内核传递的吗

它在文件
scilab-5.5.1/modules/core/src/c/stackinfo.c
中定义。它被定义为与标准c库(
头)定义的
LONG\u MAX
相同的值。如果宏不是由标准库提供的,那么它将被定义为其他特定于平台的值

我怎样才能解决这个问题


如果您的问题源于缺少对
MAXLONG
的定义,则必须对其进行定义。一种方法是取消对定义它的行的注释。或者重新下载原始源代码,因为您的源代码似乎与官方源代码不匹配。

它的定义如下:
stackinfo.c行00035#define MAXLONG_MAX
,它应该是2GB,所以最大值应该是2GB/8或256M。非常感谢您的回答!糟糕的是,我认为所有这些“#”意味着这些行都被注释了,但实际上不,这不是注释符号,它们是编译器的实际输入。我有原始的源代码,因此我将进一步查看
limits.h
和其他宏。如果我搜索limits.h库,我会发现很多库(其中一个是Advance Tolchain,ppc64平台的一组特定编译器库)。如何获取编译器在编译过程中使用的库?您可以尝试将
#error
指令逐个添加到文件中,直到程序停止编译。另一方面,标准头不保证在文件中,因此可能没有使用您找到的任何文件。谢谢!但我刚刚发现如何找到这些头文件的位置。您需要运行:
cpp-v
,您将看到编译器在哪里查找
limits.h
。然而,在这些文件中,LONG\u MAX的定义如下:
define LONG\u MAX\uu LONG\u MAX\uu
。这正常吗?这是什么意思?@Andrea是的,这很正常。这意味着
LONG\u MAX
被定义为
的值<代码>\uuuu LONG\u MAX\uuuu
是另一个标识符,可能是一个预处理器宏。它是由实现定义的,你可以通过它以双下划线开始来判断。这些标识符是为实现保留的。