如何在项目深处使用多个常量?
How to use several constants deep down a project?
我的问题很容易通过创建一个结构并将其用作全局变量来解决,但正如我听说应该避免使用全局变量一样,我想知道优雅的替代方法。所以问题是:
想象一长串始终保持不变的数组,这些常量仅在项目中很深的函数中使用,就像想象以下序列:
main -> 调用 a -> 调用 b -> ... -> 调用需要常量的 n..
所以我想:
- 在 main 中创建一个结构并将其设置为全局(我正在寻找替代方案)。
- 创建一个结构并将其作为参数传递给不同的子例程,但它们在 a,b,...,n-1 中什么都不做。这增加了我不喜欢的 99% 函数中的无用参数列表。
- 直接在第 n 个函数中创建常量,但这意味着创建这些变量 1000 次,假设我的函数 n 在 运行 中被调用 1000 次,这听起来很愚蠢,因为它们是常量。
我遇到的另一个问题与此类似。
我想知道如何从 FORTRAN 中执行类似 common// 的操作,因为我可能想在有限数量的子例程 (~10%) 之间共享通用(可变)值,但它们在 90% 的子例程中是无用的。
PS: 全局变量还有一个问题,当项目变大时,我可能会在不知情的情况下重复一些变量名。
您应该在内部函数中计算值并将它们存储在 persistent variables 中。
要在一小组相关函数之间共享值,您可以将这些函数定义为子函数(在同一个 m 文件中)。父函数中定义的变量在子函数中可见。
--
编辑:
查看链接页面中的示例:
function arrayToXLS(A, xlsfile, x1, x2)
persistent dblArray;
if isempty(dblArray)
disp 'Writing spreadsheet file ...'
xlswrite(xlsfile, A);
end
disp 'Reading array from spreadsheet ...'
dblArray = xlsread(xlsfile, 'Sheet1', [x1 ':' x2])
fprintf('\n');
您声明了持久变量。第一次调用该函数时,它是一个空数组。因此,您的函数必须检查变量是否使用 isempty
设置,如果尚未设置,它可以计算存储在变量中的值。
您可以使用三种方法:
1) 传递常量结构作为参数。这更健壮。为结构使用短名称,如 'C',这样它不会在代码中占用太多 space。
2) struct C 是在带有持久变量的函数内部创建的:
function [ C ] = GetConstants()
persistent Consts
if isempty(Consts)
C = struct;
%System
C.MAX_USERS=160;
Etc;
C=orderfields(C);
Consts=C;
else
C=Consts;
end
end
3) 两种方法都使用,在主程序中使用 C 作为参数(当然,使用 C = GetConstant() 加载它)。在非常深入或非常罕见的访问函数中直接使用 GetConstants()。
4) 不要为此使用全局变量。常量应该是访问速度最快的内存,而不是最慢的。
我的问题很容易通过创建一个结构并将其用作全局变量来解决,但正如我听说应该避免使用全局变量一样,我想知道优雅的替代方法。所以问题是:
想象一长串始终保持不变的数组,这些常量仅在项目中很深的函数中使用,就像想象以下序列:
main -> 调用 a -> 调用 b -> ... -> 调用需要常量的 n..
所以我想:
- 在 main 中创建一个结构并将其设置为全局(我正在寻找替代方案)。
- 创建一个结构并将其作为参数传递给不同的子例程,但它们在 a,b,...,n-1 中什么都不做。这增加了我不喜欢的 99% 函数中的无用参数列表。
- 直接在第 n 个函数中创建常量,但这意味着创建这些变量 1000 次,假设我的函数 n 在 运行 中被调用 1000 次,这听起来很愚蠢,因为它们是常量。
我遇到的另一个问题与此类似。
我想知道如何从 FORTRAN 中执行类似 common// 的操作,因为我可能想在有限数量的子例程 (~10%) 之间共享通用(可变)值,但它们在 90% 的子例程中是无用的。
PS: 全局变量还有一个问题,当项目变大时,我可能会在不知情的情况下重复一些变量名。
您应该在内部函数中计算值并将它们存储在 persistent variables 中。
要在一小组相关函数之间共享值,您可以将这些函数定义为子函数(在同一个 m 文件中)。父函数中定义的变量在子函数中可见。
--
编辑:
查看链接页面中的示例:
function arrayToXLS(A, xlsfile, x1, x2)
persistent dblArray;
if isempty(dblArray)
disp 'Writing spreadsheet file ...'
xlswrite(xlsfile, A);
end
disp 'Reading array from spreadsheet ...'
dblArray = xlsread(xlsfile, 'Sheet1', [x1 ':' x2])
fprintf('\n');
您声明了持久变量。第一次调用该函数时,它是一个空数组。因此,您的函数必须检查变量是否使用 isempty
设置,如果尚未设置,它可以计算存储在变量中的值。
您可以使用三种方法:
1) 传递常量结构作为参数。这更健壮。为结构使用短名称,如 'C',这样它不会在代码中占用太多 space。
2) struct C 是在带有持久变量的函数内部创建的:
function [ C ] = GetConstants()
persistent Consts
if isempty(Consts)
C = struct;
%System
C.MAX_USERS=160;
Etc;
C=orderfields(C);
Consts=C;
else
C=Consts;
end
end
3) 两种方法都使用,在主程序中使用 C 作为参数(当然,使用 C = GetConstant() 加载它)。在非常深入或非常罕见的访问函数中直接使用 GetConstants()。
4) 不要为此使用全局变量。常量应该是访问速度最快的内存,而不是最慢的。