??xml version="1.0" encoding="utf-8" standalone="yes"?>噜噜噜色噜噜噜久久,91精品久久久久久无码,欧美亚洲国产精品久久http://www.shnenglu.com/guangping/archive/2008/08/04/57980.html阿光阿光Mon, 04 Aug 2008 08:57:00 GMThttp://www.shnenglu.com/guangping/archive/2008/08/04/57980.htmlhttp://www.shnenglu.com/guangping/comments/57980.htmlhttp://www.shnenglu.com/guangping/archive/2008/08/04/57980.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/57980.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/57980.html M一个由二进制数位串l成的代?都可以惟一C一个只含有0?两个pL的多式建立一一对应的关pR例?代码1010111对应的多式为X6+X4+X2+X+1,同样.多项式X5+X3+X2+X+1对应的代码ؓ101111?br /> CRC码在发送端~码和接收端校验?都可以利用事先约定的生成多项式G(X)来得到?k位要发送的信息位可对应于一?k-1)ơ多式K(X),r位冗余位则对应于一?r-1)ơ多式R(X),由k位信息位后面加上r位冗余位l成的n=k+r位码字则对应于一?n-1)ơ多式T(X)=Xr·K(X)+R(X)。例?

׃息位产生冗余位的~码q程,是已知K(X)求R(X)的过E。在CRC码中可以通过扑ֈ一个特定的rơ多式G (X)(其最高项Xr的系数恒?),然后用Xr·K(X)去除以G(X),得到的余式就是R(X)。特别要的是,q些多项式中?+"都是??也即异或q算);此外,q里的除法用的也是模2除法,即除法过E中用到的减法是?减法,它和?加法的运规则一?都是异或q算,q是一U不考虑加法q位和减法借位的运??/p>

0+O=0,0+1=1,1+0=1,1+1=0
0-0=0,0-1=1,1-0=1,1-1=0

在进行基于模2q算的多式除法?只要部分余数首位?,便可上商1,否则上商0。然后按?减法求得余数,该余C计最高位。当被除数逐位除完?最后得到比除数一位的余数。此余数即ؓ冗余?其d在信息位后便构成CRC码字?br /> 仍以上例中K(X)=X6+X4+X3+1Z(即信息位?011001),若G(X)=X4+X3+1
(对应代码11001),取r=4,则X4·K(X)=X10+X8+X7+X4(对应代码?110010000),其由?除法求余式R(X)的过E所C如?


得到的最后余Cؓ1010,q就是冗余位,对应R(X)=X3+X?br /> ׃R(X)是Xr·K(X)除以G(X)的余?那么下列关系式必然满?br /> Xr·K(X)=G(X)Q(X)+R(X)
其中Q(X)为商式。根据模二运规则R(X)+R(X)=0的特?可将上式改记?/p>

[Xr-K(X)+R(X)]/G(X)=Q(X)

? T(X)/G(X)=Q(X)

由此可见,信道上发送的码字多项式T(X)=Xr-K(X)+R(X)。若传输q程无错Q则接收Ҏ到的码字也对应于此多式,也即接收到的码字多项式能被G(X)整除。因而接收端的校验过E就是将接收到的码字多项式除以G(X)的过E。若余式为零则认Z输元差错;若余式不为零则传输有差错?/p>

例如,前述例子中若码字10110011010l传输后׃受噪声的q扰,在接收端变成?0110011100,则求余式的除法如?
求得的余式不为零,相当于在码字上面半加上了差错模式00000000110。差错模式对应的多项式记为E(X),上例中E(X)=X2+X。有差错?接收端收到的不再是T(X),而是T(X)与E(X)之模二加,?br /> [T(X)+E(X)]/G(X)=T(X)/G(X)+E(X)/G(X)
若E(X)/G(X)=0,则这U差错就能检出?若E(X)/G(X)=0,那么׃接收到的码字多项式仍然可被G(X)整除,错误检不出来,也即发生了漏?/p>

理论上可以证明@环冗余校验码的检错能力有以下特点:
(1)可检出所有奇C错?br /> (2)可检出所有双比特的错?br /> (3)可检出所有小于、等于校验位长度的突发错?/p>

CRC码是由r-K(X)除以某个选定的多式后生的,所以该多现式称生成多项式。一般来?生成多项式位数越多校验能力越强。但q不是Q何一个r+1位的二进制数都可以做生成多项式?nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="kwC(event,0)" onmouseout="kwL(event,this)">目前q泛使用的生成多式主要有以下四U?



阿光 2008-08-04 16:57 发表评论
]]>
C++中的左值和叛_?/title><link>http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html</link><dc:creator>阿光</dc:creator><author>阿光</author><pubDate>Wed, 23 Apr 2008 03:40:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/47889.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/47889.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/47889.html</trackback:ping><description><![CDATA[1. 概念 变量和文字常量都有存储区Qƈ且有相关的类型,区别在于变量是可d的; <br /> 对于每个变量Q都?个g其相兌Q?br /> 1>数据|存储在某个内存地址中,也称叛_|rvalueQ,叛_是被读取的|read valueQ,文字帔R和变量都可被用于叛_{? <br /> 2>地址|卛_储数据值的那块内存地址Q也U左|lvalueQ,文字帔R不能被用作左倹{? <br /><br />2 . 问题 l表辑ּ加上括号Q?br /> ++a-- <br />l果 ++(a--) <br />q个表达式是非法的,因ؓ前增量操作要求一个可修改的左|?"a--" 不是左|卛_|<br /><br /> 3 . 前增量和后增量的区别 <br />早期的c语言教材Qfor循环语句通常写成Q?br />for(int i=0;i<10;i++) <br />而现在多为: <br />for(int i=0;i<10;++i) 两者有区别吗? <br />a++ xq回 a的|然后变量 a ?1Q返回需要生一个时变量类g <br />{ int temp = a; <br /> a=a+1; <br /> return temp; //q回叛_? } <br /><br />++a 则ؓQ? <br />{ a=a+1; <br /> return &a; //q回左? } <br />昄Q前增量不需要中间变量,效率更高? <img src ="http://www.shnenglu.com/guangping/aggbug/47889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">阿光</a> 2008-04-23 11:40 <a href="http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>typedef用法结http://www.shnenglu.com/guangping/archive/2008/04/08/46519.html阿光阿光Tue, 08 Apr 2008 08:21:00 GMThttp://www.shnenglu.com/guangping/archive/2008/04/08/46519.htmlhttp://www.shnenglu.com/guangping/comments/46519.htmlhttp://www.shnenglu.com/guangping/archive/2008/04/08/46519.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/46519.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/46519.html q两天在看程序的时?发现很多地方都用到typedef,在结构体定义,q有一些数l等地方都大量的用到.但是有些地方q不是很清楚,今天下午,想好好研究一?上网搜了一?有不资?归纳一?
来源一:Using typedef to Curb Miscreant Code
Typedef 声明有助于创建^台无关类型,甚至能隐藏复杂和难以理解的语法。不怎样Q?typedef 能ؓ代码带来意想不到的好处,通过本文你可以学习用 typedef 避免~欠Q从而代码更健壮?br />typedef 声明Q简U?typedefQؓ现有cd创徏一个新的名字。比如h们常怋?typedef 来编写更观和可ȝ代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及^台相关的数据cdQ从而增强可UL性和以及未来的可l护性。本文下面将竭尽全力来揭C?typedef 强大功能以及如何避免一些常见的陷阱?br />如何创徏q_无关的数据类型,隐藏W拙且难以理解的语法?
使用 typedefs 为现有类型创建同义字?br />定义易于记忆的类型名
  typedef 使用最多的地方是创建易于记忆的cd名,用它来归档程序员的意图。类型出现在所声明的变量名字中Q位?''typedef'' 关键字右辏V例如:
typedef int size;
  此声明定义了一?int 的同义字Q名字ؓ size。注?typedef q不创徏新的cd。它仅仅为现有类型添加一个同义字。你可以在Q何需?int 的上下文中?sizeQ?br />void measure(size * psz);
size array[4];
size len = file.getlength();
std::vector vs;
  typedef q可以掩饰符合类型,如指针和数组。例如,你不用象下面q样重复定义?81 个字W元素的数组Q?br />char line[81];
char text[81];
定义一?typedefQ每当要用到相同cd和大的数组Ӟ可以q样Q?br />typedef char Line[81];
Line text, secondline;
getline(text);
同样Q可以象下面q样隐藏指针语法Q?br />typedef char * pstr;
int mystrcmp(pstr, pstr);
  q里带我们到达W一?typedef 陷阱。标准函?strcmp()有两个‘const char *'cd的参数。因此,它可能会误导Z象下面这样声?mystrcmp()Q?br />int mystrcmp(const pstr, const pstr);
  q是错误的,按照序Q‘const pstr'被解释ؓ‘char * const'Q一个指?char 的常量指针)Q而不是‘const char *'Q指向常?char 的指针)。这个问题很Ҏ解决Q?br />typedef const char * cpstr;
int mystrcmp(cpstr, cpstr); // 现在是正的
CQ不什么时候,只要为指针声?typedefQ那么都要在最l的 typedef 名称中加一?constQ以使得该指针本w是帔RQ而不是对象?br />代码?br />  上面讨论?typedef 行ؓ有点?#define 宏,用其实际cd替代同义字。不同点?typedef 在编译时被解释,因此让编译器来应付超预处理器能力的文本替换。例如:
typedef int (*PF) (const char *, const char *);
  q个声明引入?PF cd作ؓ函数指针的同义字Q该函数有两?const char * cd的参C及一?int cd的返回倹{如果要使用下列形式的函数声明,那么上述q个 typedef 是不可或~的Q?br />PF Register(PF pf);
  Register() 的参数是一?PF cd的回调函敎ͼq回某个函数的地址Q其|名与先前注册的名字相同。做一ơ深呼吸。下面我展示一下如果不?typedefQ我们是如何实现q个声明的:
int (*Register (int (*pf)(const char *, const char *)))
(const char *, const char *);
  很少有程序员理解它是什么意思,更不用说q种费解的代码所带来的出错风险了。显Ӟq里使用 typedef 不是一U特权,而是一U必需。持怀疑态度的h可能会问Q?OKQ有会写q样的代码吗Q?Q快速浏览一下揭C?signal()函数的头文g Q一个有同样接口的函数?br />typedef 和存储类关键字(storage class specifierQ?br />  q种说法是不是有点o人惊Ӟtypedef 像 autoQexternQmutableQstaticQ和 register 一P是一个存储类关键字。这q是?typedef 会真正媄响对象的存储Ҏ;它只是说在语句构成上Qtypedef 声明看v来象 staticQextern {类型的变量声明。下面将带到W二个陷阱:
typedef register int FAST_COUNTER; // 错误
  ~译通不q。问题出在你不能在声明中有多个存储类关键字。因为符?typedef 已经占据了存储类关键字的位置Q在 typedef 声明中不能用 registerQ或M其它存储cd键字Q?br />促进跨^台开?br />  typedef 有另外一个重要的用途,那就是定义机器无关的cdQ例如,你可以定义一个叫 REAL 的Q点类型,在目标机器上它可以i获得最高的_ֺQ?br />typedef long double REAL;
在不支持 long double 的机器上Q该 typedef 看v来会是下面这P
typedef double REAL;
q且Q在q?double 都不支持的机器上Q该 typedef 看v来会是这P?br />typedef float REAL;
   你不用对源代码做M修改Q便可以在每一U^C~译q个使用 REAL cd的应用程序。唯一要改的是 typedef 本n。在大多数情况下Q甚臌个微的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 标准库广泛地使用 typedef 来创Lq_无关cdQsize_tQptrdiff ?fpos_t 是其中的例子。此外,?std::string ?std::ofstream q样?typedef q隐藏了镉K的,难以理解的模板特化语法,例如Qbasic_stringQallocator> ?basic_ofstream>?br />作者简?br />  Danny Kalev 是一名通过认证的系l分析师Q专?C++ 和Ş式语a理论的Y件工E师?997 q到 2000 q期_他是 C++ 标准委员会成员。最q他以优异成l完成了他在普通语a学研I方面的士论文。业余时间他喜欢听古兔R乐,阅读l多利亚时期的文学作品,研究 Hittite、Basque ?Irish Gaelic q样的自然语a。其它兴包括考古和地理。Danny 时常C?C++ 论坛q定期ؓ不同?C++ |站和杂志撰写文章。他q在教育机构讲授E序设计语言和应用语a评?br />来源二:(http://www.ccfans.net/bbs/dispbbs.asp?boardid=30&;id=4455)
C语言中typedef用法
1. 基本解释
  typedef为C语言的关键字Q作用是ZU数据类型定义一个新名字。这里的数据cd包括内部数据cdQint,char{)和自定义的数据类型(struct{)?br />  在编E中使用typedef目的一般有两个Q一个是l变量一个易C意义明确的新名字Q另一个是化一些比较复杂的cd声明?br />  至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐q?br /> 2. typedef & l构的问?br />  当用下面的代码定义一个结构时Q编译器报了一个错误,Z么呢Q莫非C语言不允许在l构中包含指向它自己的指针吗Q请你先猜想一下,然后看下文说明:
typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;
  {案与分析:
  1、typedef的最单?br />typedef long byte_4;
  l已知数据类型long起个新名字,叫byte_4?br />  2?typedef与结构结合?br />typedef struct tagMyStruct
{
 int iNum;
 long lLength;
} MyStruct;
  q语句实际上完成两个操作Q?br />  1) 定义一个新的结构类?br />struct tagMyStruct
{
 int iNum;
 long lLength;
};
  分析QtagMyStructUCؓ“tag”,即“标{䏀,实际上是一个时名字,struct 关键字和tagMyStruct一P构成了这个结构类型,不论是否有typedefQ这个结构都存在?br />  我们可以用struct tagMyStruct varName来定义变量,但要注意Q用tagMyStruct varName来定义变量是不对的,因ؓstruct 和tagMyStruct合在一h能表CZ个结构类型?br />  2) typedef个新的结构v了一个名字,叫MyStruct?br />typedef struct tagMyStruct MyStruct;
  因此QMyStruct实际上相当于struct tagMyStructQ我们可以用MyStruct varName来定义变量?br />  {案与分?br />  C语言当然允许在结构中包含指向它自q指针Q我们可以在建立链表{数据结构的实现上看到无数这L例子Q上qC码的Ҏ问题在于typedef的应用?br />  Ҏ我们上面的阐q可以知道:新结构徏立的q程中遇CpNext域的声明Q类型是pNodeQ要知道pNode表示的是cd的新名字Q那么在cd本nq没有徏立完成的时候,q个cd的新名字也还不存在,也就是说q个时候编译器Ҏ不认识pNode?br />  解决q个问题的方法有多种Q?br />  1)?br />typedef struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
} *pNode;
  2)?br />typedef struct tagNode *pNode;
struct tagNode
{
 char *pItem;
 pNode pNext;
};
  注意Q在q个例子中,你用typedefl一个还未完全声明的cdh名字。C语言~译器支持这U做法?br />  3)、规范做法:
struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
};
typedef struct tagNode *pNode;
 3. typedef & #define的问?br />  有下面两U定义pStr数据cd的方法,两者有什么不同?哪一U更好一点?
typedef char *pStr;
#define pStr char *;
  {案与分析:
  通常Ԍtypedef要比#define要好Q特别是在有指针的场合。请看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
  在上q的变量定义中,s1、s2、s3都被定义为char *Q而s4则定义成了charQ不是我们所预期的指针变量,Ҏ原因在?define只是单的字符串替换而typedef则是Z个类型v新名字?br />  #define用法例子Q?br />#define f(x) x*x
main( )
{
 int a=6Qb=2QcQ?br /> c=f(a) / f(b)Q?br /> printf("%d \\n"Qc)Q?br />}
  以下E序的输出结果是: 36?br />  因ؓ如此原因Q在许多C语言~程规范中提C?define定义Ӟ如果定义中包含表辑ּQ必M用括P则上q定义应该如下定义才对:
#define f(x) (x*x)
  当然Q如果你使用typedef没有这L问题?br />  4. typedef & #define的另一?br />  下面的代码中~译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
  {案与分析:
  是p2++出错了。这个问题再一ơ提醒我们:typedef?define不同Q它不是单的文本替换。上qC码中const pStr p2q不{于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限Ӟ只不q此处变量p2的数据类型是我们自己定义的而不是系l固有类型而已。因此,const pStr p2的含义是Q限定数据类型ؓchar *的变量p2为只读,因此p2++错误?br />  #define与typedef引申?br />  1) #define宏定义有一个特别的长处Q可以?#ifdef ,#ifndef{来q行逻辑判断Q还可以使用#undef来取消定义?br />  2) typedef也有一个特别的长处Q它W合范围规则Q用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内Q取决于此变量定义的位置Q,而宏定义则没有这U特性?br />  5. typedef & 复杂的变量声?br />  在编E实践中Q尤其是看别Z码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价|比如Q?br />  下面是三个变量的声明Q我想用typdef分别l它们定义一个别名,请问该如何做Q?br />>1Qint *(*a[5])(int, char*);
>2Qvoid (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
  {案与分析:
  对复杂变量徏立一个类型别名的Ҏ很简单,你只要在传统的变量声明表辑ּ里用cd名替代变量名Q然后把关键字typedef加在该语句的开头就行了?br />>1Qint *(*a[5])(int, char*);
//pFun是我们徏的一个类型别?br />typedef int *(*pFun)(int, char*);
//使用定义的新cd来声明对象,{h于int* (*a[5])(int, char*);
pFun a[5];
>2Qvoid (*b[10]) (void (*)());
//首先Z面表辑ּ蓝色部分声明一个新cd
typedef void (*pFunParam)();
//整体声明一个新cd
typedef void (*pFun)(pFunParam);
//使用定义的新cd来声明对象,{h于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先Z面表辑ּ蓝色部分声明一个新cd
typedef double(*pFun)();
//整体声明一个新cd
typedef pFun (*pFunParam)[9];
//使用定义的新cd来声明对象,{h于doube(*)() (*pa)[9];
pFunParam pa;



阿光 2008-04-08 16:21 发表评论
]]>
windows下用vim实现qt代码的自动补全功?/title><link>http://www.shnenglu.com/guangping/archive/2008/02/18/42917.html</link><dc:creator>阿光</dc:creator><author>阿光</author><pubDate>Mon, 18 Feb 2008 15:29:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2008/02/18/42917.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/42917.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2008/02/18/42917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/42917.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/42917.html</trackback:ping><description><![CDATA[ <span id="uuwuoas" class="tpc_content">1.安装vim.<br />2.下蝲ctags for win32q解压到c:\ctags\目录?<br />3.c:\ctags加入windows的path环境变量?<br />4.下蝲omnicppcomplete解压到vim安装目录的vimfiles目录?<br />5.转到qt的include目录下执行ctags -R --c++-kinds=+p --fields=+iaS --extra=+q;命o完成后会在该目录?br />生成一个tags文gQ它是omnicppcomplete和vim用来作命令补全的数据库?br />6.在qt的src目录下再执行一遍上q命?<br />7.~辑vim安装目录下的_vimrc文gQ将下述两行加入其中<br />set tags+=c:\Qt\4.3.3\include\tags<br />set tags+=c:\Qt\4.3.3\src\tag<br />其中c:\Qt\4.3.3\是我机器上qt 的安装目录,Ҏ你的情况作出调整?br />8.C的工E目录下执行5步中的命?<br />9.用vim打开一个cpp文g试一下吧Q哈?<br /><br /></span> <img src ="http://www.shnenglu.com/guangping/aggbug/42917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">阿光</a> 2008-02-18 23:29 <a href="http://www.shnenglu.com/guangping/archive/2008/02/18/42917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++ 内存理 Heap vs Stackhttp://www.shnenglu.com/guangping/archive/2007/08/01/29131.html阿光阿光Wed, 01 Aug 2007 03:24:00 GMThttp://www.shnenglu.com/guangping/archive/2007/08/01/29131.htmlhttp://www.shnenglu.com/guangping/comments/29131.htmlhttp://www.shnenglu.com/guangping/archive/2007/08/01/29131.html#Feedback1http://www.shnenglu.com/guangping/comments/commentRss/29131.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/29131.html
一、预备知识—程序的内存分配
一个由c/C++~译的程序占用的内存分ؓ以下几个部分
1、栈区(stackQ?q译器自动分配释放 Q存攑և数的参数|局部变量的值等。其操作方式cM于数据结构中的栈?
2、堆区(heapQ??一般由E序员分配释放, 若程序员不释放,E序l束时可能由OS回收 。注意它与数据结构中的堆是两回事Q分配方式倒是cM于链表,呵呵?
3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?- E序l束后有pȝ释放
4、文字常量区 —常量字W串是攑֜q里的?E序l束后由pȝ释放
5、程序代码区—存攑ևC的二q制代码?

二、例子程?
q是一个前辈写的,非常详细

//main.cpp
int a =0; 全局初始化区
char*p1; 全局未初始化?
main()
{
int b;// ?
char s[] ="abc"; //?
char*p2; //?
char*p3 ="123456"; 123456\0";//在常量区Qp3在栈上?
staticint c =0Q?//全局Q静态)初始化区
p1 = (char*)malloc(10);
p2
= (char*)malloc(20);
//分配得来?0?0字节的区域就在堆区?
strcpy(p1, "123456"); //123456\0攑֜帔R区,~译器可能会它与p3所指向?123456"优化成一个地斏V?
}


三、堆和栈的理论知?
3.1甌方式
stack:
ql自动分配?例如Q声明在函数中一个局部变?int b; pȝ自动在栈中ؓb开辟空?
heap:
需要程序员自己甌Qƈ指明大小Q在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用newq算W?
如p2 = (char *)malloc(10);
但是注意p1、p2本n是在栈中的?
3.2 甌后系l的响应
栈:只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢出?
堆:首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ
? 遍历该链表,LW一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表中删除,q将该结点的I间分配l程序,另外Q对于大多数pȝQ会在这块内 存空间中的首地址处记录本ơ分配的大小Q这P代码中的delete语句才能正确的释放本内存I间。另外,׃扑ֈ的堆l点的大不一定正好等于申L? ,pȝ会自动的多余的那部分重新放入空闲链表中?
3.3甌大小的限?
栈:在Windows?栈是向低地址扩展的数据结构, 是一块连l的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是pȝ预先规定好的Q在 WINDOWS下,栈的大小?MQ也有的说是1MQM是一 个编译时q定的常数Q,如果甌的空间超q栈的剩余空间时Q将提示overflow。因此,能从栈获得的I间较小?
堆:堆是向高地址扩展的数据结构,是不q箋的内存区域。这是由于系l是用链表来存储的空闲内存地址的,自然是不q箋的,而链表的遍历方向是由低地址向高地址。堆的大受限于计算机系l中有效的虚拟内存。由此可见,堆获得的I间比较灉|Q也比较大?
3.4甌效率的比较:
栈由pȝ自动分配Q速度较快。但E序员是无法控制的?
堆是由new分配的内存,一般速度比较慢,而且Ҏ产生内存片,不过用v来最方便.
另外Q在WINDOWS下,最好的方式是用VirtualAlloc分配内存Q他不是在堆Q也不是在栈是直接在q程的地址I间中保留一快内存,虽然用v来最不方ѝ但是速度快,也最灉|
3.5堆和栈中的存储内?
栈: 在函数调用时Q第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句Q的地址Q然后是函数的各个参敎ͼ在大多数的C~译器中Q参数是由右往左入栈的Q然后是函数中的局部变量。注意静态变量是不入栈的?
当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地址Q也是dC的下一条指令,E序p点l运行?
堆:一般是在堆的头部用一个字节存攑֠的大。堆中的具体内容有程序员安排?
3.6存取效率的比?

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在q行时刻赋值的Q?
而bbbbbbbbbbb是在~译时就定的;
但是Q在以后的存取中Q在栈上的数l比指针所指向的字W串(例如?快?
比如Q?
#include stdio.h>;
void main()
{
char a =1;
char c[] ="1234567890";
char*p ="1234567890";
a
= c[1];
a
= p[1];
return;
}

对应的汇~代?
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al

W一U在d时直接就把字W串中的元素d寄存器cl中,而第二种则要先把指针D到edx中,在根据edxd字符Q显然慢了?


3.7结Q?
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?
使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大?

堆和栈的区别主要分:
操作pȝ斚w的堆和栈Q如上面说的那些Q不多说了?
q有是数据l构斚w的堆和栈Q这些都是不同的概念。这里的堆实际上指的是Q满_性质的)优先队列的一U数据结构,W?个元素有最高的优先权;栈实际上是满先进后出的性质的数学或数据l构?
虽然堆栈Q堆栈的说法是连h叫,但是他们q是有很大区别的Q连着叫只是由于历史的原因

阿光 2007-08-01 11:24 发表评论
]]>
OCIl典参考文档(转蝲Q?/title><link>http://www.shnenglu.com/guangping/archive/2007/07/06/27605.html</link><dc:creator>阿光</dc:creator><author>阿光</author><pubDate>Fri, 06 Jul 2007 07:44:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2007/07/06/27605.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/27605.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2007/07/06/27605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/27605.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/27605.html</trackback:ping><description><![CDATA[ 一Q?Oracle oci工具包安装: <br />$ORACLE_HOME\BIN:执行文g和help文g <br />$ORACLE_HOME\OCI\INCLUDE:头文?<br />$ORACLE_HOME\OCI\LIB\BC: for Borlanf C++的OCI?<br />$ORACLE_HOME\OCI\LIB\MSVC: for MS Visual C++的OCI?<br /><br />如果是unix下,对于ORACLE8iQ则OCI库在$ORACLE_HOME/lib?如果?i,则在$ORACLE_HOME/lib32下,库文件名一般ؓlibclntsh.so <br />1Q?创徏OCI环境卛_建和初始化OCI工作环境Q其他的OCI函数需要OCI环境才能执行?<br />2Q?需要申L句柄cdQ?<br />OCI环境句柄Q?OCI_HTYPE_ENV—它定义所有OCI函数的环境调用环境,是其他句柄的父句柄?由OCIEnvInit或OCIEnvCreate生成) <br /> 错误句柄QOCI_HTYPE_ERROR—作Z些OCI函数的参敎ͼ用来记录q些OCI函数操作q程中所产生的错误,当有错误发生Ӟ可用COIErrorGet()来读取错误句?中记录的错误信息?<br />服务器环境句柄:OCI_HTYPE_SVCCTX—定义OCI调用的服务器操作环境Q它包含服务器、用户会话和事务三种句柄?<br />服务器句柄:OCI_HTYPE_SERVER—标识数据源Q它转换Z服务器的物理q接?<br />用户会话句柄QOCI_HTYPE_SESSION—定义用戯色和权限及OCI调用的执行环境?<br />事务句柄QOCI_HTYPE_TRANS—定义执行SQL操作的事务环境,事务环境中包含用L会话状态信息?<br />语句句柄QOCI_HTYPE_STMT—是一个标识SQL语句或PL/SQL块,以及其相兛_性的环境?<br />Bind/Define句柄Q属于语句句柄的子句柄,由OCI库隐式自动生成。用户不需要自己再甌QOCI输入变量存储在bind 句柄中,输出变量存储在定义句柄中 <br /><br /> 3Q?句柄属性包括: <br />服务器环境句柄属性:(OCI_HTYPE_SVCCTX) <br /> OCI_ATTR_SERVER—设|?d服务环境的服务器环境属?<br /> OCI_ATTR_SESSION—设|?d服务环境的会话认证环境属?<br /> OCI_ATTR_TRANS—设|?d服务环境的事务环境属?<br />用户会话句柄属性:(OCI_HTYPE_SESSION) <br />OCI_ATTR_USERNAME—设|会话认证所使用的用户名 <br /> OCI_ATTR_PASSWORD—设|会话认证所使用的用户口?<br />服务器句柄:(OCI_HTYPE_SEVER) <br />OCI_ATTR_NOBLOCKING_MODE—设|?d服务器连接:=TRUE时服务器q接讄为非d方式 <br />语句句柄Q?OCI_HTYPE_STMT) <br />OCI_ATTR_ROW_COUNT—只读,为当前已处理的行敎ͼ其default=1 <br />OCI_ATTR_STMT_TYPE—读取当前SQL语句的类型: <br />Eg : OCI_STMT_BEGIN <br /> OCI_STMT_SELECT OCI_STMT_INSERT <br />OCI_STMT_UPDATE OCI_STMT_DELETE <br /> OCI_ATTR_PARAM_COUNT—返回语句选择列表中的列数 <br />4Q?关于输出变量定义Q如果在语句执行前就知道select语句的选择列表l构Q则定义输出操作可在调用 OCISTMTExecute前进行,如果查询语句的参Cؓ用户动态输入的Q则必须在执行后定义?<br />5Q?OCI函数q回| <br />OCI_SUCCESS –函数执行成?(=0) <br />OCI_SUCCESS_WITH_INFO –执行成功,但有诊断消息q回Q可能是警告信息 <br />OCI_NO_DATA—函数执行完成,但没有其他数?<br />OCI_ERROR—函数执行错?<br />OCI_INVALID_HANDLE—传递给函数的参Cؓ无效句柄Q或传回的句柄无?<br />OCI_NEED_DATA—需要应用程序提供运行时ȝ数据 <br />OCI_CONTINUE—回调函数返回代码,说明回调函数需要OCI库恢复其正常的处理操?<br />OCI_STILL_EXECUTING—服务环境徏立在非阻塞模式,OCI函数调用正在执行中?<br />6Q? OCIq接有二U方式:Blocking(d方式)和non_Blocking(非阻塞方?Q阻塞方式就是当调用 OCI操作Ӟ必须{到此OCI? 作完成后服务器才q回客户端相应的信息Q不是成功q是p|。非d方式是当客户端提交OCI操作l服务器后,服务器立卌? OCI_STILL_EXECUTING信息Q而ƈ不等待服务端的操作完成?<br /><br /><br /> 对于non-blocking方式Q应用程序若收到一个OCI函数的返回gؓ OCI_STILL_EXECUTING时必dơ对每一个OCI函数的返回D行判断,判断其成功与否?<br /> 可通过讄服务器属性ؓOCI_ATTR_NONBLOCKING_MODE来实现。系l默认方式ؓd模式. <br />7Q?OCI函数讄的模式有Q?<br /> OCI_DEFUALT:使用OCI默认的环?<br /> OCI_THREADEDQ线E环境下使用OCI <br /> OCI_OBJECTQ对象模?<br /> OCI_SHAREDQ共享模?<br /> OCI_EVENTS <br /> OCI_NO_UCB <br /> OCI_ENV_NO_MUTEXQ非互斥讉K模式 <br /> 其中模式可以用逻辑q算W进行P加,函数设|成多多U模式:如mode=OCI_SHREADED| OCI_OBJECT <br /><br />8Q?当应用进E与服务器断开q接ӞE序没有使用OCITransCommit()q行事务的提交,则所有活动的事务会自动回滚? <br />9Q?OCI重定义数据类?<br /> typedef unsigned char ub1; <br />typedef signed char sb1; <br />typedef unsigned short ub2; <br />typedef signed short sb2; <br />typedef unsigned int ub4; <br />typedef signed int sb4; <br />typedef ub4 duword; <br />typedef sb4 dsword; <br />typedef dsword dword; <br /><br />10Q?在SQL语句准备后,可以用OCIAttrSet(0讄该语句的cd属性OCI_ATTR_STMT_TYPEQ以后可d语句属性,Ҏ属性分别进行处理?<br />11Q?扚wl定输入和定义输出参敎ͼ数据存入一个静态数据组中。一ơ执行可以提交或d多行记录倹{?<br />12Q?l合占位W和指示器变量: <br />? 位符Q在E序中,一些SQL语句需要在E序q行时才能确定它的语句数据,在设计时可用一个占位符来代替,当程序运行时Q在它准备好语句后,必须为每个占? W指定一个变量,卛_占位W与E序变量地址l合Q执行时QOracle׃q些变量中读取数据,q将它们与SQL语句一起传递给Oracle服务器执行? OCIl合占位W时Q它占位符与程序变量关联v来,q同时要指出E序变量的数据类型和数据长度?<br />如:select * from test where name=:p1 and age>:p2 <br />Qp1和:p2为占位符 <br /><br />? C器变量Q由于在Oracle中,列值可以ؓNULLQ但在C语言中没有NULL|Z能OCIE序表达NULL列|OCI函数允许E序为所执行? 句中的结合变量同时关联一个指C符变量或指C符变量数组Q以说明所l合的占位符是否为NULL或所d的列值是否ؓNULLQ以及所d的列值是否被? 取?<br />除SQLTQNTYQSQL Named DataTypeQ外Q指C符变量或指C符变量数组的数据类型ؓsb2,其D明: <br />作ؓ输入变量ӞQ如insert ,update语句中) <br /> =-1QOCIE序NULL赋给Oracle表的列,忽略占位W结合的E序变量?<br />>=0Q应用程序将E序变量Dl指定列 <br />作ؓ输出变量ӞQ如select语句中) <br /> Q?2Q所d的列数据长度大于E序变量的长度,则被截取?<br /> =-1Q所d的gؓNULL,输出变量的g会被改变?<br />=0Q数据被完整d到指定的E序变量?<br />Q?Q所d的列数据长度大于E序变量的长度,则被截取Q指C符变量gؓ所d数据被截取前的实际长?<br />三. OCI函数说明 <br />注:U色入参? 蓝色出参? ,否则?出参?<br /><br /> CZ以下面结构作?<br /> sword swResult; <br />OCIBind* hBind; <br /> OCIDefine* hDefine; <br />OCIStmt *stmtp <br />OCIError *errhpQ?<br />OCIStmt *stmtp <br />OCISvcCtx * svchp <br />OCIEnv * envhpp; <br />OCISession * usrhp; <br />sb2 sb2aInd[30]; //指示器变量,用于取可能存在空值的字段 <br />Typedef strcut <br />{ <br />char tname[40]; <br />int age; <br />} t_std; <br />typedef struct <br />{ <br />sb2 sb2_tname[100]; <br /> sb2 sb2_age[100]; <br />} stdInd_T; //指示器数l?<br />typedef struct <br />{ <br />ub2 ub2_tname[100]; <br /> ub2 ub2_age[100]; <br />} stdLen_T; //字段长度 <br /><br />t_std tstd[100]; //数组变量Q用于批量操?<br />stdInd_T tstdInd; <br />stdLen_T tstdLen; <br />stdLen_T tstdRet; <br /><br /> t_std std; <br /><br />各函数数?<br />1Q创建OCI环境 <br />sword OCIEnvCreate( <br />OCIEnv **envhpp, //OCI环境句柄指针 <br />ub4 mode, //初始化模式:OCI_DEFAULT/OCI_THREADED {?<br />CONST dvoid *ctxp, <br />CONST dvoid *(*malicfp)(dvoid *ctxp,size_t size), <br />CONST dvoid *(ralocfp)(dvoid *ctxp,dvoid *memptr,size_t newsize), <br />CONST void *(*mfreefp)(dvoid *ctxp,dvoid *memptr), <br />Size_t xstramemsz, <br />Dvoid **usrmempp <br />) <br />eg : <br /> swResult = OCIEnvCreate(&envhpp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL); <br /><br />if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) <br />return FALSE; <br /><br />sword OCIInitialize ( <br /> ub4 mode, <br /> CONST dvoid *ctxp, <br /> CONST dvoid *(*malocfp) (/* dvoid *ctxp, size_t size _*/), <br /> CONST dvoid *(*ralocfp) (/*_ dvoid *ctxp, dvoid *memptr, size_t newsize _*/), <br /> CONST void (*mfreefp) (/*_ dvoid *ctxp, dvoid *memptr _*/) <br />); <br /><br />sword OCIEnvInit ( <br />OCIEnv **envhpp, <br /> ub4 mode, <br /> size_t xtramemsz, <br /> dvoid **usrmempp <br /> ); <br />注: <br /> ?i以后Q可用OCIEnvCreate一个函数就可以初始化环境了Q相当于OCIInitialize+ OCIEnvInit <br /><br />2Q申?释放句柄 <br /> sword OCIHandleAlloc( <br />CONST dvoid *parenth, //新申请句柄的父句柄,一般ؓOCI环境句柄 <br />Dvoid **hndlpp, //甌的新句柄 <br />Ub4 type, type, //句柄cd <br />Size_t xtramem_sz, //甌的内存数 <br />Dvoid **usrmempp //甌到的内存块指?<br />) <br />注: <br /> 一般需要申L句柄有: <br /> 服务器句柄OCIServer, 句柄cdOCI_HTYPE_SERVER <br />错误句柄OCIErrorQ用于捕获OCI错误信息, 句柄cdOCI_HTYPE_ERROR <br />事务句柄OCISession, 句柄cdOCI_HTYPE_SESSION <br />上下文句柄OCISvcCtx, 句柄cdOCI_HTYPE_SVCCTX <br />SQL语句句柄OCIStmt, 句柄cdOCI_HTYPE_STMT <br />eg: 甌一个错误句柄OCIError <br />swResult = OCIHandleAlloc(envhpp, (dvoid *)& errhp, OCI_HTYPE_ERROR, 0, NULL); <br />if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) <br />{ <br /><br />return FALSE; <br />} <br /><br />释放句柄 <br /> sword OCIHandleFree( <br />dvoid *hndlp, //要释攄句柄 <br />ub4 type //句柄cd <br />) <br /><br />eg: <br /> OCIHandleFree(stmtp, OCI_HTYPE_STMT) <br />3Q读?讄句柄属?<br /> sword OCIAttrSet( <br />dvoid *trgthndlp, //需讄的句柄名 <br />ub4 trghndltyp, //句柄cd <br />dvoid *attributep, //讄的属性名 <br />ub4 size, //属性值长?<br />ub4 attrtype, //属性类?<br />OCIError *errhp //错误句柄 <br />) <br />注:一般要讄的属性有Q?<br /> 服务器实例: <br />句柄cdOCI_HTYPE_SVCCTXQ属性类型OCI_ATTR_SERVER <br /> q接数据的用户名Q?<br /> 句柄cdOCI_HTYPE_SESSIONQ属性类型OCI_ATTR_USERNAME <br />用户密码 <br /> 句柄cdOCI_HTYPE_SESSIONQ属性类型OCI_ATTR_PASSWORD <br />事务Q? <br /> 句柄cdOCI_HTYPE_SVCCTXQ属性类型OCI_ATTR_SESSION <br /><br />eg:讄用户名和密码 <br />char username[20],passwd[20]; <br /> strcpy(username,”tiger? <br />strcpy(passwd,”cotton? <br />swResult = OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (text*) username, strlen(username), <br />OCI_ATTR_USERNAME, errhp); <br />if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) <br />return FALSE; <br /><br />swResult = OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (text*) passwd, strlen(passwd), <br />OCI_ATTR_PASSWORD, errhp); <br />if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) <br />return FALSE; <br /><br /><br />sword OCIAttrGet( <br />dvoid *trgthndlp, //需d的句柄名 <br />ub4 trghndltyp, //句柄cd <br />dvoid *attributep, //d的属性名 <br />ub4 *sizep, //属性值长?<br />ub4 attrtype, //属性类?<br />OCIError *errhp //错误句柄 <br />) <br /><br />4Q连?断开服务?<br /> 多用h式连接: <br /> sword OCIServerAttach( <br />OCIServer *srvhp,//未初始化的服务器句柄 <br /> OCIError *errhp, <br /> CONST text *dblink,//服务器SID <br /> sb4 dblink_len, <br /> ub4 mode //=OCI_DEFAULT,pȝ环境设为阻塞方?<br />); <br /><br /> sword OCIServerDetach ( <br />OCIServer *srvhp, <br /> OCIError *errhp, <br /> ub4 mode //OCI_DEFAULT <br />); <br />单用h式连接: <br /> sword OCILogon ( <br />OCIEnv *envhp, <br /> OCIError *errhp, <br /> OCISvcCtx **svchp, <br /> CONST text *username, <br /> ub4 uname_len, <br /> CONST text *password, <br /> ub4 passwd_len, <br /> CONST text *dbname, <br /> ub4 dbname_len <br />); <br /><br />sword OCILogoff ( <br />OCISvcCtx *svchp <br /> OCIError *errhp <br />); <br /><br />5Q开?l束一个会?<br />先认证用户再建立一个会话连?<br /> sword OCISessionBegin ( <br />OCISvcCtx *svchp, //服务环境句柄 <br /> OCIError *errhp, <br /> OCISession *usrhp, //用户会话句柄 <br /> ub4 credt, //认证cd <br /> ub4 mode //操作模式 <br />); <br /><br /> *认证cdQ?<br />OCI_CRED_RDBMS:用数据库用户名和密码q行认证Q则先要讄OCI_ATTR_USERNAME和OCI_ATTR_PASSWORD属?<br />OCI_CRED_EXT:外部认证Q不需要设|用户和密码 <br />OCI_DEFAULTQ用户会话环境只能被指定的服务器环境句柄所讄 <br />OCI_SYSDBAQ用戯hsysdba权限 <br />OCI_SYSOPERQ用戯hsysoper权限 <br /><br /><br />Eg: <br />swResult = OCISessionBegin(svchp, errh,usrhp, OCI_CRED_RDBMS, OCI_DEFAULT); <br />if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) <br />return FALSE; <br /><br /><br />sword OCISessionEnd ( <br />OCISvcCtx *svchp, <br /> OCIError *errhp, <br /> OCISession *usrhp, <br /> ub4 mode ); <br />6Q读取错误信?<br /> sword OCIErrorGet ( <br />dvoid *hndlp, //错误句柄 <br /> ub4 recordno,//从那里读取错误记录,?开?<br /> text *sqlstate,//已取消,=NULL <br /> sb4 *errcodep, //错误?<br /> text *bufp, //错误内容 <br /> ub4 bufsiz, //bufp长度 <br /> ub4 type //传递的错误句柄cd <br />=OCI_HTYPE_ERROR:错误句柄 <br />=OCI_HTYPE_ENVQ环境句?<br />); <br />eg: <br /> ub4 ub4RecordNo = 1; <br />OCIError* hError <br />sb4 sb4ErrorCode; <br />char sErrorMsg[1024]; <br /><br />if (OCIErrorGet(hError, ub4RecordNo++, NULL, &sb4ErrorCode, (OraText*) sErrorMsg, sizeof(sErrorMsg), OCI_HTYPE_ERROR) == OCI_SUCCESS) <br /> printf(“error msg:%s\n? sErrorMsg); <br /><br /><br />7Q准备SQL语句 <br />sword OCIStmtPrepare ( <br />OCIStmt *stmtp,//语句句柄 <br /> OCIError *errhp, <br /> CONST text *stmt, //SQL语句 <br /> ub4 stmt_len, //语句长度 <br /> ub4 language, //语句的语法格?OCI_NTV_SYNTAX <br />ub4 mode //=OCI_DEFAULT <br />); <br /><br />eg: <br /> char sSQL[1024]; <br /><br />sprintf(sSQL, “select table_name from user_tables?; <br /><br />swResult = OCIStmtPrepare(stmtp errhp, (CONST OraText*)sSQL, strlen(sSQL), OCI_NTV_SYNTAX, OCI_DEFAULT); <br />if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) <br />return FALSE; <br /><br /><br /><br /><br />8Q?l定输入参数 <br /><br />OCIBindArrayOfStruct() Set skip parameters for static array bind Q数l绑定,一般用于批量操? <br />OCIBindByName() Bind by name 按名l定 <br />OCIBindByPos() Bind by position 按位|绑?一般按此方式绑?<br />OCIBindDynamic() Sets additional attributes after bind with OCI_DATA_AT_EXEC mode <br />OCIBindObject() Set additional attributes for bind of named data type <br /><br />注: <br />OCIBindArrayOfStruct必须先用OCIBindByPos初始化,然后在OCIBindArrayOfStruct中定义每个参数所跌的字节数?<br />如: <br /><br />存储方式Q?<br /><br /><br /><br />W一条记录第二条记录 N <br /><br /><br /> SkipPara(实际是l构体长度,xơ所有列的长度和) <br /><br /><br /><br />sword OCIBindByName ( <br />OCIStmt *stmtp, //语句句柄 <br /> OCIBind **bindpp,//l合句柄,=NULL <br /> OCIError *errhp, <br /> CONST text *placeholder,//占位W名U?<br /> sb4 placeh_len, //占位W长?<br /> dvoid *valuep, //l定的变量名 <br /> sb4 value_sz, //l定的变量名长度 <br /> ub2 dty, //l定的类?<br /> dvoid *indp, //指示W变量指?sb2cd),单条l定时ؓNULL, <br /> ub2 *alenp, //说明执行前后被结合的数组变量中各元素数据实际的长度,单条l定时ؓNULL <br /> ub2 *rcodep,//列q回码数据指针,单条l定时ؓNULL <br /> ub4 maxarr_len, //最多的记录?如果是单条绑定,则ؓ0 <br /> ub4 *curelep, //实际的记录数,单条l定则ؓNULL <br /> ub4 mode //=OCI_DEFAULT <br />); <br /><br />sword OCIBindByPos ( OCIStmt *stmtp, <br /> OCIBind **bindpp, <br /> OCIError *errhp, <br /> ub4 position,// l定的位|?<br /> dvoid *valuep, <br /> sb4 value_sz, <br /> ub2 dty, <br /> dvoid *indp, <br /> ub2 *alenp, <br /> ub2 *rcodep, <br /> ub4 maxarr_len, <br /> ub4 *curelep, <br /> ub4 mode ); <br /><br />sword OCIBindArrayOfStruct ( <br />OCIBind *bindp,//l定的结构句?由OCIBindByPos定义 <br /> OCIError *errhp, <br /> ub4 pvskip, //下一列蟩q的字节?* <br /> ub4 indskip,//下一个指C器或数l蟩q的字节? <br /> ub4 alskip, //下一个实际Dq的字节?<br /> ub4 rcskip //下一个列U返回Dq的字节?<br />); <br /><br />例: <br />sword swResult; <br />OCIBind* hBind; <br />Ub4 rec_num; <br />Sql: insert into student values (:p1,:p2) <br /><br />单条l定Q?<br />hBind = NULL; <br />swResult = OCIBindByPos(stmtp &hBind, errhp,1,ststd.tname, <br />sizeof(ststd.tname), SQLT_CHR, NULL, <br />NULL,NULL,0, NULL, OCI_DEFAULT); <br /><br /><br />扚w取数据,一ơ取100?<br />Sql: select username,age from student where username=:p1 and age=:p2 <br /><br />hBind = NULL; <br />swResult = OCIBindByPos(stmtp &hBind, errhp,1,tstd[0].tname, <br />sizeof(tstd[0].tname), SQLT_CHR, &tstdInd.sb2_usernmae[0], <br />&tstdLen.ub2_username[0],&tstdRet.ub2_username[0],100, &rec_num, OCI_DEFAULT); <br />swResult = OCIBindArrayOfStruct(hBind, errhp,sizeof(tstd [0]), sizeof(sb2), sizeof(ub2), sizeof(ub2)); <br /><br />9Q执行SQL语句 <br />sword OCIStmtExecute ( <br />OCISvcCtx *svchp, //服务环境句柄 <br /> OCIStmt *stmtp, //语句句柄 <br /> OCIError *errhp, <br /> ub4 iters, // ** <br /> ub4 rowoff, //** <br /> CONST OCISnapshot *snap_in, <br /> OCISnapshot *snap_out, <br /> ub4 mode //** <br />); <br /> **注: <br />1. iters:对于select语句Q它说明一ơ执行读取到buffer中的记录行数Q如果不能确定select语句所q回的行敎ͼ可将iters讄?,而对于其他的语句Qiters表示q些语句的执行次敎ͼ此时iters不能??<br />2. rowoff:在多行执行时Q该参数表示从所l合的数据变量中的第几条记录开始执?卌录偏U量)?<br />3. modeQ?OCI_DEFAULT:default模式 <br />=OCI_DESCRIBE_ONLYQ描q模式,只返回选择列表的描qC息,而不执行语句 <br />=OCI_COMMIT_ON_SUCCESSQ自动提交模式,当执行成功后Q自动提交?<br />=OCI_EXACT_FETCH:_提取模式?<br />=OCI_BATCH_ERRORSQ? 扚w误执行模式:用于执行数组方式的操作,在此模式下,扚winsert ,update,deleteӞ执行q程中Q何一条记录错误不会导致整? insert ,update,deletep|Q系l自动会攉错误信息Q而在非批错误方式下,其中的Q何一条记录错误,会D整个操作p|?<br />Eg: <br />执行一?<br />swResult = OCIStmtExecute(svchp, stmtp, errhpQ? <br /> 1, 0, NULL, NULL, OCI_DEFAULT); <br />扚w执行100ơ: <br />swResult = OCIStmtExecute(svchp, stmtp, errhpQ? <br /> 100, 0, NULL, NULL, OCI_DEFAULT); <br /><br />10Q定义输出变?<br /><br />OCIDefineArrayOfStruct() Set additional attributes for static array define <br />OCIDefineByPos() Define an output variable association <br />OCIDefineDynamic() Sets additional attributes for define in OCI_DYNAMIC_FETCH mode <br />OCIDefineObject() Set additional attributes for define of named data type <br /><br />sword OCIDefineByPos ( <br />OCIStmt *stmtp, //语句句柄 <br /> OCIDefine **defnpp,//定义句柄—用于数l变?<br /> OCIError *errhp, <br /> ub4 position,//位置序号(? 开? <br /> dvoid *valuep, //输出的变量名 <br /> sb4 value_sz, //变量长度 <br /> ub2 dty, //数据cd <br /> dvoid *indp, //指示器变?指示器变量数l,如果此字D可能存在空|则要指示器变量,否则单条处理时ؓNULL <br /> ub2 *rlenp, //提取的数据长?<br /> ub2 *rcodep, //列q回码数l指?<br />ub4 mode //OCI_DEFAULT <br />); <br /><br /><br /><br /><br />sword OCIDefineArrayOfStruct ( <br />OCIDefine *defnp,//由OCIDefineByPos定义的句?<br /> OCIError *errhp, <br />ub4 pvskip, //下一列蟩q的字节?一般就是结构的大小 <br /> ub4 indskip,//下一个指C器或结构蟩q的字节?=0 <br /> ub4 rlskip, //下一个实际Dq的字节?=0 <br /> ub4 rcskip //下一个列列q回Dq的字节?=0 <br />); <br /><br />sword OCIDefineDynamic ( <br />OCIDefine *defnp, <br /> OCIError *errhp, <br /> dvoid *octxp, <br /> OCICallbackDefine (ocbfp)(/*_ <br /> dvoid *octxp, <br /> OCIDefine *defnp, <br /> ub4 iter, <br /> dvoid **bufpp, <br /> ub4 **alenpp, <br /> ub1 *piecep, <br /> dvoid **indpp, <br /> ub2 **rcodep _*/) ); <br /><br />sword OCIDefineObject ( OCIDefine *defnp, <br /> OCIError *errhp, <br /> CONST OCIType *type, <br /> dvoid **pgvpp, <br /> ub4 *pvszsp, <br /> dvoid **indpp, <br /> ub4 *indszp ); <br /><br />eg: <br />单条查询 <br />sql: select username,age from student where username=:p1; <br /> 如果此字D|可能有空|?<br />hDefine = NULL; <br />swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tstd.username), SQLT_CHR, & sb2aInd[0], NULL, NULL, OCI_DEFAULT); <br />如果此字D|有空|?<br />hDefine = NULL; <br />swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tstd.username), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT); <br /><br /> 扚w查询 <br />select username,age from student where age>30; <br />hDefine = NULL; <br />swResult = OCIDefineByPos(stmtp, &hDefine, errhp, 1, &tstd[0].username, <br />sizeof(tstd[0].usenmae), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT); <br /><br />swResult = OCIDefineArrayOfStruct(hDefine, errhp, sizeof(tstd[0]), 0, 0, 0); <br />11Q提取结?<br />sword OCIStmtFetch ( <br />OCIStmt *stmtp,//语句句柄 <br /> OCIError *errhp, <br /> ub4 nrows, //从当前位|处开始一ơ提取的记录敎ͼ对于数据变量Q可?gt;1,否则不能>1 <br /> ub2 orientation,//提取的方向:OCI_FETCH_NEXT <br />ub4 mode //OCI_DEFAULT <br /> ) <br /><br />eg <br /> while ((swResult=OCIStmtFetch stmtp errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT)) != OCI_NO_DATA) <br />{ <br />…?<br />} <br /><br />12Q事务操?<br />开始一个事?<br />sword OCITransStart ( <br />OCISvcCtx *svchp, <br /> OCIError *errhp, <br /> uword timeout, //** <br /> ub4 flags ); <br />**注: <br />1Q?Timeout: <br />当flag=OCI_TRANS_RESUME:它表C有多秒事务被Ȁz?<br />=OCI_TRANS_NEW: 事务响应的超时时?U? <br />2Q?Flags:指定一个新的事务还是已有事?<br />=OCI_TRANS_NEWQ定义一个新的事?<br />=OCI_TRANS_RESUME <br /><br />准备一个事务: <br />sword OCITransPrepare ( <br /> OCISvcCtx *svchp, <br /> OCIError *errhp, <br /> ub4 flags );//OCI_DEFAULT <br /><br />sword OCITransForget ( <br />OCISvcCtx *svchp, <br /> OCIError *errhp, <br /> ub4 flags );//OCI_DEFAULT <br /><br />断开一个事务: <br />sword OCITransDetach ( <br />OCISvcCtx *svchp, <br /> OCIError *errhp, <br />ub4 flags );//OCI_DEFAULT <br /><br /> 提交一个事务: <br /> sword OCITransCommit ( <br />OCISvcCtx *svchp, //服务环境句柄 <br /> OCIError *errhp, <br /> ub4 flags ); //OCI_DEFAULT <br />回滚一个事?<br />sword OCITransRollback ( <br />dvoid *svchp, <br /> OCIError *errhp, <br /> ub4 flags ); //OCI_DEFAULT <br /><br /><br />四. OCI数据cd与C语言数据cd对照?<br />表字D늱?     OCIcd Ccd 备注 <br />Number(N) SQLT_UIN  int 无符h?<br />Number(N) SQLT_INT  int 有符h?<br />Number(n,m) SQLT_FLT  float W点?<br />Varchar2(N) Sqlt_chr  Char 字符?<br />Raw(N)   Sqlt_BIN 具体看不同的定义 二进制类型,多用于一个结构字D?<br />DATE SQLT_DAT ?最好{换成字符串或数字<br /><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=582980</p><img src ="http://www.shnenglu.com/guangping/aggbug/27605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">阿光</a> 2007-07-06 15:44 <a href="http://www.shnenglu.com/guangping/archive/2007/07/06/27605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于VC++ 2005下开发ActiveX控g?属性和属性页控g值关联的困惑http://www.shnenglu.com/guangping/archive/2007/07/05/27513.html阿光阿光Thu, 05 Jul 2007 02:03:00 GMThttp://www.shnenglu.com/guangping/archive/2007/07/05/27513.htmlhttp://www.shnenglu.com/guangping/comments/27513.htmlhttp://www.shnenglu.com/guangping/archive/2007/07/05/27513.html#Feedback1http://www.shnenglu.com/guangping/comments/commentRss/27513.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/27513.html

我刚开始学习ActiveX开?使用MFC。我对ActiveX控g新增一个名?Caption",cd为int的属?我在ActiveX的属性页上新增一个Edit control,想通过该Edit control来直接设|?Caption"属性的?
现在问题来了:
在VC6.0中开发时可以通过class wizard?增加成员变量"来直接将该Edit control?Caption"属性关?生成的代码在DoDataExchangeҎ中如?

void CCircPropPage::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CCircPropPage)
DDP_Text(pDX, IDC_CAPTION, m_caption, _T("Caption") );//(1)
DDX_Text(pDX, IDC_CAPTION, m_caption);
//}}AFX_DATA_MAP
DDP_PostProcessing(pDX);
}

其中(1)行的最一个参?_T("Caption") ,是该Edit control所兌的属性名.

? 在VC++ 2005?却没有直接将Edit control与属性相兌的功?在VC++ 2005中在Edit control上右?选择"d变量",打开"d成员变量向导",但该向导只能d与Edit control兌?成员变量",无法该Edit control ?Caption"属性关?VC++ 2005生成的代码如?

void CCircPropPage::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CCircPropPage)
//DDP_Text(pDX, IDC_CAPTION, m_caption, _T("Caption") );//(1)//q是VC6生成的代码,q里留作参照
//DDX_Text(pDX, IDC_CAPTION, m_caption);//q也是VC6生成?br />//}}AFX_DATA_MAP
DDP_PostProcessing(pDX); //(2)
DDX_Text(pDX, IDC_CAPTION1, m_caption1);//<--(3) VC++产生的代?
}

? 中第(3)行ؓVC++ 2005产生的代?它ƈ没有调用DDP_pd的函?也将代码攑֜了AFX_DATA_MAP宏的外面、第(2)行的下面(W?行函数的功能?l束? 性gControl的{?,也就是说VC++ 2005q没有将Edit control与属性关联的功能!??
虽然可以通过手动d方式解决,但我总觉得VC++ 2005应该提供如此功能,不知道有没有朋友遇到q与我相同的问题,如何解决?

NQ正如别人所_VC2005比VC6是一个退步?br />

阿光 2007-07-05 10:03 发表评论
]]>
MFC消息映射机制的剖?孙鑫VC++讲W记-(4)转蝲q修?http://www.shnenglu.com/guangping/archive/2007/03/02/19106.html阿光阿光Fri, 02 Mar 2007 01:58:00 GMThttp://www.shnenglu.com/guangping/archive/2007/03/02/19106.htmlhttp://www.shnenglu.com/guangping/comments/19106.htmlhttp://www.shnenglu.com/guangping/archive/2007/03/02/19106.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/19106.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/19106.html一Q消息映机?/p>

1Q消息响应函敎ͼQ例Q在CDrawViewcd应鼠标左键按下消息)
1Q在头文?DrawView.h)中声明消息响应函数原型?br />//{{AFX_MSG(CDrawView) //注释?br />afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG //注释?br />说明Q?br />在注释宏之间的声明在VC中灰色显C。afx_msg宏表C声明的是一个消息响应函数?

q个注释宏ؓ的是让ClassWizard能够分L出哪些代码是它生成的Q哪些是你自己写的?br />你自己写的代码要在这个注释之外,q样ClassWizard再修Ҏ息映的时候就不会你的代码了?br />限于以前的硬仉度QClassWizard比较dQ所以需要这些注释宏来定位。从7.0开始,׃再需
要了。新的属性页能够自动分析你的代码Qؓ你添加或者删除代码,而无需什么特D标记的帮忙?br />因此注释宏已l是历史产物了?/p>

2Q在源文ӞDrawView.cpp)中进行消息映?br />BEGIN_MESSAGE_MAP(CDrawView, CView)
//}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
说明Q?br />在宏BEGIN_MESSAGE_MAP()与END_MESSAGE_MAP()之间q行消息映射?br />宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN与它的响应函数OnLButtonDownQ)相关联。这样一旦有消息的生,׃自动调用相关联的消息响应函数d理?br />宏ON_WM_LBUTTONDOWN()定义如下Q?br />#define ON_WM_LBUTTONDOWN()
{ WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp,
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(UINT, CPoint))&OnLButtonDown },
3Q源文g中进行消息响应函数处理。(DrawView.cpp中自动生成OnLButtonDown函数轮廓Q如下)
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
}
说明Q?br />可见当增加一个消息响应处理,在以上三处进行了修改。可在消息响应函数里d消息处理代码完成Ҏ息的响应、处理?/p>

2Q消息响应的方式Q?br />1Q? 在基cM针对每种消息做一个虚函数Q当子类Ҏ息响应时候,只要在子cM重写q个虚函数即可。缺点:MFCcL生层ơ很多,如果在基cd每个消息q行虚函 数处理,那么从基cL生的每个子类都将背负一个庞大的虚表Q这h费内存,故MFC没有采取q中方式而采取消息映方式?br />2Q消息映方式: MFC在后台维护了一个句柄和C++对象指针对照表,当收C个消息后Q通过消息l构里资源句柄(查对照表Q就可找C它对应的一个C++对象指针Q然? 把这个指针传l基c,基类利用q个指针调用WindowProc()函数Ҏ息进行处理,WindowProc()函数中调用OnWndMsg()函数Q? 真正的消息\由及处理是由OnWndMsg()函数完成的。由于WindowProc()和OnWndMsg()都是虚函敎ͼ而且是用zcd象指针调? 的,由多态性知最ȝ调用子类的。在OnWndMsg()函数处理的时候,Ҏ消息U类L找消息映,判断所发的消息有没有响应函敎ͼ具体方式是到相关 的头文g和源文g中寻找消息响应函数声明(从注释宏//}AFX_MSG之间LQ,消息映射Q从宏BEGIN_MESSAGE_MAP(...)....END_MESSAGE_MAP()之间LQ,最l找到对应的消息处理函数。当Ӟ如果子类中没有对消息q行处理Q则消息交由基类处理?br />说明Q?br />virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);



阿光 2007-03-02 09:58 发表评论
]]>
用wxDbQODBCQ连接Excel sheethttp://www.shnenglu.com/guangping/archive/2007/01/30/18180.html阿光阿光Tue, 30 Jan 2007 06:13:00 GMThttp://www.shnenglu.com/guangping/archive/2007/01/30/18180.htmlhttp://www.shnenglu.com/guangping/comments/18180.htmlhttp://www.shnenglu.com/guangping/archive/2007/01/30/18180.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/18180.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/18180.html 发表主题: 用wxDbQODBCQ连接Excel sheet
到个活要读取Excel文g中的数据Q搜了一下Excel有ODBC驱动可以使用Q碰巧wxWidgets又有ODBC模块Q真是可以省掉不事情。本以ؓ可以L搞定Q不料一直没有能q接上,郁闷了一阵子Q后来在RTFS的原则下l于调试出,原来是wxDb的一个bug,修复和提交patch后,问题解决?

bug submission:
https://sourceforge.net/tracker/?func=detail&atid=309863&aid=1494705&group_id=9863

使用范例Q?
wxString s = wxT("DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';DBQ=")+filename;
wxDbConnectInf dbi;
dbi.SetConnectionStr(s);
dbi.AllocHenv();
db = new wxDb(dbi.GetHenv());
db->Open(&dbi);//this line failed if not patched


在后面提取数据的时候,需要提供table名字QExcel比较ҎQ不是直观的关系型数据库那样可以看到table的存在。方法是Q?
选定数据区域,菜单->插入->名称->定义,里面输入的名字就是table名称?

提取table的例子:
if(db->TableExists(wxT("ryzl"))){
UWORD n;
wxDbColInf *cols = db->GetColumns(wxT("ryzl"),&n);
if(cols == NULL){
wxMessageBox(wxT("no no get"));
}else{
wxMessageBox(wxString::Format(wxT("we got %d"),(int)n));
}
}else{
wxMessageBox(wxT("table ryzl not exists"));
}


阿光 2007-01-30 14:13 发表评论
]]>
wxODBC(wxWidgets)中用驱动程序方式打开数据?/title><link>http://www.shnenglu.com/guangping/archive/2007/01/29/18150.html</link><dc:creator>阿光</dc:creator><author>阿光</author><pubDate>Mon, 29 Jan 2007 09:34:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2007/01/29/18150.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/18150.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2007/01/29/18150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/18150.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/18150.html</trackback:ping><description><![CDATA[ <p>wxODBC(wxWidgets)中用驱动程序方式打开数据?/p> <p>wxWidgets的文档中都是使用在控刉?数据源中讑֮DSN来创建ODBCq接。但是实际上很多型的应用,只是使用本机的一个Access数据库。而要求用者学习ODBC的DSN配置明显的增加了软g的用难度。因此,研究了一下wxforum.org中的帖子Q试验成功!范例如下Q?/p> <p>wxDbConnectInf *DbConnectInf = NULL; // 定义数据库连接信息指针DB connection information<br />wxDb *PodDB = NULL; // 定义数据库连接指针Database connection<br />wxDbTable *table = NULL; // 定义数据表指针Data table to access </p> <p>DbConnectInf = new wxDbConnectInf(0, wxT(""), wxT(""), wxT(""));//q里定义的内容基本没用,但不定义会报?/p> <p>PodDB = new wxDb(DbConnectInf->GetHenv());</p> <p>bool DBfailOnDataTypeUnsupported=!true;//<br />if(!DB->Open(wxT("DRIVER=Microsoft Access Driver (*.mdb);DBQ=D:\\pod.mdb;UID=admin;"),DBfailOnDataTypeUnsupported))//使用驱动E序的方式打开数据?br />{<br />if (PodDB->IsOpen())<br />{<br />// Connection is open, but the initialization of<br />// datatypes and parameter settings failed<br />return 0;<br />}<br />else<br />{<br />// Error opening datasource<br />//return HandleError(wxT("DB ENV ERROR: Cannot allocate ODBC env handle"));<br />return 0;<br />}<br />}<br />const wxString tableName = wxT("POD"); //定义要操作的表的名称<br />const UWORD numTableColumns = 8; //指出POD表中的列敎ͼcolumnsQ?br />//建立到表的连?br />table = new wxDbTable(PodDB, tableName, numTableColumns, wxT(""), wxDB_QUERY_ONLY, wxT(""));</p> <p>//存放提取数据的变量清空<br />wxStrcpy(pPodPictureInfo->Title, wxT(""));<br />......</p> <p>//定义列的数据格式Q和取出的格式?br />//此处需要注意的是如果前面指明了numTableColumns为n的话Q就一定要定义n?br />table->SetColDefs(0, wxT("Pod_Title"), DB_DATA_TYPE_VARCHAR, pPodPictureInfo->Title, SQL_C_WXCHAR, sizeof(pPodPictureInfo->Title), true, true);<br />......</p> <p>//打开?br />if (!table->Open())<br />{<br />//An error occurred opening (setting up) the table"));<br />}</p> <p>//限定取出Pod_When列gؓ1982的行(row)<br />table->SetWhereClause(wxT("Pod_When = '1982'"));</p> <p>//按照PodDate字段排序<br />table->SetOrderByClause(wxT("Pod_Date"));</p> <p>//Ҏ上面的限定信息执行查询操?br />if (!table->Query())<br />{<br />return HandleError(wxT("QUERY ERROR: "), table->GetDb());<br />//return 0;<br />}</p> <p>while (table->GetNext())//提取查询到的?br />{<br />wxString msg; // Used for display messages<br />msg.Printf(wxT("Row #% lu --\nTitle : %s\nPodDate : %s\nWhere : %s\nWhen : %s\nWho : %s\nDisc : %s\nRelated : %s\nPhotoName :%s"),<br />table->GetRowNum(),<br />pPodPictureInfo->Title,<br />pPodPictureInfo->PodDate,<br />pPodPictureInfo->Where,<br />pPodPictureInfo->When,<br />pPodPictureInfo->Who,<br />pPodPictureInfo->Disc,<br />pPodPictureInfo->Related,<br />pPodPictureInfo->PhotoName<br />);<br />//查表操作/现实获取的POD信息<br />//wxSafeShowMessage(wxT("Pod_wxDbTable Test"),msg);<br />}</p> <p> <br />------补充一?-----</p> <p>在SetColDefs中关联的变量不能使用wxStringQ只能用wxChar[n]{格式?/p> <p> </p> <p> <br />struct PodPictrueInfo<br />{<br />wxChar Title[100];<br />......</p> <p>}</p> <p> </p> <img src ="http://www.shnenglu.com/guangping/aggbug/18150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">阿光</a> 2007-01-29 17:34 <a href="http://www.shnenglu.com/guangping/archive/2007/01/29/18150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于完美的C++开发环境的思?/title><link>http://www.shnenglu.com/guangping/archive/2006/05/08/6745.html</link><dc:creator>阿光</dc:creator><author>阿光</author><pubDate>Mon, 08 May 2006 06:55:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2006/05/08/6745.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/6745.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2006/05/08/6745.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/6745.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/6745.html</trackback:ping><description><![CDATA[我一直在L着一个完的C++开发环境组合,我期望的完美是这LQ? 1、跨q_的,q可以保证我的一ơ智力学习投资,获得多方面的收宜? 2、开攄Q至不会因为某一个商业行消亡,像dephi有点前景不妙? 3、可自由配置的,我可以Q意选择自已喜欢的编译器Q而不是由它来指定Q我可以选择自已喜欢的类库,而不是非它自已的库不可? 4、有着清爽不繁杂,友好又不霔RQ灵zd不失习惯标准的可视化操作环境? 5、是Z代码效率最高化为目标,兼容性占W一位的。不要像那些非要装个 .net或jreq类的,讨h烦? 6、必要100%支持C++最新标准的? 7、当Ӟ软g的体U不能太大,太消耗资源的软gQ也是很难让人接受的? Ҏ以上的想法: 我目前的C++环境是这L合的Q? Code::blocks + mingw + wxWidgetQDialogBlocks 前三样都是开源的Q跨q_的,可自由配|的。最后一hZ配合wxWidget而选择的,是商业YӞq不能不说是个遗憾,但目前还没找C个功能上能比的上它,又开源免费的工具。只能期望有更多的志愿者作奉献了。但是Code::blocks本n没有一个理想的GUI设计器确实太~憾了,它自w的smith虽然是GUI设计器,但远q不成熟Q所以只好配合DialogBlocks? 不能不说Qؓ什么这么多q来Q就没有一个称心的开发工具呢Q这L日子真的永远不会到来吗? <img src ="http://www.shnenglu.com/guangping/aggbug/6745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">阿光</a> 2006-05-08 14:55 <a href="http://www.shnenglu.com/guangping/archive/2006/05/08/6745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.gzmwx.cn" target="_blank">һõþۺϺݺݰ</a>| <a href="http://www.hetiandai.cn" target="_blank">þþþƷƵѹۿ</a>| <a href="http://www.dcjx02.cn" target="_blank">vaþþþ</a>| <a href="http://www.zhongshengwsl.cn" target="_blank">AVþþƷɫ</a>| <a href="http://www.anatolia.com.cn" target="_blank">þùƷHDAV</a>| <a href="http://www.s9375.cn" target="_blank">þþƷһӰԺ</a>| <a href="http://www.0791gogo.cn" target="_blank">þþѾƷre6</a>| <a href="http://www.szsdhy.cn" target="_blank">ŷպþAV</a>| <a href="http://www.wxbdd.cn" target="_blank">˾þĻ</a>| <a href="http://www.lshwn.cn" target="_blank">þ޹˾Ʒ</a>| <a href="http://www.m2fz.cn" target="_blank">ھƷþ</a>| <a href="http://www.epfb.cn" target="_blank">ҹƷþþþþ˳</a>| <a href="http://www.matchweb.cn" target="_blank">ҹƷþþþ</a>| <a href="http://www.jingxuan001.cn" target="_blank">þþƷѿ</a>| <a href="http://www.ahgmxy.com.cn" target="_blank">Ʒþþþá</a>| <a href="http://www.by1506.cn" target="_blank">ҹþþþüŮӰԺ</a>| <a href="http://www.cybook.com.cn" target="_blank">ƷþþþþþþþĻ </a>| <a href="http://www.292284.cn" target="_blank">þþƷ</a>| <a href="http://www.sdxingying.com.cn" target="_blank">˾þav</a>| <a href="http://www.mk606.cn" target="_blank">þþƷ</a>| <a href="http://www.d4ycf2r.cn" target="_blank">޳ɫ999þվ</a>| <a href="http://www.mail-lists.cn" target="_blank">ɫ8þ97㽶987</a>| <a href="http://www.shlinfeng.com.cn" target="_blank">Ʒþþþþ </a>| <a href="http://www.qysf88.cn" target="_blank">þþþһƷ޹ۺAV </a>| <a href="http://www.163sms.cn" target="_blank">Ĺ˾Ʒþ޾ƷA뾫Ʒ </a>| <a href="http://www.xiezongjun.cn" target="_blank">˾þô߽ۺĻ</a>| <a href="http://www.91hid.cn" target="_blank">þþƷAVũ帾Ů</a>| <a href="http://www.37000.com.cn" target="_blank">ҹƷþ</a>| <a href="http://www.88kam.cn" target="_blank">㽶þҹɫƷ2020</a>| <a href="http://www.0736auto.cn" target="_blank">ƷۺרƬþþ</a>| <a href="http://www.ysbzxx.com.cn" target="_blank">Ʒٸavþ</a>| <a href="http://www.leyuzhe.cn" target="_blank">ۺŮþþ30p</a>| <a href="http://www.x247.cn" target="_blank">պĻþ</a>| <a href="http://www.vygd.cn" target="_blank">Ļɫ͵͵þ</a>| <a href="http://www.02324.cn" target="_blank">77777ҹþö</a>| <a href="http://www.vrmn.cn" target="_blank">þҹ³Ƭ</a>| <a href="http://www.88815755.cn" target="_blank">ɫۺϾþþþר</a>| <a href="http://www.werro.cn" target="_blank">91Ʒþþþþio</a>| <a href="http://www.ssc629.cn" target="_blank">97þþƷһ</a>| <a href="http://www.longfee.cn" target="_blank">þþĻ</a>| <a href="http://www.west126.cn" target="_blank">þۺϳ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>