CGO封装C语言qsort函数
2024-08-31 19:10:41
封装qsort函数
package qsort
/*
#include <stdlib.h>
typedef int (*qsort_cmp_func_t)
(const void* a, const void* b);
extern int _cgo_qsort_compare(void* a, void* b);
*/
import "C"
import (
"sync"
"unsafe"
)
var go_qsort_compare_info struct {
fn func(a, b unsafe.Pointer) int
sync.Mutex
}
//export _cgo_qsort_compare
func _cgo_qsort_compare(a, b unsafe.Pointer) C.int {
return C.int(go_qsort_compare_info.fn(a, b))
}
func Sort(base unsafe.Pointer, num, size int, cmp func(a, b unsafe.Pointer) int) {
go_qsort_compare_info.Lock()
defer go_qsort_compare_info.Unlock()
go_qsort_compare_info.fn = cmp
C.qsort(base, C.size_t(num), C.size_t(size),
C.qsort_cmp_func_t(C._cgo_qsort_compare),
)
}
调用qsort.Sort实现排序
package main
//extern int go_qsort_compare(void* a, void* b);
import "C"
import (
"fmt"
"github.com/w3liu/algorithm/books/go-advanced-program/2.6qsort_practice/qsort"
"unsafe"
)
func main() {
values := []int32{42, 9, 101, 95, 27, 25}
qsort.Sort(unsafe.Pointer(&values[0]), len(values),
int(unsafe.Sizeof(values[0])),
func(a, b unsafe.Pointer) int {
pa, pb := (*int32)(a), (*int32)(b)
return int(*pa - *pb)
},
)
fmt.Println(values)
}
最新文章
- Josephus环类问题,java实现
- 在iOS中使用ZXing库[转]
- ZooKeeper日志与快照文件简单分析
- 20145222黄亚奇《Java程序设计》第5周学习总结
- 2013年7月份第1周51Aspx源码发布详情
- H - Frequent values
- mvc+entity framework database first,生成的model每次更新一个表会更新所有的model
- NOIP(提高组)DAY1国王游戏
- 机器视觉工具箱-Machine Vision Toolbox for Matlab
- centos 下 搭建 php 环境
- 知识点2-5:了解Razor语法
- Bootstrap3.0入门学习系列
- (译)Windsor入门教程---第三部分 编写第一个Installer
- RoR - Nested Resources, Security ,pagination
- GNU C 与 ANSI C(下)
- requests模块的cookie和代理操作
- asp.net core中遇到需要自定义数据包解密方法的时候
- 工具类。父类(Pom文件)
- Ubuntu12.04+OpenERP7.0安装笔记
- Servlet的请求转发和重定向