第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將 FILE 指針傳遞到 C 函數(shù)

將 FILE 指針傳遞到 C 函數(shù)

Go
波斯汪 2022-08-01 17:14:20
我的 C 函數(shù)采用 FILE 指針的地址(指向指針的指針)。我從Go調(diào)用此方法。有人可以給我一個(gè)在Go中調(diào)用約定的示例代碼行嗎?FILE **fpC 庫(kù)代碼(將創(chuàng)建 .so 文件):int fileOpen(char *filename, char* mode, FILE **fp){*fp  = fopen (filename, mode); if (*fp ==NULL)   return -1; return 0;}int fileread(FILE *fp,char *buff ){        if((fp!=NULL)&&( fgets ( buff, 50, fp) != NULL ) )        {                return 0;        }  return -1;}int fileclose(FILE *fp){  fclose(fp);  return 0;}import "C"type (        fileptr C.FILE)func opencfile(name string, mode string) int {        var fp *fileptr        return (int)(C.fileOpen(C.CString(name), C.CString(mode), C.FILE(&fp)));}我收到錯(cuò)誤無(wú)法將_cgoBase2(類(lèi)型 **fileptr) 轉(zhuǎn)換為類(lèi)型 _Ctype_struct__IO_FILE問(wèn)題:這是調(diào)用 C 方法的正確方法嗎?如何從Go傳遞文件指針的地址?或如何解決上述錯(cuò)誤。所謂的“C”方法原型是:int fileOpen(char *filename, char* mode, FILE **fp);更新:這是我的最新代碼:C 代碼(.c 文件)#include "fileOp_lib.h"int fileOpen(char *filename, char* mode, fileptr *out){    FILE *fp  = fopen(filename, mode);    if (fp == NULL) {        *out = 0;        return -1;    }    *out = (fileptr) fp;    return 0;}int fileread(fileptr fp, char *buff){    if( (fp != 0) && (fgets(buff, 50, (FILE*)fp) != NULL) )        return 0;    return -1;}int fileclose(fileptr fp){    fclose((FILE*)fp);    return 0;}頭文件(.h 文件)#include <stdio.h>typedef unsigned int fileptr;int fileOpen(char *filename, char* mode, fileptr *out);//int fileread(FILE *fp,char *buff ); temp. commented//int fileclose(FILE *fp);圍棋代碼package main/*#cgo LDFLAGS: -L./SAMPLE/ -lfileop#include "fileOp_lib.h"*/import "C"type (        fileptr uintptr)func opencfile(name string, mode string) int {        var fp fileptr;        return (int)(C.fileOpen(C.CString(name), C.CString(mode), (&fp)));}func main(){        var e int;        e = opencfile("data.txt","r");}
查看完整描述

2 回答

?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

與其搞砸更多的層,不如從Go正確調(diào)用原始C代碼。請(qǐng)參閱 JimB 的評(píng)論或下面的示例。


請(qǐng)注意,原始的C代碼是...不是很好,而且考慮到除了C代碼之外什么都沒(méi)有,使用Go I / O例程可能會(huì)更好,這些例程更安全,更容易正確。想必?zé)o論你擁有什么真正的C代碼都要復(fù)雜得多。您遺漏的部分可能需要對(duì)C和Go都有深入的了解才能連接。


下面是編譯和運(yùn)行(并創(chuàng)建一個(gè)空)的代碼。file.txt


package main


// #include <stdio.h>

// #include <stdlib.h>

// int fileOpen(char *filename, char *mode, FILE **fp) {

//      *fp = fopen(filename, mode);

//      if (*fp == NULL)

//              return -1;

//      return 0;

// }

//

// int fileread(FILE *fp, char *buff) {

//      if ((fp != NULL) && (fgets(buff, 50, fp) != NULL)) {

//              return 0;

//      }

//      return -1;

// }

//

// int fileclose(FILE *fp) {

//      fclose(fp);

//      return 0;

// }

import "C"


import (

        "fmt"

        "unsafe"

)


func opencfile(name string, mode string) (ret int, fp *C.FILE) {

        cname := C.CString(name)

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

        cmode := C.CString(mode)

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

        ret = int(C.fileOpen(cname, cmode, &fp))

        return

}


func main() {

        ret, fp := opencfile("file.txt", "w")

        if ret >= 0 {

                defer C.fileclose(fp)

        }

        fmt.Printf("result of opencfile was %d\n", ret)

}



查看完整回答
反對(duì) 回復(fù) 2022-08-01
?
30秒到達(dá)戰(zhàn)場(chǎng)

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

我不知道將a從Go傳遞到C的正確語(yǔ)法(如果可能的話(huà))。但是,如果您可以更改C代碼,我建議您不要公開(kāi)對(duì)互操作不兼容類(lèi)型的直接訪問(wèn)。我會(huì)建議更像這樣的東西:FILE**FILE


#include <stdint.h>


typedef uintptr_t fileptr;


int fileOpen(char *filename, char* mode, fileptr *out){

    FILE *fp  = fopen(filename, mode);

    if (*fp == NULL) {

        *out = 0;

        return -1;

    }

    *out = (fileptr) fp;

    return 0;

}


int fileread(fileptr fp, char *buff){

    if( (fp != 0) && (fgets(buff, 50, (FILE*)fp) != NULL) )

        return 0;

    return -1;

}


int fileclose(fileptr fp){

    fclose((FILE*)fp);

    return 0;

}

import "C"


...


var fp uintptr

C.fileOpen(..., &fp);

...

c.fileRead(fp, ...);

...

C.fileClose(fp);


查看完整回答
反對(duì) 回復(fù) 2022-08-01
  • 2 回答
  • 0 關(guān)注
  • 186 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)