Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk memanggil fungsi C yang mengubah memori pergi?

Bagaimana untuk memanggil fungsi C yang mengubah memori pergi?

WBOY
Lepaskan: 2024-02-05 22:36:03
ke hadapan
1204 orang telah melayarinya

Bagaimana untuk memanggil fungsi C yang mengubah memori pergi?

Kandungan soalan

Andaikan saya mempunyai fungsi C yang ditandatangani

// myclib.h

void modify(double* ptr, int N);
Salin selepas log masuk

Ini menukar memori yang ditunjuk oleh penunjuk parameter ptr.

Adakah kod berikut selamat dengan pemungut sampah Go? Adakah anda memerlukan runtimer.Pinner?

package main

// #cgo CFLAGS: -g -Wall
// #include "myclib.h"
import "C"
import (
    "fmt"
    "runtime"
)

func modifyWrapper(v []float64) {
    ptr := (*C.double)(&v[0])
    N := (C.int)(len(v))

    pinner := runtime.Pinner{}
    pinner.Pin(ptr)
    C.modify(ptr, N)
    pinner.Unpin()
}

func main() {
    v := []float64{9.0, 2.0, 1.0, 4.0, 5.0}
    modifyWrapper(v)
}
Salin selepas log masuk


Jawapan betul


<小时/>
package main

/*
#cgo CFLAGS: -g -Wall
#include <stdio.h>
void modify(double* ptr, int N) {
    if (!ptr || N <= 0) {
        return;
    }
    printf("modify: %g %d\n", *ptr, N);
    *ptr = 42;
    printf("modify: %g %d\n", *ptr, N);
}
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func modify(v []float64) {
    ptr := (*C.double)(unsafe.SliceData(v))
    N := (C.int)(len(v))
    C.modify(ptr, N)
}

func main() {
    v := []float64{9.0, 2.0, 1.0, 4.0, 5.0}
    fmt.Println(v)
    modify(v)
    fmt.Println(v)
}
Salin selepas log masuk
<小时/>
[9 2 1 4 5]
modify: 9 5
modify: 42 5
[42 2 1 4 5]
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk memanggil fungsi C yang mengubah memori pergi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan