Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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语言中的转换/端口PDWORD代码 我把一些代码从C++转换成C,我需要一些关于如何处理这些代码的见解: PDWORD rgb32_data = (PDWORD) malloc(640*480*4);_C#_C++_Arrays_Integer - Fatal编程技术网

C# C语言中的转换/端口PDWORD代码 我把一些代码从C++转换成C,我需要一些关于如何处理这些代码的见解: PDWORD rgb32_data = (PDWORD) malloc(640*480*4);

C# C语言中的转换/端口PDWORD代码 我把一些代码从C++转换成C,我需要一些关于如何处理这些代码的见解: PDWORD rgb32_data = (PDWORD) malloc(640*480*4);,c#,c++,arrays,integer,C#,C++,Arrays,Integer,据我所知,PDWORD类型表示32位无符号整数。实现类似结构的好C策略是什么 编辑:我发现我需要使用一个IntPtr来替换PDWORD,但是IntPtr将保存一个值,而不是数组中的多个值。有什么建议吗 EDIT2:Uint[]s对我不起作用-不幸的是,我能使程序编译的唯一方法,以及它的所有依赖项,是当我输入IntPtr作为参数时,而不是IntPtr[] 谢谢 编辑-我已标记解决方案,此外,我还需要执行以下操作: 因为我需要IntPtr转换,所以我添加了以下代码 IntPtr rg

据我所知,PDWORD类型表示32位无符号整数。实现类似结构的好C策略是什么

编辑:我发现我需要使用一个IntPtr来替换PDWORD,但是IntPtr将保存一个值,而不是数组中的多个值。有什么建议吗

EDIT2:Uint[]s对我不起作用-不幸的是,我能使程序编译的唯一方法,以及它的所有依赖项,是当我输入IntPtr作为参数时,而不是IntPtr[]

谢谢

编辑-我已标记解决方案,此外,我还需要执行以下操作:

因为我需要IntPtr转换,所以我添加了以下代码

        IntPtr rgb32_ptr; 
        GCHandle handle = GCHandle.Alloc(rgb32_data, GCHandleType.Pinned);
        try
        {
            rgb32_ptr = handle.AddrOfPinnedObject();
        }
        finally
        {
            if (handle.IsAllocated)
            {
                handle.Free();
            }
        }

以获取相同的IntPtr

PDWORD是指向DWORD的指针。有几个选项可以将代码转换为C,具体取决于它的使用方式


对于DWORD本身,可以使用System.UInt32作为等效项。AllocHGlobal可能是一个替代品,但我们需要看看它将如何使用。您是自己访问内存还是将其传递给另一个非托管函数?

PDWORD是指向32位无符号整数的指针。在C中,这将是参考uint32。如果您使用的是32位运行时,也可以使用IntPtr

这取决于你将如何使用它。如果要将其传递给非托管代码,那么我建议使用ref UInt32。例如,如果您将其用于内存分配,则需要使用IntPtr。根据,PDWORD定义为:

typedef DWORD*  PDWORD;
它是一个指向DWORD的指针,MSDN是一个无符号32位整数,换句话说,是一个uint

注意,C++代码行为640×480=307200个dWord数组分配内存。 您可以直接将其翻译为:

uint[] rgb32_data = new uint[640 * 480];
但是代码可能真的希望将其用作内存中的一系列字节,因此您可能希望使用字节数组

byte[] rgb32_data = new byte[640 * 480 * 4];

并使用中的方法,特别是如果您认为该方法更接近原始程序处理数据的方式的话。

您可以使用不安全的指针和Marshal.AllocHGlobal


如何使用IntPtr?我将此添加到我的编辑中。IntPtr不会只给我一个值吗?我可以使用什么样的引用?@sparkFinder:您只需要分配一个数组。Lucas Jones的答案可能就是你想要的。这是我最初做的——不幸的是,我能让程序编译的唯一方法,以及它的所有依赖项,是当我输入一个IntPtr作为参数,而不是IntPtr[]@sparkFinder时:我无法想象在这里必须使用一个IntPtr数组。你能给我们提供更多的上下文吗?这对我来说很难做到,只是最终将rgb32_数据作为参数的方法需要一个IntPtr作为其参数。我怎样才能用一个软件包我的代码呢?我在考虑使用IntPtr[]而不是这里也建议使用的uint[],但是我只能使用IntPtr,这正是我之前的评论想要说的。我是C语言的新手,所以我可能错过了一些关键概念。干杯:接得好。我应该意识到他正在寻找一个数组。由于最初的代码是PDWORD,我怀疑第一个是一个无符号整数数组。是的,这就是我所做的。除此之外,由于需要IntPtr转换,我添加了以下代码GCHandle handle=GCHandle.Allocrgb32Source,GCHandleType.pinted;尝试{rgb32_data=handle.addrofpindedObject;}最后{if handle.IsAllocated{handle.Free;}
    Program()
    {            
        unsafe
        {
            IntPtr ptr = Marshal.AllocHGlobal(640 * 480 * 4);

            uint* ptr2 = (uint*)ptr.ToPointer();

            for (int i = 0; i < 640*480; i++)
            {
                ptr2[i] = 0;
            }

            Marshal.FreeHGlobal(ptr);
        }
    }