我是把c++做的程序转换成c#程序,
1.对c++中参数类型是void*,而实际上是对应的一维数组的地方,我这样做通过:
IntPtr p = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, (uint)m_pImgData.Length);
if (p == IntPtr.Zero)
{
   throw new OutOfMemoryException();
}
 else
{
       Marshal.Copy(m_pImgData, 0, p, m_pImgData.Length);
}
GLU.gluBuild2DMipmaps(GL.GL_TEXTURE_2D, 3, _imgbmpWidth2, g_imgbmpHeight2, GL.GL_BGR_EXT, GL.GL_UNSIGNED_byte, p);//第七个参数类型声明为IntPtr
LocalFree(p);
2.对对c++中参数类型是GLvoid*,而实际上是对应的二维数组的地方,我这样做通过:
object np = m_terrain;//m_terrain是浮点型二维数组
GL.glVertexPointer(3,GL.GL_FLOAT,0,ref np);//第三个参数类型声明为ref object3.可是现在有个这样的函数
glDrawElements(GL_TRIANGLE_STRIP,bmpHeight*2,GL_UNSIGNED_INT,&m_index[x*g_terbmpHeight1*2+bmpStartH*2)];
//原型是glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
//m_index是一维整数数组,
请教第三个地方怎么转换成c#程序?我用前两种方法都不行了,报错。

解决方案 »

  1.   

    虽然我很像回复点有意义的,但看到这一大堆代码就头发蒙……
    代码最好用csdn的标记
    这样杂乱的看的头疼。
      

  2.   

    不好意思
    1、我不知道怎样用csdn标记
     
    glDrawElements(GL_TRIANGLE_STRIP,bmpHeight*2,GL_UNSIGNED_INT,&m_index[x*g_terbmpHeight1*2+bmpStartH*2)];
    //原型是glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
    //m_index是一维整数数组,
    2.c#怎样传址?
    加入一个数组
    int[] a=new int[5];
    怎样a[3]地址才传给别人? 
      

  3.   

    IntPtr,或者...
    直接用void*
      

  4.   

    .c#怎样传址?
    加入一个数组
    int[] a=new int[5];
    怎样a[3]地址才传给别人? 貌似托管代码是做不到的
      

  5.   

    fixed(int*pa= a)
    {
    int *pa3= pa+3; //pa3就是a[3]的地址
    }
      

  6.   

    一种IntPtr封送处理,一种用unsafe关键词之后,可以使用指针了
      

  7.   

    不让用不安全代码,
    怎么用IntPtr封送处理?
      

  8.   

            IntPtr hglobal = Marshal.AllocHGlobal(100);
            void*   stemp   =   hglobal.ToPointer();   
            //call       glDrawElements (...)
            Marshal.FreeHGlobal(hglobal);这样好像可以试试。
      

  9.   

    int[] a=new int[5];
    //取a[3]的地址
    IntPtr addr=System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(a,3)