【问题标题】:How to find out which variable is triggering Matlab warning about global variables如何找出哪个变量触发了有关全局变量的 Matlab 警告
【发布时间】:2018-06-25 18:38:55
【问题描述】:

我正在 Linux 上使用 Matlab R2018a。我收到警告消息:

“警告:局部变量的值可能已更改为与全局变量匹配。未来版本的 MATLAB 将要求您在使用该变量之前将变量声明为全局变量。”

警告伴随着文件名和行号,但那一行有几个变量,所以我想知道消息指的是哪一个。

有没有办法找出警告所抱怨的变量?

有没有办法将警告变成错误?也许这会让解决问题变得更容易,而不是仅仅容忍它。

【问题讨论】:

  • 在 MATLAB 2017b 中,您也会收到该警告,但只有当您实际使用变量 before 时,您才将其声明为 global。无论你想在哪里使用全局变量,你都必须先将它声明为global!该警告仅表示在以后的版本中你不能再写foo = 3; global foo;,但你必须在使用它之前将其声明为全局变量,无论是作为局部变量还是全局变量。
  • Robert,触发警告的那一行是类似于global foo bar baz 的行,不是吗?如果您可以发布生成警告的函数,并告诉我们是哪一行生成了此警告,那就太好了。我猜它使用局部变量foo 进行一些计算,然后将foo 声明为全局变量。更改局部变量的名称将避免警告。
  • @CrisLuengo 是的,和你猜的一样。干得好!
  • 罗伯特,我已经更新了我的答案,它现在指出了一种找出哪个变量给你带来麻烦的方法。

标签: matlab global-variables


【解决方案1】:

在您将变量声明为全局变量但该变量已用作局部变量的行上触发此错误:

baz = 3;
% ... much later...
global foo bar baz

要找出其中哪些变量已定义,您可以在global 行设置断点,然后查看当时存在哪些变量。

您还可以在此行之前添加who 命令,并在生成警告之前观察程序的控制台输出。

找到触发错误的变量名后,您可以使用该名称重命名 local 变量,而 global 变量保持不变。

感谢@flawr 和@SardarUsama,他们在MATLAB chat 上帮助弄清楚了这条警告信息的含义。


以下是原始答案的一部分,它显示了一种确定变量是否为全局变量的方法。


作为@Durkee suggestedwhos global 将列出全局变量。您可以以编程方式使用它来测试“全局性”:

~isempty(whos('global','varname'))

(请注意isglobal used to be a function in MATLAB a long time ago,但已被删除)。

【讨论】:

    【解决方案2】:

    尝试在代码中的某处输入whos global

    global global_var
    global_var = 1;
    clear global_var
    whos global
    

    它应该显示作为全局变量列出的所有变量。遗憾的是,找到该变量的定义位置并不那么简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2014-01-14
      • 2019-04-27
      • 1970-01-01
      • 2013-07-16
      相关资源
      最近更新 更多