破windows

brood 2000-05-11 09:04:00
我做了一个3DS格式转换程序
//---------------------------------------------------------------------------

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//---------------------------------------------------------------------------
typedef struct {
float vx,vy,vz;
}Vexes;
typedef struct {
char nx[15],ny[15],nz[15]; //法向量
char fx1[15],fy1[15],fz1[15]; //vex1
char fx2[15],fy2[15],fz2[15]; //vex2
char fx3[15],fy3[15],fz3[15]; //vex3
}Faces;
char temp_name[255],OutputPath[255];
FILE *fp,*fpout;
Vexes *vexes,vcenter;
Faces *faces;
unsigned long file_count;

/*----------------------------Convert Float----------------------------------*/
void convfloat(float sour,char task[15])
{int i;
if(sour>0) sprintf(task,"+%e",sour);
else sprintf(task,"%e",sour);

for(i=15;i>=12;i--)
{if(i>12) task=task[i-1];
else task='0';}
}
unsigned char ReadChar ()
{unsigned char i;
i=fgetc(fp);
file_count++;
return i;
}
/*--------------------------Basic Function------------------------------------*/
unsigned int ReadInt ()
{
unsigned int temp= ReadChar();
return ( temp and (ReadChar () << 8));
}

unsigned long ReadLong ()
{
unsigned long temp1,temp2;

temp1=ReadInt ();
temp2=ReadInt ();

return (temp1+(temp2*0x10000L));
}

unsigned int ReadChunkId()
{return (ReadInt());
}

unsigned long ReadChunkLength ()
{
return (ReadLong());
}

int ReadName ()
{
unsigned int teller=0;
unsigned char letter;

strcpy (temp_name,"Default name");

letter=ReadChar ();
if (letter==0) return (-1); // dummy object
temp_name [teller]=letter;
teller++;

do
{
letter=ReadChar ();
temp_name [teller]=letter;
teller++;
}
while ((letter!=0) && (teller<12));

temp_name [teller-1]='.';//加扩展名
temp_name[teller]='h';
temp_name[teller+1]='j';
temp_name[teller+2]='p';
temp_name[teller+3]=0;

return (0);
}

void JumpTo(long i)
{long a;
for(a=0;afile_count=file_count+i;
}

void WritetoFile(int fnum)
{int i;
fpout=fopen(temp_name,"w");
fprintf(fpout,"solid AutoCAD\n");
for(i=0;i {fprintf(fpout,"facet normal %s %s %s\n",faces.nx,faces.ny,faces.nz);
fprintf(fpout," outer loop\n");
fprintf(fpout," vertex %s %s %s\n",faces.fx1,faces.fy1,faces.fz1);
fprintf(fpout," vertex %s %s %s\n",faces.fx2,faces.fy2,faces.fz2);
fprintf(fpout," vertex %s %s %s\n",faces.fx3,faces.fy3,faces.fz3);
fprintf(fpout," endloop\n");
fprintf(fpout,"endfacet\n");
}
fprintf(fpout,"endsolid AutoCAD\n");
fclose(fpout);
}
//------------------------Load Center---------------------------
void LoadCenter()
{//JumpTo(40L);
fread(&(vcenter.vx),sizeof(float),1,fp);
fread(&(vcenter.vy),sizeof(float),1,fp);
fread(&(vcenter.vz),sizeof(float),1,fp);
}
//-------------------------Set Vex-----------------------------
int LoadVex()
{ int vnum;
int i;
vnum=ReadInt();
vexes=(Vexes *)malloc(vnum*sizeof(Vexes));
for(i=0;i {
fread(&(vexes.vx),sizeof(float),1,fp);
fread(&(vexes.vy),sizeof(float),1,fp);
fread(&(vexes.vz),sizeof(float),1,fp);
file_count=file_count+sizeof(float)*3;
}
return (vnum);
}
void ResetVex(int vnum)
{ int i;
for(i=0;i { vexes.vx = vexes.vx - vcenter.vx;
vexes.vy = vexes.vy - vcenter.vy;
vexes.vz = vexes.vz - vcenter.vz;
}
}
//------------------------Load Face---------------------------
void LoadFaces()
{ int fnum ;
int i,vexid;
float x,y,z,x1,x2,x3,y1,y2,y3,z1,z2,z3;
char buf;
fnum=ReadInt();
faces=(Faces *)malloc(fnum*sizeof(Faces));
for(i=0;i {
vexid=ReadInt();
x1=vexes[vexid].vx;
y1=vexes[vexid].vy;
z1=vexes[vexid].vz;
vexid=ReadInt();
x2=vexes[vexid].vx;
y2=vexes[vexid].vy;
z2=vexes[vexid].vz;
vexid=ReadInt();
x3=vexes[vexid].vx;
y3=vexes[vexid].vy;
z3=vexes[vexid].vz;
//计算法向量;
x=-((y1-y2)*(z1-z3)-(y1-y3)*(z1-z2));
y=-((x1-x3)*(z1-z2)-(x1-x2)*(z1-z3));
z=-((x1-x2)*(y1-y3)-(x1-x3)*(y1-y2));
//变换值格式,并存储;
convfloat(x,faces.nx);
convfloat(y,faces.ny);
convfloat(z,faces.nz);
convfloat(x1,faces.fx1);
convfloat(y1,faces.fy1);
convfloat(z1,faces.fz1);
convfloat(x2,faces.fx2);
convfloat(y2,faces.fy2);
convfloat(z2,faces.fz2);
convfloat(x3,faces.fx3);
convfloat(y3,faces.fy3);
convfloat(z3,faces.fz3);
ReadInt();
}
WritetoFile(fnum);
free(vexes);
free(faces);
}

//-----------------------Do Convert-------------------------------------------

void convert()
{unsigned int i,vnum;
unsigned long current_length;
file_count=0;
if(ReadChunkId()!=0x4d4d){printf("Error: It isn't 3ds file format!");
return;}
current_length=ReadChunkLength();
while(file_count {i=ReadChunkId();
switch(i){
case 0x3d3d:
ReadChunkLength();
break;
case 0x4000:
ReadChunkLength();
ReadName();
break;
case 0x4100:
ReadChunkLength();
break;
case 0x4110:
printf("%s:Loadvexes\n",temp_name);
ReadChunkLength();
vnum=LoadVex();
break;
case 0x4160:
printf("%s:Loadcenter\n",temp_name);
JumpTo(40L);
LoadCenter();
ResetVex(vnum);
break;
case 0x4120:
printf("%s:Loadfaces\n",temp_name);
ReadChunkLength();
LoadFaces();
printf("%s:Ready\n",temp_name);
break;
default:
JumpTo(ReadChunkLength()-6L);
}
}
printf("All Ready\n");

}
//-------------------------Main----------------------------------------------
int main(int argv,char **argc)
{if(argv<=1) {printf("Error: Need input!");
return(0);}
else fp=fopen(argc[1],"r");
if(fp==NULL) {printf("Error: No such file!");
return(0);}
//GetPath(argc[1]);
convert();
return(0);
}
//----------------------------END--------------------------------------------
在LINUX下一切正常
但在win下却老出毛病,在导出面数较多的模型或2个实体的文件的第二个实体时,总是在loadvex函数上出现问题,执行完后跳到了内容为ffff的地方去了.
请大家帮忙看看怎么回事?
谢谢!
...全文
118 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2000-05-20
  • 打赏
  • 举报
回复
你贴上来的源码有几个地方不全,可能敲键盘敲漏了些,这样不容易判断问题出在什么地方。另外在linux下,你用的是GNU吧?是C 还是C++ 编译器?在win 下又是什么编译的?
C还是方式?16位还是32位?
把这程序EMAIL给我(halfdream@sina.com.cn),或再贴一份吧。
在证书的体系架构当中,包括了四个基本的组件,分别是密钥与加密算法,证书和证书颁发机构,证书申请、续订和吊销的通道,以及使用证书的应用程序 密钥与加密算法,就能够将明文信息,转化成为密文信息,以确保在网络当中传输时信息的安全,它主要分为两种类型,一种是对称加密算法,加密和解密时使用的都是同样的密钥和算法,一般用于加密数据,另外的一种是非对称加密算法,它包括了一对加密密钥,分别是公钥和私钥,如果公钥用于加密明文成为密文,那么私钥将用于解密密文到明文,公钥可以在网络当中进行传输,私钥不在网络当中传输 一般来说,如果两台计算机之间要传输数据,首先将由发送方计算机通过对称加密完成数据的加密过程,然后再由接收方计算机通过网络传输公钥给发送方,发送方再使用公钥加密对称加密的密钥,并且与加密的数据一起发送给接收方计算机,接收方计算机再使用私钥解密出对称加密的密钥,再使用密钥解密加密的数据,完成数据安全传输的过程 而反过来,如果接收方使用私钥加密一个文件,再通过网络将加密文件、公钥和明文一起发送给发送方,发送方使用公钥解密了文件,与一起接收的明文对比,如果相同,就能证明文件未进行修改,实现签名的功能 而证书,就是加密密钥和算法的载体,一张证书当中,包括了加密密钥,算法,签名等信息,并且对于证书申请、颁发、续订和吊销的整个生命周期,还包括了很多其它的一些属性,应用程序可以通过读取证书的这些信息,完成数据的加密解密,签名和身份验证等不同的应用场景 而证书颁发机构,将负责的证书的整个生命周期管理,证书颁发机构是一个层次化的体系结构,根证书颁发机构将只负责子证书颁发机构的证书颁发和吊销管理,子证书颁发机构将负责应用程序证书的申请请求和管理,根证书颁发机构可以放置在一个隔离的环境当中,进一步增强整个证书链的安全,而子证书颁发机构可以按照需求进行扩展,满足不同规模的应用要求 在我们的课程当中,将按照此最佳实践,完成证书服务当中,不同组件的安装和配置

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧