Trace32使用TEXT或HEADER中的宏作为窗口

时间:2017-08-18 22:10:39

标签: trace32 lauterbach

这里有另一个Trace32问题。一周前,我编写了一个新脚本,可以运行我公司从一个中心位置使用的任何命令。当我记得我正在工作的工作区时(因为所有文件位置都与工作区根目录相关),它工作得很好我今天实现了以下代码:

package main

import (
    "log"
    "regexp"
    "strconv"
    "testing"
    "unicode"
)

func IsReal(n []byte) bool {
    if len(n) > 0 && n[0] == '-' {
        n = n[1:]
    }
    if len(n) == 0 {
        return false
    }
    var point bool
    for _, c := range n {
        if '0' <= c && c <= '9' {
            continue
        }
        if c == '.' && len(n) > 1 && !point {
            point = true
            continue
        }
        return false
    }
    return true
}

func BenchmarkIsReal(b *testing.B) {
    p := []byte("15.34234234234")
    for i := 0; i < b.N; i++ {
        ok := IsReal(p)
        if !ok {
            log.Fatalf("NaN")
        }
    }
}

func CheckNumber(p []byte) bool {
    r := string(p)

    sep := 0

    for _, b := range r {
        if unicode.IsNumber(b) {
            continue
        }
        if b == rune('.') {
            if sep > 0 {
                return false
            }
            sep++
            continue
        }
        return false
    }

    return true

}

func BenchmarkFloatStrconv(b *testing.B) {
    p := []byte("15.34234234234")

    for i := 0; i < b.N; i++ {
        _, err := strconv.ParseFloat(string(p), 64)
        if err != nil {
            log.Fatalf("NaN")
        }
    }
}

func BenchmarkFloatRegex(b *testing.B) {
    p := []byte("15.34234234234")
    r := `[-+]?[0-9]*\.?[0-9]`
    c, _ := regexp.Compile(r)

    for i := 0; i < b.N; i++ {
        ok := c.Match(p)
        if !ok {
            log.Fatalf("NaN")
        }
    }
}

func BenchmarkCheckNumber(b *testing.B) {
    p := []byte("15.34234234234")

    for i := 0; i < b.N; i++ {
        ok := CheckNumber(p)
        if !ok {
            log.Fatalf("NaN")
        }
    }
}

我已经忘记多次检查调试控制台了,当我忘记更改工作区时,我不肯挠头。我想做类似以下的事情:

PRINT "Workspace is &WORKSPACE"
; Select the action we want to perform.
DIALOG
(
    HEADER "Select A Task To Run"
    ; Large menu below

但这并没有编译。尝试; Select the action we want to perform. DIALOG ( HEADER &WORKSPACE 无法正常工作,因为标题只是说&#34; HEADER "&WORKSPACE"&#34;而不是给我实际的文件位置(&WORKSPACE)。有没有办法使用宏或变量将窗口标题设置为自定义字符串?我似乎无法找到解决方案。谢谢!

1 个答案:

答案 0 :(得分:3)

这是一个很好的!好消息:有一个解决方案。 (但这很棘手。最后简单的替代解决方案。)

问题是,PRACTICE脚本的宏替换在实际的PRACTICE代码中无处不在。但是,对话框描述不是PRACTICE代码:对话框描述只是嵌入在脚本中。这就像在HTML文件中嵌入图像(例如,通过数据URI)。图像也不是HTML。

显示自定义对话框的命令是DIALOG.view <dlg-file>。但是,DIALOG.view也可以与嵌入式块一起使用(在圆形括号中,它们位于不同的行中)。这就是你做的。

这就是诀窍:如果用(&+替换左括号,整个嵌入块中以&开头的所有单词都替换为PRACTICE宏 - 只要具有该名称的宏存在。

所以你走了:

PRINT "Workspace is &WORKSPACE"
DIALOG
(&+
    HEADER "&WORKSPACE"
    ; Large menu here...
)

请注意,宏替换会在DIALOG块中显示无处不在。这可能会导致不必要的副作用 - 特别是如果您在DIALOG中嵌入了PRACTICE代码。 E.g:

DIALOG
(
    BUTTON "Push me"
    (
        PRIVATE &myfile
        DIALOG.File.open *.txt
        ENTRY %LINE &myfile
        PRINT "You picked file '&myfile'"
    )
)

如果为Dialog-block启用了现在的宏替换,它还将替换PRIVATE和ENTRY命令的&amp; myfile,这通常不是您想要的。

但是,如果您明确禁用宏替换到DIALOG中嵌入的PRACTICE脚本,并使用&#34;(&amp; - &#34;。那么你应该得到:

DIALOG
(&+
    HEADER "&WORKSPACE"        
    BUTTON "Push me"
    (&-
        PRIVATE &myfile
        DIALOG.File.open *.txt
        ENTRY %LINE &myfile
        PRINT "You picked file '&myfile'"
    )
)

其他解决方法是定义一个宏&amp; myfile,它实际上包含文本&#34;&amp; myfile&#34;:

LOCAL &WORKSPACE &myfile
&WORKSPACE="Select A Task To Run"
&myfile="&"+"myfile"    // <- This is the trick!
DIALOG
(&+
    HEADER "&WORKSPACE"        
    BUTTON "Push me"
    (
        PRIVATE &myfile
        DIALOG.File.open *.txt
        ENTRY %LINE &myfile
        PRINT "You picked file '&myfile'"
    )
)

如果你掌握了这件事,你就会成为一名实践大师!

这是另一个更容易的解决方案,用于自定义自定义对话框的TEXT和HEADER:

  • 在DIALOG命令之前,使用WinPOS命令替换DIALOG描述中的HEADER语句。
  • 用DYNTEXT替换DIALOG描述中的TEXT语句,并用DIALOG.Set
  • 设置DIALOG描述之外的文本。

E.g:

PRIVATE &myheader &mytext
&myheader="Select A Task To Run"
&mytext="zaphod beeblebrox is an awesome frood"
WinPOS ,,,,,,,"&myheader"
DIALOG
(
  POS 0 0 30. 1
  DlgText1: DYNTEXT ""             
)
DIALOG.Set DlgText1 "&mytext"

第二种方法只是避免在DIALOG描述中进行宏替换。所以这不是问题的确切答案,但可能是对实际问题的更好解决方案。