| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1209 人关注过本帖
标题:[原创]关于使用c编译器的疑惑解答!!
只看楼主 加入收藏
时空之蕊
Rank: 2
等 级:新手上路
威 望:3
帖 子:691
专家分:0
注 册:2004-10-31
收藏
 问题点数:0 回复次数:9 
[原创]关于使用c编译器的疑惑解答!!

关于c程序的一些思考!

我要说的是随着时代的进步编译器运行的环境也发生了改变,而任何的编译器都是针对特定的环境来设计的,他们都不可能脱离当时的软件和硬件的水平的。所以说或多或少都会与现在的系统和软件有所不同!比如说tc,显然对于tc当年他们考虑的文件名肯定是8.3的格式!那么对于这样的相对路径,".\\script\\characte\\characte.txt"相信你对于这个文件读取不会有问题,但是如果你的路径是".\\script\\character\\characterlist.txt"(我们都假设在那些路径下文件都是存在的)呵呵!对于tc那么它死活是不能正确度取得!当然那些基于tc内核制作的编译程序比如:wintc还有就是cfree等等那么都会有同样的毛病,因为他们都是基于tc内核的,而tc当年的设计(包括那些标准函数库)都是基于当时的技术来实现的!对于现在的系统都支持8.3格式,而且还支持其他的特殊的文件名字符比如说空格啊!所以说如果要跟得上时代那么我们就要用新的编译器!vc其实就是非常好的!它支持c而且他也够健壮!还有就是他调试非常的方便!它的函数库经过了不断的完善的!我们现在都用上了xp或者其他nt内核的东西。如若我们还是用以前的tc那么有些问题可能就是当年tc,和他的函数库设计的不合理。Tc还有个问题就是结构体中如果有浮点数那么,如果我们用结构体指针来访问那个浮点数一般是这样scanf(“%f”,&p->f)那么将会发生什么相信大家都遇到过就是

L例程关于tc的局限性:

#include <stdio.h>

struct Student

{

int id;

char name[10];

float math;

};

void main()

{

struct Student s[3];

int i;

for( i = 0 ; i < 3 ; i++)

{

printf("input the information Student[%d]\n",i+1);

printf("ID:");

scanf("%d",&s[i].id);

printf("NAME:");

scanf("%s",s[i].name);

printf("math:");

scanf("%f",&s[i].math);

}

for( i = 0 ; i < 3 ; i++)

{

printf("Student[%d] information\n",i + 1);

printf("ID:%d\n",s[i].id);

printf("NAME:%s\n",s[i].name);

printf("math:%f\n",s[i].math);

}

}

这个是tc运行后的结果:

图片附件: 游客没有浏览图片的权限,请 登录注册

看到了吗??他不能正确地处理一些东西!

这个是vc6.0的结果:

图片附件: 游客没有浏览图片的权限,请 登录注册

现在我们明白了,任何编译器都是有其局限性!肯定有bug!!

2例程:这个程序引用自http://bbs.bc-cn.net/bbs/dispbbs.asp?boardID=44&ID=9214&page=1

不过那个程序中的路径为c:\\c1.txt他的源程序中的路径为:ffexamine=fopen(".\\script\\character\\characterlist.txt","rt");

#include <conio.h>

#include <stdlib.h>

#include <stdio.h>

int fexamine();

void main()

{

int examine;

textcolor(11);

cprintf("[系统]");

printf("引擎正在检查必要文件,请稍后......\n");

examine=fexamine();

if (examine==1)

{

cprintf("[系统]");

printf("引擎检查完成,未发现出错文件!\n");

cprintf("[系统]");

printf("启动游戏......\n");

printf("LandyLand......\n");

}

getchar();

}

int fexamine()

{

FILE *ffexamine;

cprintf("[系统]");

printf("正在检查characterlist.txt......\n");

//这个路径是他的原来得设计目的

ffexamine=fopen(".\\script\\character\\characterlist.txt","rt");

if (ffexamine==NULL)

{

cprintf("[系统]");

printf("characterlist.txt出现错误,请按任意键退出程序!\n");

getch();

exit(1);

}

fclose(ffexamine);

return 1;

}

我们假设tc中在生成的.exe文件确实是和那个".\\script\\character\\characterlist.txt"

的路径信息一致即.exe和script文件夹在同一个目录下!!

对于这个程序:tc中不可能能够得到正确的结果即永远提示

characterlist.txt出现错误,请按任意键退出程序!

如果我们用vc6.0来编译运行,当然由于vc不支持textcolor(11);

我就把这一行注释了!

那么你运行发现结果也不对,不要急,你忘了吗!默认是调试模式默认生成的.exe

文件在debuge文件夹内!你把这个exe文件拷贝与你的script所在的目录,即让二者在同一个目录

那么再运行exe发现成功。说明vc编译执行正确!!

产生这个问题的原因我在前面已经说得很清楚了!就是那个8.3格式的限制!!!!

以上是我的总结,如有不对!大家共同批评指正,共同提高!

[此贴子已经被作者于2004-12-17 23:03:39编辑过]

搜索更多相关主题的帖子: Roman Times New 
2004-12-17 22:53
qantas_18
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2004-11-27
收藏
得分:0 

哈哈,我第一,上面对我来说有点高深,我是菜鸟,呵呵!

2004-12-17 23:03
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 

还有一个原因, 就是TC的相对路径不需要加".\\"

上文中的ffexamine=fopen(".\\script\\character\\characterlist.txt","rt");

如果要在TC中编译的话应该改写为ffexamine=fopen("script\\character\\characterlist.txt","rt");


2004-12-18 07:35
时空之蕊
Rank: 2
等 级:新手上路
威 望:3
帖 子:691
专家分:0
注 册:2004-10-31
收藏
得分:0 

呵呵!其实加不加都对的!因为.\\表示的就是本目录

不加表示的也是本目录


我渴望掌控时空的核心——用最先进的技术,打造无比美丽的世界!
2004-12-18 07:40
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 

呵呵,支持!!!

不过也不能说出现VC就把TC淘汰了呀(当前阶段),毕竟

编程工具功能越强大,耗费的资源也就越多,

在386上VC应该很难跑,有些东西还要用到386(我做的东西就是),

所以顺其自然!!


差点把你忘了...
2004-12-18 10:50
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
并且VC不支持许多TC原有的标准库函数

2004-12-18 12:01
时空之蕊
Rank: 2
等 级:新手上路
威 望:3
帖 子:691
专家分:0
注 册:2004-10-31
收藏
得分:0 
可能并不是不支持,是我们不知道要使用哪个库罢了!

我渴望掌控时空的核心——用最先进的技术,打造无比美丽的世界!
2004-12-19 10:14
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
或许是VC里有相应的更新的函数替代了TC里的函数功能了?

2004-12-19 11:31
李寻欢
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-6-29
收藏
得分:0 
c环境
2005-07-02 18:00
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
上面说VC6的浮点输出小数点后太多,其实这是正常的,%f 默认就是输小数点后6位,你要它输xx.xx,就用 %5.2f 就行了!

有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-07-03 00:16
快速回复:[原创]关于使用c编译器的疑惑解答!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021864 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved