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

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

如何將 C.double 數(shù)組傳遞給 Cgo 函數(shù)?

如何將 C.double 數(shù)組傳遞給 Cgo 函數(shù)?

Go
千萬(wàn)里不及你 2023-05-15 10:20:46
我剛剛開(kāi)始使用 CGo,我正在嘗試將數(shù)據(jù)發(fā)送到 C 庫(kù),該庫(kù)對(duì)浮點(diǎn)數(shù)/雙精度數(shù)組執(zhí)行統(tǒng)計(jì)計(jì)算。我現(xiàn)在想弄清楚的是如何將一組浮點(diǎn)數(shù)或 C.double 發(fā)送到具有如下簽名的 CGo 函數(shù):double pop_mean(int numPoints, double a[])我已經(jīng)弄清楚如何進(jìn)入 C.int 那里,但我無(wú)法弄清楚如何發(fā)送雙打數(shù)組。我還沒(méi)有看到任何關(guān)于這件事的博客文章或 SO 問(wèn)題,所以我想我會(huì)問(wèn)。以下是我迄今為止的最大努力。// Get a basic function to work, while passing in an ARRAY  arr := make([]C.double, 0)arr = append(arr, C.double(10.0))arr = append(arr, C.double(20.0))arr = append(arr, C.double(30.0))var fixedArray [3]C.double = arr[:]// ptr := C.CBytes(arr)// defer C.free(unsafe.Pointer(ptr))coolMean := C.pop_mean(3, &fixedArray)fmt.Println("pop_mean (10, 20, 30): ", coolMean)這是我得到的錯(cuò)誤:./main.go:64:6: cannot use arr[:] (type []_Ctype_double) as type [3]_Ctype_double in assignment./main.go:69:35: cannot use &fixedArray (type *[3]_Ctype_double) as type *_Ctype_double in argument to _Cfunc_pop_mean我應(yīng)該如何將 C.double 數(shù)組傳遞給代碼?
查看完整描述

2 回答

?
陪伴而非守候

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

將數(shù)組名傳遞給函數(shù)時(shí),傳遞的是初始元素的位置。在被調(diào)用的函數(shù)中,這個(gè)參數(shù)是一個(gè)局部變量,所以數(shù)組名參數(shù)是一個(gè)指針,即一個(gè)包含地址的變量。

C 程序設(shè)計(jì)語(yǔ)言,第 2 版


切片類(lèi)型

切片是底層數(shù)組的連續(xù)段的描述符,并提供對(duì)該數(shù)組中元素編號(hào)序列的訪問(wèn)。

與數(shù)組一樣,切片是可索引的并且具有長(zhǎng)度??梢酝ㄟ^(guò)內(nèi)置函數(shù) len 發(fā)現(xiàn)切片 s 的長(zhǎng)度;與數(shù)組不同,它可能會(huì)在執(zhí)行期間發(fā)生變化。這些元素可以通過(guò)整數(shù)索引 0 到 len(s)-1 尋址。給定元素的切片索引可能小于基礎(chǔ)數(shù)組中同一元素的索引。

切片一旦被初始化,總是與保存其元素的底層數(shù)組相關(guān)聯(lián)。

Go 編程語(yǔ)言規(guī)范


參考:Go 命令 cgo


對(duì)于切片a,C 函數(shù)的參數(shù)pop_mean(int numPoints, double a[])len(a),切片底層數(shù)組的長(zhǎng)度,以及&a[0],切片底層數(shù)組的第一個(gè)元素的地址。


在 Go 中,我們經(jīng)常將細(xì)節(jié)隱藏在函數(shù)中。例如,一個(gè)popMean函數(shù),

package main


import (

? ? "fmt"

)


/*

double pop_mean(int numPoints, double a[]) {

? ? if (a == NULL || numPoints == 0) {

? ? ? ? return 0;

? ? }

? ? double mean = 0;

? ? for (int i = 0; i < numPoints; i++) {

? ? ? ? mean+=a[i];

? ? }

? ? return mean / numPoints;

}

*/

import "C"


func popMean(a []float64) float64 {

? ? // This is the general case, which includes the special cases

? ? // of zero-value (a == nil and len(a) == 0)

? ? // and zero-length (len(a) == 0) slices.

? ? if len(a) == 0 {

? ? ? ? return 0

? ? }

? ? return float64(C.pop_mean(C.int(len(a)), (*C.double)(&a[0])))

}


func main() {

? ? a := make([]float64, 10)

? ? for i := range a {

? ? ? ? a[i] = float64(i + 1)

? ? }


? ? // slice

? ? fmt.Println(len(a), a)

? ? pm := popMean(a)

? ? fmt.Println(pm)


? ? // subslice

? ? b := a[1:4]

? ? fmt.Println(len(b), b)

? ? pm = popMean(b)

? ? fmt.Println(pm)


? ? // zero length

? ? c := a[:0]

? ? fmt.Println(len(c), c)

? ? pm = popMean(c)

? ? fmt.Println(pm)


? ? // zero value (nil)

? ? var z []float64

? ? fmt.Println(len(z), z, z == nil)

? ? pm = popMean(z)

? ? fmt.Println(pm)

}

輸出:


10 [1 2 3 4 5 6 7 8 9 10]

5.5

3 [2 3 4]

3

0 []

0

0 [] true

0


查看完整回答
反對(duì) 回復(fù) 2023-05-15
?
素胚勾勒不出你

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

我發(fā)現(xiàn)您必須發(fā)送指向數(shù)組中第一個(gè)值的指針,而不是發(fā)送指向切片第一個(gè)元素或切片本身的指針。


而且我還遇到了一個(gè)問(wèn)題,我創(chuàng)建了一個(gè)新變量,該變量被分配了切片中第一項(xiàng)的值,后來(lái)創(chuàng)建了一個(gè)指向該變量的指針(不再是原始數(shù)組的一部分),而不是創(chuàng)建指向數(shù)組中第一項(xiàng)的指針(就像我想要的那樣)。


下面是工作代碼,帶有注釋以幫助避免上面段落中的問(wèn)題。


// Get a basic function to work, while passing in an ARRAY


// Create a dummy array of (10,20,30), the mean of which is 20.

arr := make([]C.double, 0)

arr = append(arr, C.double(10.0))

arr = append(arr, C.double(20.0))

arr = append(arr, C.double(30.0))

firstValue := &(arr[0]) // this notation seems to be pretty important... Re-use this!

// if you don't make it a pointer right away, then you make a whole new object in a different location, so the contiguous-ness of the array is jeopardized.

// Because we have IMMEDIATELY made a pointer to the original value,the first value in the array, we have preserved the contiguous-ness of the array.

fmt.Println("array length: ", len(arr))


var arrayLength C.int

arrayLength = C.int(len(arr))

// arrayLength = C.int(2)


fmt.Println("array length we are using: ", arrayLength)


arrayMean := C.pop_mean(arrayLength, firstValue)

fmt.Println("pop_mean (10, 20, 30): ", arrayMean)

這會(huì)產(chǎn)生以下結(jié)果:


array length:  3

array length we are using:  3

pop_mean (10, 20, 30):  20

或者,如果我們?nèi)∠⑨寣?arrayLength 更改為 2 的行,我們將得到以下結(jié)果:


array length:  3

array length we are using:  2

pop_mean (10, 20, 30):  15


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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