杰克·韦尔奇认为:“没有什么细节会因其细小而不值得你去挥汗,也没有什么大事大到尽了力还不能办到。”人生哲学如此,编程哲学亦如此。
临近毕业,下半年也有着落,关于图形学方面的毕业设计程序也就成为头等大事。
如下函数就是程序中所用到的读文件函数,其中Bunny.obj是待读文件,主要内容是点的坐标以及构成面的三个点的序号。
void readfile(void)
{
FILE *stream;
char cVorF;
float tempx, tempy, tempz;
int ta, tb, tc;
if ((stream = fopen("Bunny.obj", "r")) == NULL)
{
printf("cannot open this file/n");
return;
}
cVorF = fgetc(stream);
while (cVorF != EOF)
{
if (cVorF == 'v')
{
fscanf(stream, "%f %f %f/n", &tempx, &tempy, &tempz);
point[nVertices].x = tempx ;
point[nVertices].y = tempy ;
point[nVertices].z = tempz ;
nVertices++;
}
else if(cVorF == 'f')
{
fscanf(stream, "%d %d %d/n", &ta, &tb, &tc);
face[nFace].vertex1 = ta - 1;
face[nFace].vertex2 = tb - 1;
face[nFace].vertex3 = tc - 1;
nFace++;
}
cVorF = fgetc(stream);
}
fclose(stream);
return;
}
其中,point,face是长度为65535的点结构和面结构数组.
此函数在一般情况下,绝对是一个很好的程序。但单步跟踪调试程序时,每当运行到fclose(stream);时,系统就弹出访问内存访问非法的类似错误。是何阻止程序继续运行呢?经过和小组其他成员的共同考证,程序无错误,可能是数组长度太小,于是将65535改为70000,再运行程序,果然拨云见日,程序运行达到预期效果。
这个65535是不是一个小的细节呢?它足以打击你的积极性。
再来看如下的一个语句:
absv = sqrt(tvPointx * tvPointx + tvPointy * tvPointy + tvPointz * tvPointz); (1)
这条语句是为了将已计算出的法向量进行单位化的中间步骤。其中tvPointx、tvPointy、tvPointz、absv是如此声明的:
double tvPointx = 0.0, tvPointy = 0.0, tvPointz = 0.0, absv = 0.0; (2)
语句(1)运行前tvPointx = 0.0066344103646117, tvPointy = -0.0028678808775453, tvPointz = 0.00093772149065785,运行后absv = 1057686143.0000。但如果用计算器将(1)计算出来后,结果会令人吃惊,absv = 0.00728830942618273!为什么会有如此大的差异呢?可以肯定的是计数器出的结果是正确的。那程序是哪出错了呢?苦思冥想下,改了又改,终于是怀疑到了函数sqrt(),将math.h头文件补上,调试,程序达到了预期效果。在这里的头文件是不是一个小事呢?它是否可以让你意志马上消沉呢?
老子说:“天下大事,必作于易;天下大事,必作于细。”一个人要成气候,除了锻炼帷幄大局,宏观决策和打开思路的能力外,注重小事和细节也同等重要甚至比之更为重要。
“魔鬼存于细节,细节造就天使。”细节不是小事,若你忽略了它,它便会给你狠狠一击,让你悔不当初。越是专业得人越懂得关注细节,也正是那些细节,造就了最终结果的不同。