免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5785 | 回复: 20
打印 上一主题 下一主题

[C] sqlda中V,L,T,I变量分配空间失败的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-13 10:12 |只看该作者 |倒序浏览
20可用积分
我写了个proc程序,相关部分代码如下:

#define MAX_ITEM 40
#define MAX_VNAME_LEN 30
#define MAX_INAME_LEN 30
#define SQL_LENGTH 1024

EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE oraca;
EXEC SQL INCLUDE sqlda;
EXEC ORACLE OPTION (ORACA = YES);
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);

extern SQLDA *sqlald();
extern void sqlclu();

SQLDA *Unitselect;
SQLDA *Unitbind;

/*创建sql语句*/
memset(c_sql,0,sizeof(c_sql));
sprintf(c_sql,"select %s,%s,%s from %s where %s=%s %s",DatabaseConfig.file_name,DatabaseConfig.file_counts,DatabaseConfig.file_size,DatabaseConfig.table_name,DatabaseConfig.flag.flag_name,DatabaseConfig.flag.flag_normal,DatabaseConfig.limit_condition);   

/*为选择描述区和结合描述区分配空间*/
if((Unitselect = sqlald(MAX_ITEM,MAX_VNAME_LEN,0))==(SQLDA *)NULL)
{
        return -3;
}
       
if((Unitbind = sqlald(MAX_ITEM,MAX_VNAME_LEN,MAX_INAME_LEN))==(SQLDA *)NULL)
{
        return -3;
}

/*选择表项和虚拟输入宿主变量的最大个数*/
Unitselect->N = MAX_ITEM;
Unitbind->N = MAX_ITEM;

/*为发现的实输入宿主变量取值和分配存储空间*/
for (i=0; i<MAX_ITEM; i++)
{
         Unitbind->I = (short *)malloc(sizeof(short *));
         Unitbind->V = (char *)malloc(MAX_VNAME_LEN);
}

for (i=0; i<MAX_ITEM; i++)
{
         Unitselect->I = (short *)malloc(sizeof(short *));
         Unitselect->V = (char *)malloc(MAX_VNAME_LEN);
}

........

/****************************************************************/
用gdb调试时:
在Unitbind->I = (short *)malloc(sizeof(short *));这句时发生错误退出:

Program received signal SIGSEGV, Segmentation fault.

我发现在用sqlald分配存储空间后,sqlda结构中的V,L,T,I变量的地址都有问题:
(gdb) p Unitbind
$6 = (SQLDA *) 0x92e20f0
(gdb) p *Unitbind
$7 = {N = 40, V = 0x92e216000000000, L = 0x92e22b000000000, T = 0x92e236000000000, I = 0x92e23c000000000, F = 0, S = 0x0, M = 0x92e2510,
  C = 0x92e2660, X = 0x92e26c0, Y = 0x92e2be0, Z = 0x92e2d30}

大家知道这个问题应该怎么解决吗?

[ 本帖最后由 beauty2003 于 2008-8-13 11:47 编辑 ]

最佳答案

查看完整内容

以编译test.c为例,我以前是这么做的:cc -E -o PROC_test.pc test.cproc PARSE=NONE PROC_test.pccc -c -o test.o PROC_test.c第一行预处理第二行proc处理,需要制定PARSE=NONE,如果是多线程,还需要指定THREAD=YES第三行,正常编译这样就可以调用外部函数了,你可以试试。

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
2 [报告]
发表于 2008-08-13 10:12 |只看该作者

回复 #16 beauty2003 的帖子

以编译test.c为例,我以前是这么做的:
cc -E -o PROC_test.pc  test.c
proc PARSE=NONE PROC_test.pc
cc -c -o test.o PROC_test.c

第一行预处理
第二行proc处理,需要制定PARSE=NONE,如果是多线程,还需要指定THREAD=YES
第三行,正常编译
这样就可以调用外部函数了,你可以试试。

论坛徽章:
0
3 [报告]
发表于 2008-08-13 11:59 |只看该作者
在标准C++中,当一个内存分配请求不能被满足时,new将抛出一个bad_alloc类型的异常.如果你的程序不能捕获这个异常,那么程序将被终止.(系统将调用C++标准库中的函数sqlald(),在默认情况下,函数sqlald()将调用函数abort()来终止程序,但如果你愿意也可以指定自己的程序终止处理函数,可以参考编译器的帮助文档.)要使用sqlald类型的异常,必须包含头文件<new>.

论坛徽章:
0
4 [报告]
发表于 2008-08-13 15:22 |只看该作者
原帖由 qliu00 于 2008-8-13 11:59 发表
在标准C++中,当一个内存分配请求不能被满足时,new将抛出一个bad_alloc类型的异常.如果你的程序不能捕获这个异常,那么程序将被终止.(系统将调用C++标准库中的函数sqlald(),在默认情况下,函数sqlald()将调用函数a ...


你说的sqlald()好象作用和我的不大一样.

论坛徽章:
0
5 [报告]
发表于 2008-08-13 18:34 |只看该作者
问题原因已找到,是我引用了一个自己写的头文件.不过具体原因,还是不大清楚.

论坛徽章:
0
6 [报告]
发表于 2008-08-14 08:58 |只看该作者
原帖由 beauty2003 于 2008-8-13 18:34 发表
问题原因已找到,是我引用了一个自己写的头文件.不过具体原因,还是不大清楚.



我不是说头文件出了问题么,而且你未包含你的new(),所以出错

论坛徽章:
0
7 [报告]
发表于 2008-08-14 11:03 |只看该作者
qliu00 说的都是new的东西

用malloc分配内存,用不到new,new是C++的东西,

论坛徽章:
0
8 [报告]
发表于 2008-08-14 11:04 |只看该作者
Unitbind->I = (short *)malloc(sizeof(short *));

sizeof(short*) 第一次看到,short* 是指针,任何类型的指针大小都是固定的(同一台机器)

用 sizeof(short)


Unitbind->I = (short *)malloc(sizeof(short));

论坛徽章:
0
9 [报告]
发表于 2008-08-14 22:09 |只看该作者
原帖由 e_sharp 于 2008-8-14 11:04 发表
Unitbind->I = (short *)malloc(sizeof(short *));

sizeof(short*) 第一次看到,short* 是指针,任何类型的指针大小都是固定的(同一台机器)

用 sizeof(short)


Unitbind->I = (short *)malloc(siz ...



不好意思,这几天工作太忙,没时间上网.
那个问题,我怀疑是makefile写的有问题,我只要一包含之前写的.h文件(现在写的这块proc代码有调用之前的函数),就会出现地址乱套的情况。

论坛徽章:
0
10 [报告]
发表于 2008-08-14 22:16 |只看该作者
可是我在makefile里包含了那些.h文件,仍然会出现那个问题,不知道是不是proc那块编译头文件,有另外的写法.

相关部分makefile如下:


cjftp_tableget.c:
        proc $(PROCFLAGS) iname=cjftp_tableget.pc oname=cjftp_tableget.c
       
$(LIB)/cjftp_tableget.o: cjftp_tableget.c comm_tool.h cjftp_log.h cjftp_ftp.h
        $(CC) $(CFLAGS) $(INCLDIR) -c cjftp_tableget.c -o cjftp_tableget.o
        mv $(@F) $(LIB)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP