Pro*C "error LNK2001: unresolved external symbol "void __cdecl sqlcxt" 解决方法
最近在做数据库的大作业,VC+Pro*C的小程序,我使用的环境是:
Win2003 Enterprise Edition
Oracle9i(ora90)
VC6.0
写出来的.pc文件使用Pro*C预编译为.cpp文件后,进行链接时出错:
….obj: error LNK2001: unresolved external symbol “void __cdecl sqlcxt…
上网查了一下,解决方法如下:
.pc文件预编译后的.cpp文件中有如下代码:
/* SQLLIB Prototypes */ extern void sqlcxt (void **, unsigned long *, struct sqlexd *, const struct sqlcxp *); extern void sqlcx2t(void **, unsigned long *, struct sqlexd *, const struct sqlcxp *); extern void sqlbuft(void **, char *); extern void sqlgs2t(void **, char *); extern void sqlorat(void **, unsigned long *, void *);
其中extern void sqlcxt就是出错的部分,要解决这个问题,只要将其修改为:
extern "C" void sqlcxt (void **, unsigned long *, struct sqlexd *, const struct sqlcxp *);
也就是增加了一个"C",它的用途是“告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。”
(参见:http://tech.163.com/06/0118/09/27O66HCC0009159Q.html)。
有遇到相同问题的朋友可以参考一下。
BTW,今天还遇到一个问题,在include了iostream这个头文件以后,使用
cout<<setw(5)<<stu_name;
这样的句子时编译出错,错误是:
error C2065: 'setw' : undeclared identifier
在网上搜索以后,得知遇到这种情况只需再include一下iomanip这个头文件即可,一试果然有效。Tags: C/C++ , database , it , Pro*C , Study
C语言实现的编译原理语法分析程序中语法规则的存储
最近在做编译原理课的语法分析词法分析等程序,遇到的第一个问题就是如何存储语法规则,我把我的想法贴出来,可能并不是很合理,不过给有兴趣的人做一个参考。
- typedef struct RuleNode {
- int Number;
- char Left;
- char * Right;
- int RightNum;
- int RightNumMax;
- } RNode, *RNPtr;
typedef struct Rule {
int Number;
int MaxNum;
RNPtr * AllRule;
} Rule;
我使用的方法中,定义了两种结构体。
第一个是struct RuleNode,这个结构体是存储单句的语法规则的,其中包括:
int Number ——存储此句语法规则的编号(程序写到现在觉得似乎可以省略此项)
char Left ——存储“->”符号左边的表达式,我的程序比较简单,规定了这里只能是一个字母,所以用char,但是事实上应该不止一个非终结符,每个也不只一个字母,所以也许应该用char**或者cstring[]?
char * Right ——存储“->”右边的表达式,还是和上面一样规定了一个字符只能是一个字母组成,应该改成char**。
int RightNum ——存储Right指针后有几个连续空间存储字符。
int RightNumMax ——动态分配空间给Right时的空间大小,若RightNum达到这个数,就realloc。
第二个结构体是struct Rule,这个就很简单了,一个动态分配空间的数组存储指向每个规则结点的指针,另外两个是个数和最大值~
以上只是我一点不成熟的想法,希望能够对需要的人有帮助。
Tags: C/C++ , Study , 编译原理图形学作业——画圆
今天早晨好好看了看笔记,基本理解了算法的意思,于是就动手写了一下,再稍作修改,就成功了,下面是代码的主要函数,拿出来给计算机图形学初学者共享:
- void drawCircle(int xc, int yc, int r) <br/>//By Alfred Phlower <br/>//2006.09.17 <br/>//xc,yc为圆心坐标,r为半径 <br/>{ <br/>int x,y,k; <br/>//x,y为当前点坐标,k为计数器 <br/>float p; <br/>//p为决策参数
x=0;
y=r;
p=5.0/4.0-(float)r;
for(k=0;x<=y;k++)
{
drawPixel(x,y,xc,yc);
if(p<0)
{
x++;
p+=(2*x+1);
}
else
{
x++;
y–;
p+=2*x-2*y+1;
}
}
}
drawPixel()是一个写点函数,计算的是1/8圆,写点函数将算出的坐标画到八个1/2象限上。
我是在TC2.0下实现的,不过drawCircle()函数中没有调用任何库函数,所以可以用在其他地方,只要drawPixel()中调用的库函数是使用的编译环境支持的就行了。
Tags: C/C++ , Graphics , Study