博文
纯C也要继承,封装(2008-08-15 13:16:00)
摘要:最近要在mtk平台上开发一套中间层,类似于MFC或者vcl的framework, 但是只能用纯C写,MTK本身就使纯C的,对于这个framework。 层次其实是很明晰的,习惯了封装继承思想便觉得纯C也要继承,封装。 下面就 object - Rect - Wnd - Button的单继承关系进行展示,说实话,目前为止我也只能实现单继承,java的单继承是不是也是这样弄,不得而知。
文件 CObject.h 包含 Object的对外声明
#ifndef _OBJECT#define _OBJECT
typedef struct st_Object { void (*Dispose)(void*); // 销毁对象方法 char*(*ToString)(void*, char*); // toString方法 int (*Init)(void*); // 初始化方法
}Object;
Object* new_Object();
#endif
C的方法没有private,所以在Object中声明的都是public方法,至于private方法,在它的实现中可以体现出来, static函数便无法对外访问,实现了封装
文件 CObject.C 是 Object的实现
#include <malloc.h>#include <stdio.h>#include "CObject.h"
static void st_Object_Dispose(void* Handle);static int st_Object_Init(void* Handle);static char* st_Object_ToString(void* Handle, char* Buffer);
static void st_Object_Dispose(void* Handle){ Object** This = (Object**)Handle;
free(*This); *This = NULL;}
static int st......
xml与数据库的相互转换(2007-03-29 15:52:00)
摘要:'说明: 把xml转换为数据库(dataset), 把数据库(dataset)转换为xml,
' 用记录集rs构造DataTable
'代码未经编译。
'Copyright (C) 2007-3 SGPRO
Imports SystemImports System.IOImports System.XmlImports System.Data
Class DB2XML
'把数据库写入xml
Public Function DBToXML()
Dim objDbConn as new DbConnection Dim strSql as string Dim strTableName as string Dim strXMLFile as string Dim dsMain as DataSet Dim dsRead as DataSet
StrSql = "SELECT * FROM A" StrTableName = "A" StrXMLFile = "db2xml.xml"
DbConnection.Open() MakeDataTable(dsMain, objDbConn, strTableName, strSql) 'Create Table, From rs to Table
dsMain.WriteXml(strXMLFile, XmlWriteMode.IgnoreSchema) ' DataSet写入xml End Function
'构造DataTable Private Sub MakeDataTable(ByRef dsMain as DataSet, ByVal oraDb As OracleConnecion,ByVal strTable As String, _ ......
Dll Simulator(仿真动态连接库)(2007-03-29 14:55:00)
摘要:/*File: dll.hVersion: 1.0Introduction: Dll DeclareCopyright (C) 2007-1 SGPRO*/
#ifndef _H_DLL#define _H_DLL
#define DRV_LEN 1#define DIR_LEN 64#define FIL_LEN 8#define EXT_LEN 3#define DLLNAME_LEN (DRV_LEN + DIR_LEN + FIL_LEN + EXT_LEN)#define DLL_PARA_MAX 16#define FN_LEN 32#define FA_SIZE 16
#define DLLARG_DLLNAME 0#define DLLARG_VERIFY 1#define DLLARG_VMVNAME 2#define DLLARG_FUNCTIONNAME 3#define DLLARG_PARA 4
#define EXT_VM ".vm"#define DLL_LOG "loaddll.log"
typedef enum{ DLLERR_NoErr, /*0 无错误*/ DLLERR_DllInfErr, /*1 DLL信息输出错误*/ DLLERR_VmCanNotWrite, /*2 虚拟内存无法写入*/ DLLERR_VmWriteErr, /*3 虚拟内存写入错误*/ DLLERR_VmCanNotRead, /*4 虚拟内存无法读取*/ DLLERR_VmReadErr, /*5 虚拟内存读取错误*/ DLLERR_FunctionNotFound,/*6 未找到DLL库内的指定函数*/ DLLERR_VerifyErr, /*7 DLL验证失败*/ DLLERR_NotEnoughMem, /*8 内存不足,无法加载DLL*/ DLLERR_DllNotExsist, /*9 DLL库不存在*/ ......
充分利用强大的SQL语句(2006-04-17 13:26:00)
摘要:1.使用嵌套查询.
在多表查询的时候, 一定要使用嵌套查询. 不要先查一个表,再利用结果查另外一张表,这样不但效率低下,而且容易出错.
2.充分使用集函数. MIN,MAX,SUM,COUNT, AVG 不要查询所有记录结果后再做处理. 比如计算一个班的平均分, 不要用SELECT * FROM SCORE 查询出所有的分数之后, 再用程序计算平均分, 直接用AVG集函数可靠.简洁.
3.使用系统函数.SQL有不少系统函数, 非常有利于数据库处理,应该充分使用,不要自己在程序中处理.
4.排序使用ORDER BY字句. 不要在程序中处理.......
COBOL语言解释程序开发日志与技术展示(2006-03-21 18:33:00)
摘要:一 开发日志
公司从2月份从日本接了一项特殊的COBOL项目, 基本工作是从日本一家公司输送的400个COBOL源程序改成等效的其他语言的程序, 我们负责的是将COBOL源程序拟制出详细设计书, 再由日本某个软件公司的一个开发项目组根据我们的设计书用其他开发语言或者开发平台开发出等效的新程序.
COBOL是一种商业开发语言. 不知道日方为什么要改写这些程序.我们把程序拿过来之后, 没有COBOL运行环境, 无法知道这些程序的运行结果是什么, 也没有以前开发这些程序的设计书. 项目起初, 我们首先是熟悉一下COBOL语法, 然后一行行读程序, 理解其中的意思, 然后写出设计书, 设计书必须详细,正确, 因为这些设计书将拿来设计等效的其他语种的程序,如果设计书错误, 重写程序就是错误的.所以项目起初十分累, 工作也相当机械, 我们曾经提议安装COBOL语言的编译环境和运行环境, 然后逐个运行这些程序, 根据运行结果,我们可以完成设计书的大部分, 而无须读程序. 然而这种想法也行不通, 日本的这组程序是运行在简单的支票打印机上的, 而不是PC机上, 所以有了软件环境,却没有硬件环境和程序所需的数据库资源. 我们觉得日本鬼子在拿我们当机器去运行这些程序,然后写出设计书, 这是极为艰苦的工作, 开发进度非常缓慢, 效率很底,大概一个人要四天才能完成一份设计书。
当时我想了一个办法, 自己编写一个专门的COBOL程序的解释机器, 解释机器不但解释执行程序,并且模拟当前的硬件环境和数据资源环境. 直接生成设计书的大部分内容, 行内的都知道, 要写一个编译程序或者解释程序是相当困难的.所以我们项目组,基本上没有人有这个想法.部门经理还说, 如果谁能开发出设计书生成器,本年度的最佳员工非他莫属. 我被这句话直接打动了, 心想,一定要把COBOL解释程序开发出来.
经过几个星期的酝酿和开发, 2006-3-8 终于出炉,并且用于开发测试当中.下面是开发日志: 全部使用Borland C++ Builder 构建.
2006-3-4 进入开发阶段,......
256色位图格式与256色位图编程.(2005-12-31 19:57:00)
摘要:下面就一个C++程序(DrawBmp.cpp, Borland C++ Builder 6.0 编译运行通过)具体分析
//---------------------------------------------------------------------------
#include <vcl.h>#pragma hdrstop
#include "DrawBitmap.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;
typedef enum // 定义显示位图操作的执行结果{ OK, //成功 FORMATERROR, // 文件格式错误 FILENOTFOUND, //文件未打开 OVERFLOW, // 内存溢出 READERROR // 读文件错误}RESULTCODE;
RESULTCODE DrawBmp(int start_x, int start_y, char filename[]); //显示位图函数定义AnsiString filen; // 需要显示的文件名称//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){ &nb......
