博文
线程创建示例(2008-05-17 21:23:00)
摘要:// 控制台程序 vc 6.0 运行通过
#include "afx.h"
#include
#include
using namespace std;
DWORD WINAPI Func(LPVOID p);
typedef struct {
int firstArgu;
long secArgu;
} MyType,*pMyType;
void main()
{
MyType MyTypeArgu={0};
MyTypeArgu.firstArgu=1;
MyTypeArgu.secArgu=100000000;
CreateThread(NULL,0,Func,&MyTypeArgu,0,NULL);
Sleep(5000);
cout......
Argument Dependent Lookup (ADL)解析(2008-05-17 19:32:00)
摘要:
ADL,参数相关查找,也称作为Koenig查找(以Andrew Koenig的名字命名,有兴趣可以看Scott Meyer的文章The Most Important C++ People...Ever),是指在编译器对无限定域的函数调用进行名字查找时,所应用的一种查找规则。
f(x, y, z); // unqualified
N::f(x, y, z); // qualified
上面的函数调用,第一个f就是无限定域的函数调用,第二个则限定了在名字空间N里面,也是说使用了完全限定名。
我们首先来看一个函数所在的域的分类:
1:类域(函数作为某个类的成员函数(静态或非静态))
2:名字空间域
3:全局域
而Koenig查找,它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把函数参数类型所处的名字空间加入查找的范围。
Herb提供的解释(Exceptional C++, Item 31)
Koenig Lookup(simplified): If you supply a function argument of class type (here x, of type A::X), then to look up the correct function name the compiler considers matching names in the namespace (here A) containing the argument's type.
请看下面的例程:
#include <iostream>
using namespace std;
namespace Koenig
...{
class KoenigArg
...{
public:
ostream& print(ostream& out) c......
More Effective C++:指针与引用的区别(2008-04-08 06:50:00)
摘要:指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值
这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
因为引用肯定会指向一个对象,在C里,引用应被初始化。
string& rs; // 错误,引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确,rs指向s
指针没有这样的限制。
string *ps; // 未初始化的指针
// 合法但危险
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,它
} // 肯定指向一个double值
相反,指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (p......
动态申请二维数组空间(2008-03-19 18:03:00)
摘要:short **Alloc_Short_Img (char x_size,char y_size)
{
char m;
short **map ;
map = (short **)malloc(sizeof(short*) * y_size);
for(m=0;m......
创建文件夹(2008-03-18 21:30:00)
摘要:#include
#include
int main()
{
FILE *fp;
char buffer[80];
char i = 9;
_mkdir("c:\\file"); // #include
fp = fopen(c:\\file\\part%d.txt,"w");
fprintf(fp,"fopen只可以在存在的文件夹中创建文件\n\
否则编译能通过,但不能运行\n");
fclose(fp);
return 0;
}......
判断一文件是word文档(2007-11-25 23:41:00)
摘要:判断一文件是word文档,用c#或vb.net语言
http://topic.csdn.net/u/20071116/22/6af67454-b6f3-4ba1-95f2-6ce6c527cb74.html
C# code
using System.Runtime.InteropServices;
[DllImport("ntdll.dll")]
public static extern int RtlCompareMemory(IntPtr Destination,
IntPtr Source, int Length); // 比较两个内存块是否相同
private void button1_Click(object sender, EventArgs e)
{
byte[] vHead = new byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 }; // Doc文件的头标志
FileStream vFileStream = new FileStream(@"c:\temp\temp.doc",
FileMode.Open, FileAccess.Read);
byte[] vBuffer = new byte[vHead.Length];
vFileStream.Read(vBuffer, 0, vBuffer.Length); // 读取文件的头信息
vFileStream.Close();
if (RtlCompareMemory(Marshal.UnsafeAddrOfPinnedArrayElement(vHead, 0),
Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vHead.Length) ==
vHead.Length)
{
MessageBox.Show("估计是Word文档");
}
}......
C++与Fortran混合语言编程中动态连接库的调用(2007-11-23 12:25:00)
摘要:
C++与Fortran混合语言编程中动态连接库的调用
摘 要:介绍了C++和Fortran 90混合语言编程中,在C++中调用Fortran动态连接库(DLL,Dynamic Link Library)的方法以及参量传递、函数调用等的方法。
关键词:混合编程,Fortran 90,C++,动态连接库
前言
混合语言编程是利用二种或二种以上编程语言编写的源码构建程序模块的过程。混合语言编程有以下优点:(1)调用已经存在的源码,如许多单位以前的计算机程序大部分都是用Fortran语言编写的,为了有效地利用现有的程序,减少不必要的重复性工作,可把原有的源码编译成动态连接库(Dynamic Link Library, DLL),以便于其它编程语言的调用;(2)利用某语言处理某些问题特有的速度和优势,如Fortran语言具有强大的科学计算速度和能力,Visual C++、C++ Builder、Visual Basic、Power Builder或Delphi具有良好的图形用户界面。
DLL提供了一种在Windows环境下共享代码和在应用程序间进行通信的方法。DLL可以用多种语言编写,只要遵循一定的规范,不同语言编写的DLL可以互相调用。在工程开发中,利用图形用户界面友好的开发工具作为前端开发工具,并在其中调用由其它语言实现的具有特殊功能的DLL模块,可提高工程开发质量和效率。本文介绍C++ Builder中调用DLL的方法,其中的DLL是用Fortran语言编写的。
调用DLL的方法
2.1 调用DLL的方式
C++应用程序中调用DLL中的函数有两种方式:静态引入方式和动态引入方式[1]。
2.1.1 静态引入方式
静态引入方式,就是在编译连接阶段就已经确定了要调用的函数程序,运行时自动加载相应的DLL,直到程序结束前,该DLL始终存在于内存中。静态加载一个DLL,方法比较简单,只需在应用程序连接时,把DLL相应的库文件加入到应用程序工程中。虽然这种引入DLL的方式简单,但它有很大的缺陷,如DLL加载后,就一直驻留在内存中,即使DLL已经不再使用。而动态引入方式,没有这些缺陷。下面重点介绍动态引入DLL的方法。
2.1.2 动态引入方式
动态引入DLL......
r进制数据的倒序(2007-11-03 14:25:00)
摘要:#include <cstdlib>
#include <iostream>
using namespace std;
// 把 一个二进制数 倒序怎么 实现呀?比如 111000110 --> 011000111
// 把一个r进制的数 n(r进制数据对应的十进制数据)进行倒序 ,stage 为数据的长度
int inverse(int n,const short stage,short r)
{
char temp[stage];
int i=0;
do {
temp[i] = n%r; // 取 r 进制数个数位上的值
i++;
n /= r;
}while(i<stage);//while(n>0);
for(i = 0;i<stage;i++){ // 倒序前
printf("%x",temp[stage-i-1]);
}
printf("<-->");
for(i = 0;i<stage;i++){ // 倒序后
printf("%x",temp[i]);
}
int l = 1,nn = 0;
for(i = 0;i<stage;i++){
nn += temp[stage-i-1]*l;
l *= r; // 权值
}
return nn;
}
int main(int argc, cha......
基4FFT(DIF)代码(2007-11-02 17:54:00)
摘要:/**** fft programe ***** Dev-C++ 4.9.9.2 ************/
// 02-11-07 17:51
/* 修改 radix 使循环控制完全取决于级数,为流水工作做准备 */
// 用不同的 RAM 存储中间结果 ,单此时仍旧是"原位",需要修改保证每次从不同的RAM读取一个数据
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define STAGE 2
#define DISPLAY 1
#define Num (1<<STAGE*2)
#if DISPLAY
int count = 0;
#endif
#define START 0
#define END 8
#define WINTH ((1<<15)-1)
#define F(t) ((int)(WINTH*t)&0xffff)
double result[Num];
double x[STAGE+1][Num],y[STAGE+1][Num];
double TAB[Num*2];
const double PI = 3.14159265358979323846;
const double EI = PI*2/Num;
void rad4(double x0[],double y0[],double x1[],double y1[],double TAB[],
int i,int n2,int adr1,int adr2,int adr3)
{
&......
基4FFT 核心模块代码(2007-11-02 16:52:00)
摘要:void radix4(double x[],double y[],double TAB[],int n)
{
int i,j,k,e,n1,n2;
int a,b,c;
// n2=n;
// e=1;/* 1 -- n 有效 */
for(k=0;k> (2*k);
n2 = n1 >> 2;
e = 1 ......