Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中结构中嵌入结构的编组数组_C#_Structure_Cudafy.net - Fatal编程技术网

C# C中结构中嵌入结构的编组数组

C# C中结构中嵌入结构的编组数组,c#,structure,cudafy.net,C#,Structure,Cudafy.net,我正在使用CUDAfy.NET,希望将结构中的结构数组传递给设备 我已用c语言声明,如下所示: [Cudafy(eCudafyType.Struct)] [StructLayout(LayoutKind.Sequential)] public struct A { [MarshalAs(UnmanagedType.ByValArray, ArraySubType= UnmanagedType.Struct, SizeConst = 3)] public B[] ba; } [C

我正在使用CUDAfy.NET,希望将结构中的结构数组传递给设备

我已用c语言声明,如下所示:

[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
public struct A
{
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType= UnmanagedType.Struct, SizeConst = 3)]
    public B[] ba;
}

[Cudafy(eCudafyType.Struct)]
[StructLayout(LayoutKind.Sequential)]
public struct B
{
    public byte id;
 }
这将生成GPU的以下源代码:

struct B
{
        unsigned char id;
};


struct A
{
        B ba [3]; 
        int baLen0;
 };
我在试图将其转换为OpenCL代码时遇到了这个编译错误:

Compilation error: <kernel>:20:2: error: must use 'struct' tag to refer to type 'B'
    B ba [3]; int baLen0;
    ^
    struct
我意识到这可能是编组和CUDAfy.NET如何处理结构之间的问题,但是有没有办法解决这个问题


提前感谢

我设法修改了CUDAfy Translator中的CUDAfy.NET库。在结构进入内存流后,我添加了:

        StreamReader sr = new StreamReader(structs);
        String sStructs = sr.ReadToEnd();
        String sNewStructs;
        foreach(string structName in cm.Types.Values.Select(t => t.Name))
        {
            while (true)
            {
                string regex = @"^(?<start>\s+)" + structName + @"(?<end>\s+\S+( \[\d+\])?;)";
                sNewStructs = Regex.Replace(sStructs, regex, @"${start}struct " + structName + "${end}", RegexOptions.Multiline);
                if (sNewStructs.Length == sStructs.Length)
                {
                    break;
                } else
                {
                    sStructs = sNewStructs;
                }
            }
        }
        structs = new MemoryStream();
        StreamWriter sw = new StreamWriter(structs);
        sw.WriteLine(sStructs);
        sw.Flush();

这有点草率,但它可以工作,然后我重建了CUDAfy.NET并合并它,替换了我的dll

,如果你把struct放在B ba[3]之前;并尝试重新编译?如果我从C/C++中正确地记得,非类型定义的结构在引用该值类型时必须包含struct关键字。我相信这是可行的,但是C/C++代码是生成的中间步骤。如果我能以某种方式通过编组来完成它,或者做出改变,使结构不再必要,我相信这个问题会得到解决。