分享

CGO封装C语言qsort函数

 小仙女本仙人 2022-11-19 发布于北京

封装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)
}

github地址

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多