博文
不同系统平台下的watcom设置方法(2008-09-09 23:39:00)
摘要:
●32位DOS平台配置
WATCOM=C:\OpenWatcom
PATH=C:\OpenWatcom\Binw
INCLUDE=C:\OpenWatcom\H
LIBPATH=C:\OpenWatcom\LIB386
EDPATH=C:\OpenWatcom\EDDAT
●32位Windows配置
WATCOM=C:\OpenWatcom
PATH=C:\OpenWatcom\Binnt
INCLUDE=C:\OpenWatcom\H;C:\OpenWatcom\H\NT
LIBPATH=C:\OpenWatcom\LIB386;C:\OpenWatcom\LIB386\NT
EDPATH=C:\OpenWatcom\EDDAT
......
程序完全脱离BCB运行(2008-09-09 23:37:00)
摘要:1、在prject->Options->Compiler中点击Release
2、在prject->Options->Packages中去掉Builder with runtime packages选项
3、在prject->Options->Linker中去掉Use dynamic RTL 选项
4、然后再编译。
这样编译出来的程序才可以完全脱离BCB运行。......
memcpy函数的正确调用方法(2008-09-04 12:33:00)
摘要:memcpy函数的正确调用方法
memcpy函数的一般调用方法为"memcpy(dest,src,n);".
其功能为把源串src中前n个字符拷贝到目的串dest中,因此目的串de
st的最后长度应是n.当目的串为空或目的串原来的长度不大于n时,
memcpy的结果是正确的,而当目的串原来的长度大于n时则调用memcp
y函数后得到的结果是错误的,如例2所示.
例2.编制memcpy函数演示程序
#include<stdio.h>
#include<mem.h>
#include<string.h>
void
main(void)
{int i;
static char dest[7]="First";
static char
src[]="Second";
printf("\nTarget string 1 is
:%s",dest);
memcpy(dest,src,3);
printf("\nTarget string 2 is
:%s",dest);
memcpy(dest,src,strlen(src));
printf("\nTarget string 3 is
:%s",dest);
}
本程序输出结果应为:Target string 1 is:First
Target string 2
is:Sec
Target string 3 is:Second
但实际输出结果却是:Target string 1
is:First
Target string 2 is:Secst
Target string 3
is:Second
显然,如此调用memcpy函数有时会得到错误的结果.若用如下语
句代替"memcpy(dest,src,n);"语句,即可得到正确的结果.
if(strlen(dest)>n)
{for(i=0;dest[i]!='\0';i++)
dest[i]='
';/*将dest赋空格*/
dest[i]='\0';
memcpy(dest,src,n);
}
el......
C++中extern “C”含义深层探索(2008-09-04 08:41:00)
摘要:1.引言
C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。
2.从标准头文件说起
某企业曾经给出如下的一道面试题:
面试题
为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
分析
显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。
那么
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
的作用又是什么呢?我们将在下文一一道来。
3.深层揭密extern "C"
extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。
被extern "C"限定的函数或变量是extern类型的;
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句:
extern int ......
VC中检测内存泄露的代码(2008-08-31 16:26:00)
摘要:/*----------------------------------------------------------------
VC中检测内存泄露的代码:
在申请了动态内存空间后常常会忘记在不用的时候释放,这样会造成内存的浪费等其他问题。
怎样检查你的代码有没有内存泄露呢? 需要在前面加上这些代码:
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <string.h>
#include <stdio.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
然后在要检测的代码前面加上:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
在后面加上:
_CrtDumpMemoryLeaks();
-------------------------------------------------------------------*/
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <string.h>
#in......
ofstream 对象的使用注意点(2008-08-31 09:12:00)
摘要:// VS6 2008/8/30
#include <iomanip>
#include <fstream>
#include <iostream>
using namespace std;
struct data{
unsigned type : 2 ;
unsigned d : 1 ;
unsigned context: 5 ;
};
// ofstream 对象不能复制,只能引用传参
void fprint(ofstream &file,struct data t)
{
int temp = (t.type<<6) + (t.d<<5) + t.context;
if (temp<16)
{
file<<hex<<0 ;
}
file<<hex<<temp<<endl ;
}
int main(void)
{
int j;
ofstream fsOut("TestData.dat");
for(j=0;j<16;j++)
{
&nb......
测试程序效率的方法(2008-08-30 15:00:00)
摘要:http://1001night.blogbus.com/logs/17125497.html
光看书似乎不解决问题,难道要做题
当然要做题,而且做题也要循序渐进。
首先是教材正文中的示例,然后是书后的练习题。
第二步可以做国家等级考试二级三级的C语言题。在线上可以找到,大量二级题库。三级题推荐南开的三级100题。此外VCgood群的共享文件中也有一些这一难度的题目。
正如前面讲过,当第二步的题目都做完后,语法已经不是问题,应该开始学习数据结构和算法。这个方面的练习题可以去各大OJ。OJ是什么,请看下一节。
OJ是什么
OJ是OnlineJudge的缩写。OnlineJudge是一种在线裁判系统。她可以对程序原代码进行编译和执行,并通过预先设计的测试数据来检验程序原代码的正确性。
首先,他是一个在线的题库,有很多习题,你可以任选其中之一来解答。然后,系统的编译器能够编译执行你所提交的代码。如果编译通过,针对每个题目,系统将使用自带的多组测试数据检验你的程序,如果程序都能得到正确的输出,那么你顺利地解决了这个问题。最后,系统还能对所有参与答题的用户进行统计和排名。
OJ的题目大部分是关于算法的。题目的输入输出通常是命令行方式,而非图形界面。也就是说,要关注的不是平台的兼容性、文件的格式抑或窗口的布置这种无关紧要的细节,而是问题本身的逻辑实现。一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态,通过、错误、超时、溢出或是无法编译。
Online Judge系统来自ACM和IOI大赛。由美国计算机协会(ACM Association for Computing Machinery)发起和组织的ACM国际大学生程序设计竞赛(简称ACM/ICPC)是目前世界上规模最大的计算机学科赛事。IOI则是国际信息学奥林匹克竞赛,和数学奥林匹克竞赛一样著名。Online Judge系统是IOI或A......
c++格式化输入输出(2008-08-24 22:40:00)
摘要:cin与cout
一:标准输入函数cin
不知道说它是个函数对还是不对,它是代表标准的输入设备--键盘。他是属于流的,他的用法和流的用法是一样的。也就是:cin>>变量;
小小的说明一下,输入多个变量可以写在一行,如:cin>>x>>y>>z;
这样写不是不允许,而是不好看,如果是不同的变量类型,那就更是没头没脑了。除了你,人家是不知道该输入什么的,所以,一般在输入语句的前面,我们一般都
要做一个提示,请输入×××,让人家心里有个底,知道这个变量是做什么的。
另外,这个函数是不用带地址符号"&"的,也不用写明变量类型,千万不要跟scanf混淆。当然他就也不检查变量输入是否合法。如:
int i;
couti;
cout......
矩阵求逆的算法(2008-08-22 18:48:00)
摘要:用C写的,做成DLL使用很方便。
double * MatrixOpp(double A[],int m,int n) /*矩阵求逆*/
{
int i,j,x,y,k;
double *SP=NULL,*AB=NULL,*B=NULL,X,*C;
SP=(double *)malloc(m*n*sizeof(double));
AB=(double *)malloc(m*n*sizeof(double));
B=(double *)malloc(m*n*sizeof(double));
X=Surplus(A,m,n);
X=1/X;
for(i=0;i......
watcom编译器的环境变量设置(2008-08-20 09:30:00)
摘要: 环境变量的设置具有优先级,也就是相同环境变量名下的多个变量值之间的关系是前面的变量具有优先级。而watcom对于环境变量比较敏感,需要优先设置。比如对一个程序编译的时候:
wcl386 -zq -bd -bt=os2 -l=os2v2_dll -I%WATCOM%\h\os2 hello.c -"option implib"
wcl386 -zq -bt=os2 -l=os2v2 main.c hello.lib
经常提示的错误:
WATCOM C/C++32 Compile and Link Utility Version 10.0
Copyright by WATCOM International Corp. 1988, 1994. All rights reserved.
WATCOM is a trademark of WATCOM International Corp.
wcc386 TEST.C
WATCOM C32 Optimizing Compiler Version 10.0a
Copyright by WATCOM International Corp. 1984, 1994. All rights reserved.
WATCOM is a trademark of WATCOM International Corp.
C:\VC98\INCLUDE\stdio.h(23): Error! E1091: ERROR: Only Mac or Win32
看到了吧,这是由于默认采用了VC进行了编译,解决方法:
You have installed or are using Visual C++. (Installing other compilers may
cause similar problems.) WATCOM can still be used when other compilers are
installed, however the environment variables INCLUDE, LIB, and WATCOM need
to be set to the default values s......