是否可以在 critcl 中使用函数指针?

问题描述 投票:0回答:1

我开始使用critcl,遇到了一个库需要指向函数的指针的情况。

这是一个更简单的情况:

我想用 C 语言编写一个排序函数,使用 qsort 有点类似于 https://www.geeksforgeeks.org/comparator-function-of-qsort-in-c/ 中的示例 我想用 tcl 编写比较器,如下所示:

proc comparator {p q} {
    if {($p % 2) && ($q % 2)} {
        return [expr {$p > $q} ]
    }
    if {!($p % 2 ) && !($p % 2)} {
        return [expr {$p < $q}]
    }
    if {!($p % 2)} {
        return 1
    }
    return -1
}

我可以使用 critcl(或其他东西)以某种方式将

qsort
与此比较器一起使用吗?

tcl
1个回答
0
投票

我专注于 critcl 因为我不知道 ffidl。我特别想要像

::ffidl::callback
这样的东西。

幸运的是,他们有一个带有 qsort 的示例,我修改后得到:

package require Ffidlrt

::ffidl::callout qsort {pointer-var size_t size_t pointer-proc} void [::ffidl::symbol [::ffidl::find-lib c] qsort]

proc comparator {p q} {
    binary scan [::ffidl::peek $p [::ffidl::info sizeof int]] [::ffidl::info format int] l
    binary scan [::ffidl::peek $q [::ffidl::info sizeof int]] [::ffidl::info format int] r
    if {($l % 2) && ($r % 2)} {
        return [expr {$l < $r} ]
    }
    if {!($l % 2 ) && !($r % 2)} {
        return [expr {$l > $r}]
    }
    if {!($l % 2)} {
        return 1
    }
    return -1
}

::ffidl::callback comparator {pointer pointer} int

set arr "1 6 5 2 3 9 4 7 8"

# Convert to binary, qsort them and back to tcl.
set b_arr [binary format [::ffidl::info format int]* $arr]
qsort b_arr [llength $arr] [::ffidl::info sizeof int] comparator
binary scan $b_arr [::ffidl::info format int]* sorted

puts "Output array is"
puts $sorted

运行它,我得到了预期的结果:

Output array is
9 7 5 3 1 2 4 6 8
© www.soinside.com 2019 - 2024. All rights reserved.