我是Fortran的新手,但我认为Fortran的parameter
类似于在C / C ++中使用#define
。它们相似吗?它们是否以相同的方式使用?我知道#define
是一个预处理程序语句,我不确定这可能导致#define
与parameter
有什么相似之处或不同之处。
答案 0 :(得分:5)
parameter
更类似于C / C ++中的const
声明。这是一个不变的表达。
要在Fortran中获取预处理器,您可以考虑在Fortran代码上使用.F扩展或强制C预处理器
答案 1 :(得分:5)
正如其他答案中的许多细节所述,具有parameter
属性的对象是命名常量。此属性可以在声明中指定,例如在Alexander Vogt给出的examples中或使用parameter
语句。
如果预处理用作#define
,例如
#define int_literal 1
然后,正如其他地方所述,在预处理阶段有文本级替换,因此我们得到的是文字常量。
现在,为什么这种区别很重要?也就是说,两个片段之间是否有任何真正的区别
#define nx 100
real x(nx)
和
integer, parameter :: nx=100
real x(nx)
不是很多,有人可能会想。但是,请考虑
integer, parameter :: hello(*) = [1,2,3]
type(some_type), parameter :: tp = some_type(4,5,6)
我们很难找到合适的#define
,它们可以让我们做任何我们想要的事情,好像我们有那些命名的常量。对于那些命名常量,我们可以使用
print *, hello(2)-PRODUCT(hello(1::2)), tp%b ! For b one of the components.
也就是说,命名常量是数据对象,可以通过文本文本替换以异乎寻常的方式进行操作。
对于真正的病理学,请考虑愚蠢的例子
#define x 2.1
print *, 1/x
和
integer, parameter :: x=2.1
print *, 1/x
为了完整性,参数语句的一个例子是
integer i
parameter (i=1)
答案 2 :(得分:4)
$(document).ready(function() {
var max_fields = 10; //maximum input boxes allowed
var wrapper = $(".input_fields_wrap"); //Fields wrapper
var add_button = $(".add_field_button"); //Add button ID
var x = 1; //initial text box count
$(add_button).click(function(e){ //on add input button click
e.preventDefault();
if(x <= max_fields){ //max input box allowed
$(wrapper).append('<div><input type="text" name="myText' + x + '"/><a href="#" class="remove_field">Remove</a></div>'); //add input box
x++; //text box increment
}
});
$(wrapper).on("click",".remove_field", function(e){ //user click on remove text
e.preventDefault();
$(this).parent('div').remove();
x--;
})
});
</script>
是用于定义宏的预处理器语句。在预处理步骤中,宏被它们的值替换。请注意,预处理器语句不是Fortran标准的一部分。并非每个编译器都支持它们
另一方面,#define
表示一个命名常量(类似于C构造parameter
)。任何变量类型都可用于声明常量。此常量在编译时定义:
const
答案 3 :(得分:2)
PARAMETER确实是一个给你起名的常数值。
#define预处理器命令具有更广泛和更强大的目标:它将字符串替换为程序文本中出现的另一个字符串。替换字符串可以是任何代码片段。这是一种让程序自行修改的方法(就在编译之前)。
例如
#define Operator +
S= 1 Operator 2 Operator 3;
相当于
S= 1 + 2 + 3;
您可以轻松转向
S= 1 - 5 * 2 - 5 * 3;
如果这是有道理的。
不可否认,通过宏定义常量参数是一种旧用法,
#define DAYS_PER_WEEK 5
#define PI 22/7
尽管编译器没有良心认为它们是参数,但它们仍然是纯文本。在此示例中,1/PI
为1/22/7
,其评估为1/154
,而不是7/22
。