pacoyang 发表于 2017-12-19 08:33:07

函数eval在脚本文件和函数文件中使用效果不同

本帖最后由 pacoyang 于 2017-12-19 08:36 编辑

脚本文件a.m调用函数文件aay.m
a.m的语句如下:
clear;
clc;
%
eval('pe=1')
exist('pe')
2.3*pe

aay()



aay.m的语句如下:
function aay()
%
eval('pe=1')
exist('pe')
2.3*pe

实际上两个文件中有三句相同的语句。但是,a.m文件中的三句可以成功执行,aay.m文件中的三句无法正确执行。aay.m运行时,就目前观察到的现象是:第一句执行不报错,视乎也正确执行(字符串没有分号,可以显示pe的值)。第二句可以正确执行,显示有变量pe。第三句报错,显示函数pe的用法有问题。


非常奇怪。奇怪之处
1,同样的三句,在函数文件中无法正确执行
2,函数文件中显示存在变量pe,因为exist(pe)的值为1,而不是2。但是后面无法正确使用;
3,后面使用pe时,显示pe是函数,而不是变量。
4,pe确实是matlab的函数,不是可以重新定义吗?
5,确实,如果不是matlab的函数,比如写为pe3,aay.m中可以正确执行,a.m文件中当然也可以正确执行。


为什么????一不小心,就掉进陷阱了。








pacoyang 发表于 2017-12-20 07:25:37

我注意到matlab的帮助文件有这样一段话。但是还是不能释疑。

Using the eval output argument list is recommended over including the output arguments in the expression string. The first syntax below avoids strict checking by the MATLAB parser and can produce untrapped errors and other unexpected behavior.

eval(' = function(var)')      % not recommended
= eval('function(var)')      % recommended syntax



Phantom28 发表于 2017-12-20 09:25:18

請問你的Matlab是幾版的,我用 2017版顯示正常喔!

pacoyang 发表于 2017-12-20 15:57:51

Phantom28 发表于 2017-12-20 09:25
請問你的Matlab是幾版的,我用 2017版顯示正常喔!

matlab7(因为一直用这个,编号好多东西,害怕换了有啥问题)。

以下是执行时的图片

Phantom28 发表于 2017-12-20 22:33:00

本帖最后由 Phantom28 于 2017-12-20 22:40 编辑

看起來你使用的變數 pe 正好是Matlab內建的工具庫函數 pe.m 同名
我搜尋一下 2017版,沒有 pe.m 這個函式,所以沒問題。改換變數名稱也成功。
請改變變數名稱試試,如 pe1, pea 之類的。
页: [1]
查看完整版本: 函数eval在脚本文件和函数文件中使用效果不同