我开始使用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
与此比较器一起使用吗?
我专注于 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