获取堆栈跟踪从GEANT(Getting stack trace from geant)

2019-10-31 04:59发布

我尝试编译项目(参见这太问题 )使用御坊编译器和它的工具,我收到错误消息指的标准库equal(..) 我敢肯定,误差在标准库中的某个地方有我的代码,而不是,但我不知道如何得到一些更多的信息geant 。 我想知道哪些类,功能,从我的代码的代码行调用equal(..)或者可以称之为任何其他标准库函数。 是的,我已经尝试过经历的一切equal(..)在我的代码秒。

错误消息我得到的是这样的:

[嘘声]类SQL_GENERATOR_TSQL65(ANY,95.8):的实际参数#1型“STRING_8”不符合为类型“类‘UC_STRING’在特征形式参数的“UC_STRING”`is_equal

这指向library\free_elks\src\elks\kernel\any.e

    frozen equal (a: detachable ANY; b: like a): BOOLEAN
        -- Are `a' and `b' either both void or attached
        -- to objects considered equal?
    do
        if a = Void then
            Result := b = Void
        else
            Result := b /= Void and then
                        a.is_equal (b) -- <<<<<<< THIS LINE
        end
    ensure
        definition: Result = (a = Void and b = Void) or else
                    ((a /= Void and b /= Void) and then
                    a.is_equal (b))
    end

Answer 1:

报道称CAT-调用是系统错误(而不是错误类),即表现为对整个系统的分析结果。 类UC_STRING重新定义了功能is_equal 。 因此,它只能与类型的参数被用于UC_STRING (或其后代)。

某些代码对待UC_STRINGSTRING_8UC_STRING从继承STRING_8 )。 只要UC_STRING连接到类型的实体STRING_8 ,代码是在获得CAT-呼叫的风险。 下面是一个例子:

s: STRING_8
t: STRING_8
u: UC_STRING
...
s := u
if equal (s, t) then ...

的代码equal你提到的呼叫is_equal上的一个实例UC_STRING ,但接收STRING_8作为参数。 然而,版本is_equalUC_STRING只能处理UC_STRING作为参数,而不是STRING_8 。 这就是为什么你的错误。

这个问题可以通过解决

  • 改变的参数类型is_equalUC_STRING接受STRING_8
  • 去除所有reattachments UC_STRINGSTRING_8
  • 禁用CAT调用错误

最后一个似乎是在你的情况最好。



文章来源: Getting stack trace from geant