为了账号安全,请及时绑定邮箱和手机立即绑定

从 go 更改 *C.char 的正确方法

从 go 更改 *C.char 的正确方法

Go
弑天下 2023-05-04 17:40:33
我是 go 和 cgo 的新手,在浏览互联网一段时间后,我还没有想出一种从 go 中更改 char* 的好而快速的方法。从 go& 更改 *C.char 的最快方法是什么这是我的代码和我尝试更改字符串的尝试(它不起作用)package asciiEngine// #include <windows.h>import "C"type Screen struct {    Width, Height int    Length        C.ulong    Data          *C.char    GoData        string    HConsole      C.HANDLE    BytesWritten  C.DWORD    Start         C.COORD}func (s Screen) Draw() {    C.WriteConsoleOutputCharacter(s.HConsole, s.Data, s.Length, s.Start, &s.BytesWritten)}func CreateScreen(width, height int) Screen {    screen := Screen{        Width:        width,        Height:       height,        Length:       C.ulong(width * height),        Data:         (*C.char)(C.malloc(C.ulonglong(width * height))),        HConsole:     C.CreateConsoleScreenBuffer(C.GENERIC_READ|C.GENERIC_WRITE, 0, nil, C.CONSOLE_TEXTMODE_BUFFER, nil),        BytesWritten: 0,    }    screen.GoData = C.GoString(screen.Data) // my attempt to get a reference to the C string    //C.SetConsoleActiveScreenBuffer(screen.HConsole)    return screen}主要去:package main// #include "stdio.h"// void print(char* data) {//  printf(data);// }import "C"import (    "fmt"    "github.com/demantar/ascii-engine")func main() {    screen := asciiEngine.CreateScreen(100, 50)    C.print((*C.char)(screen.Data))    fmt.Println()    screen.GoData = "askdssdfselkkskdkflsekfjdkjfksjeflsdkfjjekdjflskasdfkksdjjekdskdfjkskd"    C.print((*C.char)(screen.Data))}输出PP我对 C 也很陌生,我正在这样做,因为我找不到一个库来做这件事
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

例如,用作底层C数组的gDataGo切片引用。bytecDatachar


package main


import (

    "fmt"

    "unsafe"

)


/*

#include <stdlib.h>

#include <stdio.h>

#include <string.h>


int printData(unsigned char *data) {

    return printf("cData: %lu \"%s\"\n", (long unsigned int)strlen(data), data);

}

*/

import "C"


func main() {

    // Allocate C data buffer.

    width, height := 8, 2

    lenData := width * height

    // add string terminating null byte

    cData := (*C.uchar)(C.calloc(C.size_t(lenData+1), C.sizeof_uchar))


    // When no longer in use, free C allocations.

    defer C.free(unsafe.Pointer(cData))


    // Go slice reference to C data buffer,

    // minus string terminating null byte

    gData := (*[1 << 30]byte)(unsafe.Pointer(cData))[:lenData:lenData]


    // Write and read cData via gData.

    for i := range gData {

        gData[i] = '.'

    }

    copy(gData[0:], "Data")

    gData[len(gData)-1] = 'X'

    fmt.Printf("gData: %d %q\n", len(gData), gData)

    C.printData(cData)

}

输出:


gData: 16 "Data...........X"

cData: 16 "Data...........X"


查看完整回答
反对 回复 2023-05-04
  • 1 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信