40223


C言語ライブラリのSwiftラッパーを呼び出して動作するプログラムを動かしています。  
Xcodeは9.1です。またCライブラリラッパーはSwift4.0にコンバートしてビルド済みです。  
プログラム側の設定がSwift Language Versionが3.2だとエラーは出ませんが、4.0だと「Overlapping access
to~」のエラーが発生してしまいます。  
ソースは以下です。

[code]

    func CallErr(_ paramStr : String, returnStr : inout String, resultStr : inout String) {
        print("CallErr")
    
        var ret : Int32 = 0
        var oParam : [Int32] = [Int32](repeating: -1, count: 10)
        var paramCnt = 0
        var err : Int32 = 0
    
        main_proc: while(true){
    
            // preset
            returnStr = ""
            resultStr = ""
            ret = app.PRN_OK
    
            funcName = "getPRLibStatus"
            paramCnt = 3
            for i in 0..<paramCnt {
                oParam[i] = -1
            }
            ret = app.LIB.getPRLibStatus(state: &oParam[0], total: &oParam[1], fin: &oParam[2])　　　//←ここの&oParam[0]がエラー
            if (ret != app.PRN_OK) {
                resultStr = "getPRLibStatus失敗\r\n"
                err = app.LIB.getErrInfo()
                resultStr += "GetErrInfo : " + String(err) + "(" + app.ERR_MSG_MAP[err]! + ")"
                returnStr = "Call_Err : 失敗"
                break main_proc
            }
    
[/code]

エラーメッセージは「Overlapping accesses to 'oParam', but modification requires
exclusive access; consider copying to a local variable」となっています。

どのように修正すれば良いでしょうか。


CC BY-SA 3.0
2017-12-12T06:59:16.233
40211
2017-12-12T11:41:34.820
2017-12-12T10:59:45.193
76
24782
question
swift4
Swift4にコンバートするとOverlapping access to~のエラーが出てしまう。


Swift 4で付け加わったこちらの仕様による制限に引っかかっています。

[SE-0176 Enforce Exclusive Access to Memory](https://github.com/apple/swift-
evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md)

ごくごく大雑把に説明すると、『「一つのもの」をいろんなところから同時に更新しちゃうと厄介なことが起こる場合があるから、そう言うのは禁止しちゃうよ。』(この手の意訳がお嫌いな方は原文を参照願います。)

エラーメッセージにあるようにローカル変数を使ってください。

[code]

        var oState: Int32 = -1
        var oTotal: Int32 = -1
        var oFin: Int32 = -1
        ret = app.LIB.getPRLibStatus(state: &oState, total: &oTotal, fin: &oFin)
        //以下本当に必要なのか不明…
        paramCnt = 3
        oParam[0] = oState
        oParam[1] = oTotal
        oParam[2] = oFin
    
[/code]


CC BY-SA 3.0
2017-12-12T11:41:34.820
40223
2017-12-12T11:41:34.820
13972
40211
answer