立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 1292|回复: 0

[分享] FLAC3D FISH语言的讲解

[复制链接]
发表于 2025-1-25 06:04 | 显示全部楼层 |阅读模式

登陆有奖并可浏览互动!

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录 手机动态码快速登录

×
循环命令LOOP
四种有效的循环结构是:


循环和结束循环之间的FISH行重复执行,直到满足某些条件。



形式1

在第一种形式中,它使用一个数字计数器,var最初被赋予expr1的值,并在每次循环执行结束时由expr3递增,直到它达到一个大于expr2的值。如果没有给出expr3,则默认值为1。此时可以选择使用local语句将var创建为函数的局部变量。注意expr1、expr2和expr3(它们可能是任意的代数表达式)在循环开始时计算;在循环中重新定义它们的组件变量对循环执行的次数没有影响。Var是单个整型变量;它可以在循环内的表达式中使用(如果它是一个全局变量,甚至可以在循环内调用的函数中使用),甚至可以重新定义。下面的代码片段演示了该表单的基本用法,即对指定值以下的所有整数求和。
fish define sum(n)
    local s = 0
    loop local i (1,n)
        s += i  
    endloop
    sum = s
end
[s = sum(10)]
list @s

fish define sum_even(n)
    local s = 0
    loop local i (0,n,2)
        s += i
    endloop
    sum_even = s
end
[s2 = sum_even(10)]
list @s2
对于n=10,函数的最终结果是@s = 55和@s2 = 30。注意,循环值可以是整数,也可以是实数,通过对expr3使用负值,它可以从一个较大的值变为一个较小的值。



形式2

在循环结构的第二种形式中,当测试条件为真时,执行循环体;否则,控制将传递到endloop语句之后的下一行。检验的形式与if语句所描述的形式相同。表达式可能包括浮点变量和整数;在适用于if语句的相同条件下,也允许使用布尔值、字符串和指针。下面的代码片段演示了这种形式的基本用法,即对指定值以下的所有偶数求和。
fish define sum_even(n)
    local s = 0
    local i = 0
    loop while i <= n
        s += i
        i +=2
    endloop
    sum_even = s
end
[s2 = sum_even(10)]
list @s2当n = 10时,总和的最终结果是30。



形式3

第三种形式的循环结构的主要功能是在测试条件为真时,重复执行循环体,类似于loop while形式。但是,另外,loop for构造提供包含初始化字段和修改字段的特定位置。因此,这个循环是专门设计来执行一个带有计数器的重复操作的,该计数器在每次迭代时都被初始化和修改。它的工作方式如下:

  • 执行初始化。通常它是计数器变(可以是局部的或全局的)的初始值设置。这只执行一次。
  • 检查条件。如果为真,循环继续;否则,循环结束,循环体不执行。
  • 执行循环体。
  • 最后,执行modify字段中指定的内容,循环回到步骤2。
下面的代码片段演示了这种形式的基本用法,即对指定值以下的所有奇整数求和。
fish define sum_odd(n)
    local s= 0
    loop for (local i=1, i <=n, i+=2)
        s += i  
    endloop
    sum_odd = s
end
[s_odd = sum_odd(10)]
list @s_odd
当n = 10时,总和的最终结果是25。
循环语句的前三种形式可以进行对比。在第一个循环中,测试是在循环结束时完成的(所以至少要通过一次循环);在第二个和第三个循环中,测试是在循环开始时完成的(所以如果测试一开始是假的,循环将被绕过)。



形式4

循环语句的第四种形式是一种专门的语法,允许遍历给定容器内的所有对象。在这种情况下,expr1必须返回一个指向列表的指针,或者一个对象容器。例如,用户定义标量列表中的所有标量都由FISH固有的user.scalar.list返回。与第一个循环形式一样,可以在var前面加上local语句,表示要创建一个局部变量而不是全局变量。Var将被赋值为连续指向列表中每个对象的指针。如果在循环处理过程中删除var,则只要删除后var不在同一个循环中再次引用,循环就会正常继续。如果容器中的其他项被删除(例如,如果调用一个删除容器内容的函数),那么循环可能会提前退出。
fish define scalar_location
    loop foreach local pnt data.scalar.list
        io.out(data.scalar.pos(pnt))
    endloop
end
循环可以嵌套到任何深度。在循环中,exit loop语句可用于跳出循环并在endloop语句之后继续处理。此外,continue语句可用于停止处理当前循环并继续执行下一个循环。

原文地址:https://zhuanlan.zhihu.com/p/407448546
楼主热帖
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表