2004年c语言编译器10大最不知所措的问题之一

chenmin_1979 2004-12-27 01:51:02
大家好,我用的是pro c,你们应该知道吧?就是可以在c语言里面直接编写sql语句的那种语言
大概的情况是这样,我只发出了程序的一部分,这个程序common.pc是一个公用函数的说明集合,里面说明了我以后程序要用到的一些公共函数

说明。
EXEC SQL BEGIN DECLARE SECTION;
varchar sql_user[20]; /* 连接到oracle的用户名*/
varchar sql_pass[20]; /* 连接到oracle的口令 */
varchar sql_servName[10]; /* 连接到oracle的 服务名*/
char sql_servLink[10]; /* 连接到oracle的 连接池*/
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
/*下面是一个公共的sql语句的报错处理*/
int sqlErr(void)
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\nOracle error detected:%70s\n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(-1);
}
/*下面是一个得到一个数据库表中的时间的小函数*/
/*函数功能:从数据库上取出上一次成功生成指定省的某类数据文件的时间*/
/*函数输入:传入要保存时间的字符串地址,联通综合营帐系统省代码和文件类型代码*/
/*函数输出:返回取出的时间串的长度*/
int getUpdateTime(char *pchLastTime, char *pchProvCode, char *pchFileType)
{
EXEC SQL BEGIN DECLARE SECTION;
varchar sql_provCode[4];
varchar sql_fileType[4];
varchar sql_lastTime[15];
EXEC SQL END DECLARE SECTION;

memset(&sql_provCode, 0, sizeof(sql_provCode));
memset(&sql_fileType, 0, sizeof(sql_fileType));
memset(&sql_lastTime, 0, sizeof(sql_lastTime));
assert((pchProvCode != NULL) && (pchFileType != NULL) && (pchLastTime != NULL));
strcpy(sql_provCode.arr, pchProvCode);
sql_provCode.len = strlen(sql_provCode.arr);
strcpy(sql_fileType.arr, pchFileType);
sql_fileType.len = strlen(sql_fileType.arr);
EXEC SQL WHENEVER SQLERROR do sqlErr();
EXEC SQL AT :sql_servLink SELECT LAST_SEND_TIME INTO :sql_lastTime FROM SVCM_INTER_CONFIG
WHERE PROVINCE_CODE=:sql_provCode AND FILE_TYPE_CODE=:sql_fileType;
strcat(sql_lastTime.arr, "\0");
strncpy(pchLastTime, sql_lastTime.arr, TIME_LEN);
return(TIME_LEN);
}/*假设这是第100行*/
这个getUpdateTime函数是以前我自己写的,在编译common.pc程序过程中没有出现任何错误,而且这一套程序一直用了一年了,但是最近我为

了实现一些新的需求,就准备修改修改,我怎么修改我就不罗嗦了,我做了这样一个操作,把getUpdateTime这个函数用/**/符号封了,然后在

紧接着100后面敲了一个回车,然后把getUpdateTime程序再复制在102行上,一模一样,绝对不修改,然后编译,出现的错误是:

common.c:2623: error: break statement not within loop or switch
大家是不是在疑问这个common.c文件是什么东西,common.c就是gcc这个编译器把我写的common.pc这个pc程序编译成纯c的程序,因为在pc中的
EXEC SQL BEGIN DECLARE SECTION;
varchar sql_provCode[4];
varchar sql_fileType[4];
varchar sql_lastTime[15];
EXEC SQL END DECLARE SECTION;

EXEC SQL WHENEVER SQLERROR do sqlErr();
EXEC SQL AT :sql_servLink SELECT LAST_SEND_TIME INTO :sql_lastTime FROM SVCM_INTER_CONFIG
WHERE PROVINCE_CODE=:sql_provCode AND FILE_TYPE_CODE=:sql_fileType;
这些东西c语言是不认识的,c语言里面必须把所有和sql语句有关的包括变量说明全部都要转化,比如sql语言里面的varchar在c里面就会转化

为一个结构体的格式
我把出错和没有出错的common.pc程序编译以后生成的中间文件common.c唯一不同的地方的一段代码发出来大家看看
这个是没有出错的common.c文件中的getUpdateTime这个函数的一部分
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode < 0) sqlErr();
}


strcat(sql_lastTime.arr, "\0");
strncpy(pchLastTime, sql_lastTime.arr, TIME_LEN);
return(TIME_LEN);
}
这个是程序报错的common.c文件中的getUpdateTime这个函数的一部分
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode == 1403) break;/*注意这一行,这是比上面多出来的*/
if (sqlca.sqlcode < 0) sqlErr();
}


strcat(sql_lastTime.arr, "\0");
strncpy(pchLastTime, sql_lastTime.arr, TIME_LEN);
return(TIME_LEN);
}
大家看见多出来的一行的内容了吧?多出了一个break,但是这里没有循环,所以这个break存在非法,它找不到去break到哪里了,所以出错。
但是我绝对发誓的一点就是仅仅只是复制到下一行,其实复制到下下行下下下下行结果都是一样,都是报错,只有不修改程序不移动这个函数

的位置就不会出错。请大家帮帮忙吧。。。。。。。。。。。。。。。。。。。。。
...全文
543 点赞 收藏 14
写回复
14 条回复
tiaoci 2004年12月28日
删除 common.c 后重新编译 common.pc 试试
回复 点赞
积木 2004年12月27日
怎么听这就是说你用这个函数的时候没有事先声明,所以就报错了呢?
如果是这样的话……这个好像是常识。
回复 点赞
f26511314 2004年12月27日
对,我也发现有个问题,不知道你遇到没有
switch(action)
{
case 'n':EXEC SQL FETCH emp_cursor INTO :name;break;////转换成c后,这一句不转换
case 'l':
EXEC SQL FETCH emp_cursor INTO :name;break; ////EXEC只要另换一行,c文件才能转换出来
}
回复 点赞
chenmin_1979 2004年12月27日
回复人: f26511314(我吃巧克力饼)

我说了是编译有可能出错嘛,嘻嘻
是不是我人品不好啊,我之前怎么改怎么改都是报错,呵呵
回复 点赞
chenmin_1979 2004年12月27日
回复人: xdspower()

回答他的问题,编译器生成的.c文件只是一个中间文件,没有任何含义,也不能对它进行修改的,呵呵
这个.c只是编译器生成的为了给c的编译器能看懂的一个中间程序,一般我们在写make文件的时候都加一句话:rm *.c *.o
呵呵
我发那个东西出来只是让大家看看编译以后的区别而已,呵呵
同时还有一个解决办法,就是用for把这一段
EXEC SQL WHENEVER SQLERROR do sqlErr();
EXEC SQL AT :sql_servLink SELECT LAST_SEND_TIME INTO :sql_lastTime FROM SVCM_INTER_CONFIG
WHERE PROVINCE_CODE=:sql_provCode AND
包括起来,让break找到一个可以break的地方,呵呵
修改如下
int i;
for(i=0,i>1,i++)
{
EXEC SQL WHENEVER SQLERROR do sqlErr();
EXEC SQL AT :sql_servLink SELECT LAST_SEND_TIME INTO :sql_lastTime FROM SVCM_INTER_CONFIG
WHERE PROVINCE_CODE=:sql_provCode AND
}
这样修改可以起到欺骗编译器的作用,但是这不是解决办法,呵呵,这样修改是不可能的,呵呵
回复 点赞
f26511314 2004年12月27日
不是吧,我按照楼主你那么写的试了一次,两次转换的c文件都一样,没有你说的if (sqlca.sqlcode == 1403) break;

回复 点赞
chenmin_1979 2004年12月27日
数据库中是绝对有这个表和这些字段和这些数据的
因为你想想,我只是改变了一下函数的位置而已,要是没有这些表字段和数据应该也会报同样的错误的,呵呵

我的问题已经解决了,谢谢大家的关心
具体是这样的,因为我写的pc里面的只有函数定义,没有函数声明,我是通过#include "common.h"
来声明函数的,我觉得这样写比较明了一点,呵呵,其实也可以在本身的pc程序中来声明一下这个函数

原因就是pro c(oracle下的c)和ec(informix下的c)这种语言的编译可能有点点问题,在include的时候可能没有全面的包含函数声明,如果采用本身的pc中去声明函数就可以无论把函数写在什么位置都可以编译,但是如果用include的话也许(注意:这里是也许,呵呵)就会出现我的这种错误,解决的办法就是把这个函数复制到前面一点,也就是复制到程序的上面几行,呵呵,不要复制到程序的结束部分,往上复制一点,就可以编译通过了,呵呵

祝大家新年愉快,万事如意,谢谢大家的关心和支持
回复 点赞
xdspower 2004年12月27日
同意 ckc(火)
此外你既然发现多出来了,可以先试一下把那个删除掉后编译是否成功。
回复 点赞
xuelong_zl 2004年12月27日
这是C,常用于大型机的数据库后台处理!

楼主呢?回答一下我的问题
回复 点赞
yjh1982 2004年12月27日
这是C么-_-
回复 点赞
xuelong_zl 2004年12月27日
我本人写过一次相对简单的数据库后台程序,没有楼主这么复杂,不过我想问一些关于程序的问题.

在你要查询的数据库中是不是已经存在你要找的数据呢?如果找某一更新时间,我想是不是可以通过改写SQL语句来实现呢?

我对楼主要实现的功能不是很明了,真不好意思,如果方便希望你写一下
回复 点赞
chenmin_1979 2004年12月27日
唉,看着楼上几个人的回答。。。。。。真是心寒啊。。。。。。。。。。。
csdn难道和传闻的一样,果然。。。。。。。。吗?。。。。。。。。。。
回复 点赞
ckc 2004年12月27日
你改的是.pc还是.c啊
我觉得十有八九还是你改的时候改错了
而且照你说的,不明白你为什么要把这个子程序换个地方啊,这不是无聊吗
回复 点赞
laomai 2004年12月27日
没用过pro c,帮你顶!
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告