程序的目的是把 "Data/Cemento"文件的数据转化为2维纹理贴图  
读文件的子程序如下: 
AUX_RGBImageRec *Texture::LoadBMP2(const char *Filename) 

FILE *File=NULL; // ÎļþÖ¸Õë 
AUX_RGBImageRec *pData ; 
pData=(AUX_RGBImageRec *)malloc(sizeof(AUX_RGBImageRec)); 
pData-> sizeX = 256; 
pData-> sizeY = 256; 
pData-> data=(unsigned char*)malloc(pData-> sizeX*pData-> sizeY); 
if (!Filename) 

return NULL; // Èç¹ûÎļþÖ¸Õë²»´æÔÚ£¬Ôò·µ»Ø 
} File=fopen(Filename,"rb");// ºËʵÎļþÊÇ·ñ´æÔÚ if (File)  // Èç¹ûÎļþ´æÔÚ 

fread(pData-> data,pData-> sizeX*pData-> sizeY,1,File); 
fclose(File); 
return pData; 
} return NULL; // Èç¹û¶ÁÈëʧ°Ü£¬Ôò·µ»ØNULL 
} 主函数读取文件并转化为纹理: 
// ×°Èëλͼ²¢½«Î»Í¼×ª»»ÎªÎÆÀí 
int Texture::LoadTextures() 

FILE *File=NULL; // ÎļþÖ¸Õë int Status=FALSE; // ×´Ì¬Ö¸Ê¾Æ÷ AUX_RGBImageRec *TextureImage[1]; // ´´½¨±£´æÎÆÀíµÄ¿Õ¼ä 
     
memset(TextureImage,0,sizeof(void *)*1);   if (TextureImage[0]=LoadBMP2("Data/Cemento")) 
{ Status=TRUE; // ÉèÖÃ״̬ 
glGenTextures(1, &texture[0]); // ´´½¨µÚ0ºÅÎÆÀí // Éú³É MipMapped ÎÆÀí 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); 
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,TextureImage[0]-> sizeX, TextureImage[0]-> sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]-> data); } 
调试TextureImage[0](红字)得返回值正确,读出了“Data/Cemento”的数据; 最终程序在gluBuild2DMipmaps(绿色)出现访问0xc00000005:access violate错误;  
程序是在xp系统vc6.0下调试 哪儿可能有错误阿? 新手求指点

解决方案 »

  1.   

    是我疏忽了  红色的是这一句 if (TextureImage[0]=LoadBMP2("Data/Cemento"))  
    绿色的是:gluBuild2DMipmaps(GL_TEXTURE_2D, 3,TextureImage[0]->  sizeX, TextureImage[0]->  sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->  data); } 
    有可能是什么问题吗? 望指点 
      

  2.   

    glGenTextures(1, &texture[0]); 这个函数会重写texture数组的内容,因为第二个参数是一个输出参数,所以之前获得的内存指针已经泄露了,而且指针指向的内存位置已经变了。
      

  3.   

    恩 windows下进入成汇编码调试了 这个我不会
    目前就是在源码进行的调试/结果老是非法地址 /
      

  4.   

    没关系 
    怀疑fread(pData->  data,pData->  sizeX*pData->  sizeY,1,File); 这一句 
    /我是用fwrite写了同样大的一块数据到File中/现在用fread读文件里面的数据/就如程序在File=fopen(Filename,"rb");之后就直接fread File文件了/这样读是否正确?? 不需要删除文件的一些格式,属性等数据就直接读取可以吗? /
    PS:这样读取方法得到的pData->data前面的部分正确,所以之前没有怀疑它
      

  5.   

    问0xc00000005:access violate错误是指针越界造成的。
    我觉得问题出在pData->  data=(unsigned char*)malloc(pData->  sizeX*pData->  sizeY); //数据大小是等于
    //pData->  sizeX*pData->  sizeY?
    //有没有考虑每个象素占几个字节
    if (!Filename)  
    {  
    return NULL; // Èç¹ûÎļþÖ¸Õë²»´æÔÚ£¬Ôò·µ»Ø  
    }  File=fopen(Filename,"rb");// ºËʵÎļþÊÇ·ñ´æÔÚ  if (File)  // Èç¹ûÎļþ´æÔÚ  
    {  
    fread(pData->  data,pData->  sizeX*pData->  sizeY,1,File); //不要去除文件头吗? 
    fclose(File);  
    return pData;  
    }  
      

  6.   

    第一个疑问:像素是8位深度的 ,pData->  sizeX*pData->  sizeY 是实际需要的数据大小;我试着在数据块后面补加了int(0)来表示数据结尾,但同样无济于事
    二;使用fwrite的wb方式写了同样大的一块数据到File,是不是要去除文件头我也没经验;不过不管是写文件之前的数据块data1,写成的文件File(用二进制打开查看),还是从文件读入的数据data2,调试可见部分都是一致的;是否要去掉文件头,有经验的大侠指点下 ~
      

  7.   

    解决问题了
    类似pData->  data=(unsigned char*)malloc(pData->  sizeX*pData-> sizeY);  
    都改为
    pData->  data=(unsigned char*)malloc(pData->  sizeX*pData-> sizeY*sizeof(int));
    程序是可以运行起来,也带来一些问题,很不理解为什么要这么改才行;以后再请教,谢谢以上各位
      

  8.   

    我也是遇到这个问题...百度过来的,不过后来我找到原因了.
    原因应该是你载入的BMP图片的问题,使用gluBuild2DMipmaps()函数的时候,载入的图片的长宽要是2*N,即图片的长度和宽度不能为奇数,你可以在载入的时候特殊处理一下,或者给个限制条件.