博文
Visual Studio的SDK配置(2008-12-07 20:08:00)
摘要:
1. SDK和API的概念
请参考http://blog.programfan.com/article.asp?id=33421
2. Visual Studio的SDK
Visual Studio 6.0自带的SDK是1998年的,目录为C:\Program Files\Microsoft Visual Studio\VC98\,这里简记为VS6SDKDIR。
以下为打开vc6菜单tools->options->directories. 我们看到Platform为Win32,
Show directories for下拉列表框有以下四项:Executable files、Include files、Library files、Source files。
(1)Include files的目录:VS6SDKDIR\Include,VS6SDKDIR \MFC\Include,VS6SDKDIR \ATL\Include
(2)Library files目录:VS6SDKDIR\LIB,VS6SDKDIR \MFC\ LIB
(3)Source files目录:VS6SDKDIR\MFC\SRC,VS6SDKDIR\MFC\Include,VS6SDKDIR\ATL\Include,VS6SDKDIR\CRT\ SRC
如果想更新VC++6.0的SDK,只要从微软网站上下载SDK
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
然后增加以下路径即可:
Executable files:你的platform安装路径\bin;你的platform安装路径\bin\winnt
Include file:你的platform安装路径\include
Library files:你的platform安装路径\lib
Source files:可添加也可不添加
配置完之后,可以调整各路径与原有路径的前后次序,因为编译和连接......
解释程序与编译程序(2008-12-05 18:57:00)
摘要:A、所谓解释程序是高级语言翻译程序的一种,它将源语言(如BASIC)书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。就像外语翻译中的“口译”一样,说一句翻一句,不产生全文的翻译文本。这种工作方式非常适合于人通过终端设备与计算机会话,如在终端上打一条命令或语句,解释程序就立即将此语句解释成一条或几条指令并提交硬件立即执行且将执行结果反映到终端,从终端把命令打入后,就能立即得到计算结果。这的确是很方便的,很适合于一些小型机的计算问题。但解释程序执行速度很慢,例如源程序中出现循环,则解释程序也重复地解释并提交执行这一组语句,这就造成很大浪费。
B、编译程序这是一类很重要的语言处理程序,它把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机去执行这个目标程序,得到计算结果。编译程序工作时,先分析,后综合,从而得到目标程序。所谓分析,是指词法分析和语法分析;所谓综合是指代码优化,存储分配和代码生成。为了完成这些分析综合任务,编译程序采用对源程序进行多次扫描的办法,每次扫描集中完成一项或几项任务,也有一项任务分散到几次扫描去完成的。下面举一个四遍扫描的例子:第一遍扫描做词法分析;第二遍扫描做语法分析;第三遍扫描做代码优化和存储分配;第四遍扫描做代码生成。值得一提的是,大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,但也有的编译程序则先产生汇编语言一级的符号代码文件,然后再调用汇编程序进行翻译加工处理,最后产生可执行的机器语言目标文件。在实际应用中,对于需要经常使用的有大量计算的大型题目,采用招待速度较快的编译型的高级语言较好,虽然编译过程本身较为复杂,但一旦形成目标文件,以后可多次使用。相反,对于小型题目或计算简单不太费机时的题目,则多选用解释型的会话式高级语言,如BASIC,这样可以大大缩短编程及调试的时间。......
继承本质论(2008-10-19 00:14:00)
摘要:1.对象的创建过程
Bird bird创建的是一个Bird类型的引用,而new Bird()完成的是创建Bird对象,分配内存空间和初始化操作,然后将这个对象引用赋给bird变量,也就是建立bird变量与Bird对象的关联。
2.从继承的角度分析对象的创建过程
在此我们以Chicken对象的创建为例,首先是字段,对象一经创建,会首先找到其父类Bird,并为其字段分配存储空间,而Bird也会继续找到其父类Animal,为其分配存储空间,依次类推直到递归结束,也就是完成System.Object内存分配为止。
思考
通过上面的讲述与分析,我们基本上对.NET在编译期的实现原理有了大致的了解,但是还有以下的问题,一定会引起一定的疑惑,那就是: Bird bird2 = new Chicken();
这种情况下,bird2.ShowType应该返回什么值呢?而bird2.type又该是什么值呢?有两个原则,是.NET专门用于解决这一问题的:
关注对象原则:调用子类还是父类的方法,取决于创建的对象是子类对象还是父类对象,而不是它的引用类型。例如Bird bird2 = new Chicken()时,我们关注的是其创建对象为Chicken类型,因此子类将继承父类的字段和方法,或者覆写父类的虚方法,而不用关注bird2的引用类型是否为Bird。引用类型不同的区别决定了不同的对象在方法表中不同的访问权限。
注意
根据关注对象原则,那么下面的两种情况又该如何区别呢?
Bird bird = new Chicken();
Chicken chicken = new Chicken ();
根据我们上文的分析,bird对象和chicken对象在内存布局上是一样的,差别就在于其引用指针的类型不同:bird为Bird类型指针,而chicken为Chicken类型指针。以方法调用为例,不同的类型指针在虚拟方法表中有不同的附加信息作为标志来区别其访问的地址区域,称为offset。不同类型的指针只能在其特......
堆和栈的区别(2008-10-09 16:33:00)
摘要: 最近太过执着于一些底层概念,《堆和栈的区别》这篇经典的博文已经被转载过N次,但还是转到这里,以方便日后查阅。谨对原创表示感谢!
一、预备知识—程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
2、堆区(heap) —从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后有系统释放。
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
例子程序 (这是一个前辈写的,非常详细 )
//main.cpp
int a = 0;//全局初始化区
char *p1;//全局未初始化区
main()
{
int b;//栈
char s[] = "abc";//栈
char *p2;//栈
char *p3 = "123456";//123456\0在常量区,p3在栈上。
static int c =0;//全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得和字节的区域就在堆......
变量的作用域与存储分配(2008-10-04 11:55:00)
摘要:1.变量的数据类型和存储类型
在C语言中,每一个变量都有两个属性:数据类型和存储类型。数据类型即常说的字符型、整型、浮点型;存储类型则指变量在内存中的存储方式,它决定了变量的作用域和生存期。
变量的存储类型有以下四种:auto(自动)、register(寄存器)、extern(外部)和static(静态)。其中auto和register用于声明内部变量,auto变量是存储在栈中的,register变量是存储在寄存器中的。static用于声明内部变量或外部变量,extern用于声明外部变量,它们是存储在静态存储区的。
变量声明的一般形式:<存储类型> <数据类型> <变量名列表>
当声明变量时未指定存储类型,则内部变量的存储类型默认为auto型,外部变量的存储类型默认为extern型。
外部变量有两种声明方式:定义性声明和引用性声明。
定义性声明是为了创建变量,及变量需要分配内存。引用性声明是为了建立变量与内存单元之间的关系,表示要引用的变量已在程序源文件中其他地方进行过定义性声明。定义性声明只能放在函数外部,而引用性声明可放在函数外部,也可放在函数内部。
extern int b;//引用性声明,也可放在函数fun中
void fun()
{
printf("d%",b);//输出
}
extern int b=5;//定义性声明,可以省略关键字extern
2.变量的作用域
变量的作用域是指一个范围,是从代码空间的角度考虑问题,它决定了变量的可见性,说明变量
在程序的哪个区域可用,即程序中哪些行代码可以使用变量。作用域有三种:局部作用域、全局作用域、文件作用域,相对应于局部变量(local variable)、全局变量和静态变量(global variable)。
(1)局部变量
大部分变量具有局部作用域,它们声明在函数(包括main函数)内部,因此局部变量又称为内部变量。在语句块内部声明的变量仅在该语句块内部有效,也属于局部变量。局部变量的作用域开始于变量被声明的位置,并在标志该函数或块结束的右花括号处结束。函数的形参也具有局部作用域。
#include <iostream>
using namespace std;
in......
sizeof(struct)内存分配分析(2008-10-03 19:10:00)
摘要:请看下面的结构:
struct MyStruct { double dda1; char dda; int type; };
对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?
也许你会这样求:sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗?
其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vs6.0 &vs8.0,32位系统)。
类型
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
char
偏移量必须为sizeof(char)即1的倍数
short
偏移量必须为sizeof(short)即2的倍数
int
偏移量必须为sizeof(int)即4的倍数
float
偏移量必须为sizeof(float)即4的倍数
double
偏移量必须为sizeof(double)即8的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
下面用前面的例子来说明VC到底怎么样来存放结构的。
struct MyStruct { double dda1; ......
Transact-SQL数据库基本操作(2)(2008-08-09 19:39:00)
摘要:五.查询数据记录(query analysis)
1. 查询记录数和指定列上的取值数
/*没有指定字段,将查询符合条件的记录条数(查询部门表中的部门记录总数)*/
select count(*) from DEPARTMENT;
/*查询部门表中PARENT_DEPT_ID字段上的取值数:
PARENT_DEPT_ID非空,包括重复值*/
select count(PARENT_DEPT_ID) from DEPARTMENT;
/*查询部门表中PARENT_DEPT_ID字段上的取值数(上级部门总数):
PARENT_DEPT_ID非空,不包括重复值*/
select count(distinct PARENT_DEPT_ID) from DEPARTMENT;
/*查询部门表中上级部门号为8的记录中
DEPT_ID字段上的取值数(8号部门的子部门数)*/
select count(DEPT_ID) from DEPARTMENT where PARENT_DEPT_ID=8;
2.查询记录或指定列上的取值
/*查询表USER_INFO中的所有记录*/
select * from USER_INFO
/*查询表DEPARTMET中的所有记录PARENT_DEPT_ID字段上的取值:
包括NULL和重复值*/
select PARENT_DEPT_ID from DEPARTMENT;
/*查询表DEPARTMET中的所有记录PARENT_DEPT_ID字段上的取值:
包括NULL,不包括重复值*/
select distinct PARENT_DEPT_ID from DEPARTMENT;
/*查询表DEPARTMET中的所有记录PARENT_DEPT_ID字段上的取值:
不包括NULL和重复值*/
select distinct PARENT_DEPT_ID from DEPARTMENT where PARENT_DEPT_ID is not null;
3.分组查询
/*分组查询,包括NULL,不包括重复值*/
select PARENT_DEPT_ID from DEPARTMENT group by PA......
Transact-SQL数据库基本操作(1)(2008-08-09 19:37:00)
摘要:一.创建、修改、删除数据库(database)
/*创建数据库*/
create database USER_INFO
/*
ON(可选):指定存放数据库的数据文件信息;
LOG ON(可选):指明事务日志文件的明确定义。
FILENAME用于指定数据库文件存储目录,否则默认存放在
%Program Files%Microsoft SQL Server\MSSQL\Data
*/
ON
(
NAME = USER_INFO_Data,
FILENAME ='d:\My Documents\
SQL Server 2000-DB\USER_INFO.mdf'
)
LOG ON
(
NAME = USER_INFO_log,
FILENAME ='d:\My Documents\
SQL Server 2000-DB\USER_INFO.ldf'
)
/*修改数据库名称*/
sp_renamedb 'USER_INFO','ExamSystem';
/*删除数据库*/
drop database USER_INFO
二.创建、修改、删除数据表(table)
/*创建部门表*/
create table DEPARTMENT
(DEPT_ID int NOT NULL,
DEPT_NAME varchar(20) NOT NULL,
PARENT_DEPT_ID int default NULL,
primary key (DEPT_ID)
)
/*创建用户信息表*/
create table USER_INFO
(
/*字段名 数据类型 能否......
Eclipse连接数据库及基本操作(2008-08-03 16:10:00)
摘要:A.Eclipse连接MySQLserver5.0数据库
一. 点击MYSQL-5.0.15-WIN32 SETUP.EXE安装MYSQL5.0.*
安装时设置Manual selected Default Charater set/collation选择字符集为UTF-8,其他默认即可完成MySQL Server 5.0的安装。当然我们还可以安装MYSQL-ADMINISTRATOR和MYSQL-QUERY-BROWSER等工具。
二.使用MySQL Command Line Client命令行或MYSQL-QUERY-BROWSER新建数据库auto53和学生表student(STU_NO)、课程表course(COURSE_NO)、选课表sc(STU_NO, COURSE_NO为其外键)。
二.MySql与Eclipse的连接示例
新建一个Java Project:MySqlDemo,右击项目-〉属性-〉Java Build Path-〉库-〉添加外部库-〉JDBC驱动程序Jar包:mysql-connector-java-5.0.4-bin.jar
/src/mySqlDemo/ MySqlDemo.java代码如下:
package mySqlDemo;
import java.sql.*;
public class MySqlDemo{
public static void main(String args[]){
try{
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}//MySql的驱......
Struts的MVC模式实现机制(2008-08-03 11:07:00)
摘要:MVC设计模式概述
MVC是Model—View—Controler的简称。即模型—视图—控制器。最近几年被业界推荐为SUN公司的J2EE平台的设计模式。受到越来越多的WEB开发者的欢迎。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。MVC中的模型、视图、控制器它们分别担负着不同的任务。
视图:视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型:模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性
控制器:当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。可进行以下类比:凶杀案发生了(用户点击提交按钮)视图--->公安部门进行刑事侦察,找出主凶(控制器)---->交给法院案件审理判刑(模型)---->对主凶执行伏法(视图)。
MVC的优点
1:MVC设计模式强制性的把用户的输入、业务逻辑的处理、数据结果的显示分开。提高了Web应用程序的可维护性。比如:改动模型的业务逻辑代码不会影响到视图和控制器。由于MVC三个模块相当于独立,改变 任何一个不会影响其它两个从而实现的程序的松耦合。
2:由于多个视图可以共享同一个模型,所以大大提高了Web应用程序的重用性。
3:MVC设计模式可以与xml配置文件有机的结合在一起。在改变三个模块间的工作方式,不需要修改源代码,直接修改配置文件就行了。从而提高了Web应用程序的灵活性。
struts的体系结构
1:用来实现mvc设计模式的框架有很多,比如:webwork,struts等。struts是在j2ee中用来实现mvc模式的主流 框架。后来webwork与str......