tcl错误“预期浮点数但得到了”

时间:2017-06-10 12:09:24

标签: tcl

我在OpenSees程序中使用tcl(参见this问题)。 OpenSees在TCL中提供的一个命令是block2D,其语法如下:

block2d $nx $ny $e1 $n1 element elementArgs {
1 $x1 $y1 <$z1>
2 $x2 $y2 <$z2>
3 $x3 $y3 <$z3>
4 $x4 $y4 <$z4>
}

在我的具体案例中,我正在做以下事情:

#geometric parameters
set nx 4
set ny 2
set elwidth 1.0
set elheight 1.0
set blockwidth [expr $nx*$elwidth]
set blockheight [expr $ny*$elheight]

block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" {
    1 0.0 0.0
    2 $blockwidth 0.0
    3 4.0 2.0
    4 0.0 2.0
}

block2D命令中使用的变量在开头设置。不幸的是,当我运行此脚本时,我收到以下错误:

WARNING block2D numX? numY? startNode? startEle? eleType? eleArgs?: invalid node coordinate for node: 1
expected floating-point number but got "$blockwidth"

我不明白为什么会这样。其他OpenSees命令允许传入变量。为什么这个会有所不同?

我已经在expr变量上尝试了evalblockwidth命令的不同变体和嵌套......一切都无济于事......

1 个答案:

答案 0 :(得分:1)

问题是你在这个命令中要求一个未取代的文字:

block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" {
    1 0.0 0.0
    2 $blockwidth 0.0
    3 4.0 2.0
    4 0.0 2.0
}

{大括号} 实际上的意思是什么。除了你想要替换它之外什么都没关系。有几种明智的方法可以做到这一点:

使用"双引号"

block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" "
    1 0.0 0.0
    2 $blockwidth 0.0
    3 4.0 2.0
    4 0.0 2.0
"

使用subst命令

block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" [subst {
    1 0.0 0.0
    2 $blockwidth 0.0
    3 4.0 2.0
    4 0.0 2.0
}]

使用list构建列表

block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" [list \
    1 0.0 0.0 \
    2 $blockwidth 0.0 \
    3 4.0 2.0 \
    4 0.0 2.0 \
]

第三个选项在性能方面可能是最好的,但第二个选项可能更具可读性(尽管速度最慢),特别是如果你不喜欢像第一个选项那样使用多行“字符串”。