【问题标题】:C# - Converting String array to sbyte** (String[] to sbyte**)C# - 将字符串数组转换为 sbyte**(String[] 到 sbyte**)
【发布时间】:2015-08-21 04:08:28
【问题描述】:

XFunction 是托管 C++ 代码(包装器)的 CLI。 我想在我的 C# 项目中使用 XFunction(int,sbyte**) 并将字符串数组转换为 sbyte**。

sbyte[][] sbytes = new sbyte[7][];
for (int argCounter = 0; argCounter < 7 ; argCounter++)
{   
     //get the byte array
     byte[] bytes = Encoding.ASCII.GetBytes(argument[argCounter]);
    //convert it to sbyte array
    sbytes[argCounter] = new sbyte[bytes.Length];
    for (int i = 0; i < bytes.Length; i++)
    sbytes[argCounter][i] = (sbyte)bytes[i];
}

当我打电话时:

XFunction(7,sbytes);

和buid,产生这个错误:

'XFunction(int, sbyte**)' 的最佳重载方法匹配有 一些无效参数 参数 2:无法从 'sbyte[][]' 转换 到'sbyte**'

我该如何解决这个错误???

【问题讨论】:

    标签: c# arrays pointers clr command-line-interface


    【解决方案1】:

    解决方法:

                sbyte[][] sbytes = new sbyte[6][];
                for (int argCounter = 0; argCounter < 6 ; argCounter++)
                {   
                    get the byte array
                    byte[] bytes = Encoding.ASCII.GetBytes(argument[argCounter]);
                    convert it to sbyte array1
                    sbytes[argCounter] = new sbyte[bytes.Length];
                    for (int i = 0; i < bytes.Length; i++)
                        sbytes[argCounter][i] = (sbyte)bytes[i];
                }
                unsafe
                {
                    fixed (sbyte* junk = &sbytes[0][0])
                    {
                        sbyte*[] arrayofptr = new sbyte*[sbytes.Length];
                        for (int i = 0; i < sbytes.Length; i++)
                        {
                            fixed (sbyte* ptr = &sbytes[i][0])
                            {
                                arrayofptr[i] = ptr;
                            }
                        }
                        fixed (sbyte** ptrptr = &arrayofptr[0])
                        {
                            XFunction(7, ptrptr);                            
                        }
                    }
                }
    

    【讨论】:

    • fixed 的文档说“在执行语句后,任何固定的变量都被取消固定并受到垃圾回收。因此,不要指向固定语句之外的那些变量。”您现在正在使用单独的固定语句收集指向 arrayofptr 的指针,这意味着如果垃圾收集在错误的时间命中,则指针可能指向内存中的无效数据。这就是我选择递归方法的原因。因此请注意,您可能会在使用此解决方案时遇到问题。
    【解决方案2】:

    您需要使用fixed 来获取指向您的数组的指针并防止垃圾收集器重新定位您的变量。

    你可能想做这样的事情:

    public static unsafe void CallXFunction(int a, sbyte[][] array)
    {
        var pointerArray = new sbyte*[array.Length];
    
        // Recursive fixing so that whole array get's pinned at same time   
        // (never use fixed pointer outside of fixed{} statement)
        Action<int> fixArray = null;   
        fixArray = (pos) =>
        {
            fixed (sbyte* ptr = array[pos])
            {
                pointerArray[pos] = ptr;
    
                if (pos <= (array.Length - 2))
                {
                    fixArray(pos + 1);
                }
                else
                {
                    fixed (sbyte** pointer = pointerArray)
                    {
                        XFunction(a, pointer);
                    }
                }
            }
        };
    
        fixArray(0);
    }
    

    【讨论】:

    • 谢谢,但除此之外,还需要for循环!
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 2015-03-09
    • 2018-10-28
    • 2018-09-10
    • 2011-03-12
    • 2014-06-25
    • 1970-01-01
    • 2023-01-24
    相关资源
    最近更新 更多