在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 884|回复: 16

[求助] 求助SKILL 运行报can't handle (floatStruct......)问题!!

[复制链接]
发表于 2024-10-20 23:14:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
      在创建一个shielding path的菜单初步阶段,简化找到问题的代码段。发现菜单和运行主函数相互交互过程中,一直报所定义的获取菜单内输入数值赋予的变量,它的类型不对的问题?!debug了下找不原因在哪?代码和问题图示如下:
如图中所示,通过printf发现是在报mainPathWidth 和 subPathWidth  这类变量是floatStruct的这种类型格式,无法进行计算。不知是什么原因?麻请大佬们指教!谢谢!

90e881c840283f9f6bceecb99063a3e.jpg




;load testChoiceMode.il
procedure(makeThree()
    myAppForm ~> choiceType ~> value == "Three"
    threeLayerShielding()
    pathRadioField_CB(1)
);end proc

procedure(makeTwo()
    myAppForm ~> choiceType ~> value == "Two"
    twoLayerShielding()
    pathRadioField_CB(2)
);end proc

procedure(testChoiceModeForm()
    let((myAppForm)
        choiceType = hiCreateRadioField(
            ?name 'mppType
            ?choices list("Three" "Two")
            ?defValue "Three"
            ?prompt " "
            ?callback list("makeThree()" "makeTwo()")
        );end choice

    layer1 = hiCreateCyclicField(
        ?name 'layer1
        ?prompt "layer1"
        ?value "METAL1"
        ?enabled t
        ?choices list("METAL1" "METAL2" "METAL3" "METAL4")
    );end upLayerName

    layer2 = hiCreateCyclicField(
        ?name 'layer2
        ?prompt "layer2"
        ?value "METAL2"
        ?enabled t
        ?choices list("METAL1" "METAL2" "METAL3" "METAL4")
    );end middleLayerName

    mainPathWidth = hiCreateFloatField(
        ?name 'mainPathWidth  
        ?prompt "Main layer width"
        ?value 0.38
        ?defValue 0.38
        ?range '(0.38 5.0)
        ?editable t
    );end mainPathWidth

    subPathWidth = hiCreateFloatField(
        ?name 'subPathWidth  
        ?prompt "Sub layer width"
        ?value 0.38
        ?defValue 0.38
        ?range '(0.38 5.0)
        ?editable t
    );end mainPathWidth

    separa = hiCreateSeparatorField(?name 'separa)

    myAppForm = hiCreateAppForm(
        ?name   'myAppForm
        ?formTitle  "createCustomerPathMpp"
        ?fields list(choiceType mainPathWidth subPathWidth layer1 layer2 separa)
        ?callback list("createMppCB()")
        ?buttonLayout 'OKCancelApply
    );end myAppForm
    hiDisplayForm('myAppForm)

    );end let
);end proc

procedure(createMppCB()
let((layer1 layer2)
        mainPathWidth = myAppForm ~> mainPathWidth ~> value
        subPathWidth  = myAppForm ~> subPathWidth ~> value
        layer1 = myAppForm ~> layer1 ~> value
        layer2 = myAppForm ~> layer2 ~> value

    );end let
);end proc


procedure(pathRadioField_CB(radio)
    if(radio == 1 then
        myAppForm ~> layer1 ~> enabled = t
        myAppForm ~> layer2 ~> enabled = t
        myAppForm ~> layer2 ~> invisible = nil
    else
        myAppForm ~> layer1 ~> enabled = t
        myAppForm ~> layer2 ~> enabled = t
        myAppForm ~> layer2 ~> invisible = t
    );end if
);end procedure


procedure(threeLayerShielding()
    let((three)
        three = 3
        printf("%d\n" three)
        t3a = mainPathWidth + 1
        t3b = subPathWidth + 1
        printf("t3a = %L t3b = %L" t3a t3b)
    );end let
);end proc


procedure(twoLayerShielding()
    let((two)
        two = 2
        printf("%d\n" two)
        t2a = mainPathWidth + 1
        t2b = subPathWidth + 1
        printf("t2a = %L t2b = %L" t2a t2b)
    );end let
);end proc


hiSetBindKey("Layout" "Shift<Key>h" "testChoiceModeForm()")














发表于 2024-10-20 23:37:56 | 显示全部楼层
代码中:




  1. t3a = mainPathWidth + 1
  2. t3b = subPathWidth + 1


复制代码

改成:




  1. t3a = mainPathWidth~>value + 1
  2. t3b = subPathWidth~>value + 1


复制代码

就可以了
 楼主| 发表于 2024-10-21 05:51:49 来自手机 | 显示全部楼层
谢谢!我再试下!
 楼主| 发表于 2024-10-21 09:34:05 | 显示全部楼层


amodaman 发表于 2024-10-20 23:37
代码中:

改成:


再请教下,为什么这里已经赋值mainPathWidth = myAppForm ~> mainPathWidth ~> value,但在主函数中还要再额外给于赋值下?谢谢~
发表于 2024-10-21 10:14:37 | 显示全部楼层
你梳理一下数据流的走向,就知道,你的主函数threeLayerShielding()和twoLayerShielding() 并没有主动去调用GUI myAppForm这部分, 你是依靠myAppForm预先在内存里面先初始化了之后,再产生了全局变量 mainPathWidth。 所以这是两段分离的程序。要连接在一起,需要在threeLayerShielding()和twoLayerShielding() 中调用GUI这部分。
 楼主| 发表于 2024-10-21 11:54:34 | 显示全部楼层
谢谢!
发表于 2024-10-21 12:56:52 | 显示全部楼层
其实改起来也很简单

1)先把myAppForm这个局部变量的声明去掉,其实作为一个好习惯,所有的GUI都不应该成为局部变量。 你想想看,作为一个可以操作到的GUI, 设置成局部变量会有非常不方便的地方,没什么明显的好处。GUI就是全局。

2)在你的两个主函数 makeThree()和makeTwo()的第一行,增加一句




  1. testChoiceModeForm()


复制代码


代码改动和运行结果如图所示:


code.png
run.png
发表于 2024-10-21 13:39:27 | 显示全部楼层
 楼主| 发表于 2024-10-21 14:22:41 | 显示全部楼层


amodaman 发表于 2024-10-21 12:56
其实改起来也很简单

1)先把myAppForm这个局部变量的声明去掉,其实作为一个好习惯,所有的GUI都不应该成 ...


感谢!!感谢!!刚又试下,但在我这运行后,还是会报下can't handle的ERROR,还报了myAppForm的warning。myAppForm那个变量赋值位置需要做什么处理么?!

图1

图1

图2

图2

 楼主| 发表于 2024-10-21 14:30:48 | 显示全部楼层


YuSHL 发表于 2024-10-21 13:39
https://bbs.eetop.cn/thread-971422-1-1.html


谢谢!同步也参考下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-18 17:44 , Processed in 0.022647 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表