- 论坛徽章:
- 0
|
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第三行,正常编译这样就可以调用外部函数了,你可以试试。
|