博文

《彻底搞定C指针》第7篇 函数名与函数指针(2006-11-10 21:43:00)

摘要:《彻底搞定C指针》第7篇 函数名与函数指针   第7篇 函数名与函数指针 转于(白云小飞 blog) 一 通常的函数调用
    一个通常的函数调用的例子:
//自行包含头文件
void MyFun(int x);    //此处的申明也可写成:void MyFun( int );

int main(int argc, char* argv[])
{
   MyFun(10);     //这里是调用MyFun(10);函数

      return 0;
}

void MyFun(int x)  //这里定义一个MyFun函数
{
   printf(“%d\n”,x);
}
    这个MyFun函数是一个无返回值的函数,它并不完成什么事情。这种调用函数的格式你应该是很熟悉的吧!看主函数中调用MyFun函数的书写格式:
MyFun(10);
    我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数,知道MyFun函数名代表的是一个功能(或是说一段代码)。
    直到——
    学习到函数指针概念时。我才不得不在思考:函数名到底又是什么东西呢?
    (不要以为这是没有什么意义的事噢!呵呵,继续往下看你就知道了。)

二 函数指针变量的申明
    就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。
    在C系列语言......

阅读全文(157) | 评论:0

基于VC6的俄罗斯方块代码学习版源码(2006-11-10 21:30:00)

摘要:基于VC6的俄罗斯方块代码学习版源码(1) 转于http://yyf977.programfan.com
  ◆源代码下载链接:
http://upload.programfan.com/upfile/200610120711419.rar ◆本写代码的目的:
1.想以此小软件的开发示例演示面向对象软件工程方法的基本开发过程:
    (我欲将随后将公开全部过程的UML图及相关思路。欢迎大家提出意见,进行讨论,以达共同进步的目的。)
2.对该游戏程序软件架构的一次探索:
    本游戏特点是界面与逻辑有紧密的关系,如何将逻辑与界面实现相分离也是本代码的探索之处。努力实现面向对象的设计思路,代码所追求的目标是:整体结构合理,减小各功能类之间的耦合度,力求相关问题局部化,做到容易维护代码(如易于修正BUG和功能的扩展升级)。
3.本程序是对MFC对话框框架学习后的一次总结:
         实现了由控制类控制下多个对话框之间切换的面向对象代码示例。本程序包含一个框架窗口,用以容纳子窗口。子窗口有三个:主界面窗口、设置窗口、游戏play窗口。这些窗口都是由对话框组成,框架窗口是一模态对话框,其它各窗口为非模态对话框。
  4.对关卡类游戏的一次实践:
      本游戏与我之前扫雷游戏的一个不同是它由一关一关游戏组成,所以不仅仅是一局游戏的实现,还要实现由一关进入另一关之间的游戏流程,本设计演示了此类游戏进行面向对象方法设计的一个示例。
5.对有定时需求游戏实现的一次探索:
      本游戏与扫雷游戏的另一个不同是它有定时要求,对于游戏有定时要求的面向对象软件设计不是直觉感觉的那么简单,如何看待定时器这个对象,如何实现与它相关的代码动作也是本设计想要探讨的问题。 ◆类说明:
1.游戏界面类:
   IView:抽象类,作为各对话框的公共接口,提供接受控制类的通知响应管理。
&n......

阅读全文(424) | 评论:0

sprintf函数 sizeof()操作符说明(2006-11-10 21:22:00)

摘要:sprintf函数的用法
  自《CSDN 社区电子杂志——C/C++杂志》 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。 sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:
格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
格式化数字字符串
sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代
itoa。 如:
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐 这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。
sprintf(s, "%08X", 4567); //......

阅读全文(6170) | 评论:0

C/C++ 试题剖析(2006-11-10 21:19:00)

摘要:strcpy()与strlen()、sizeof()的区别
  char s1[6]="china" ,s2[3]="ch";
strcpy(s1,s2);

请问内存中ina部分的数据是否被覆盖??
S1的内容是ch,还是china??
S1的长度是6??  strcpy(s1,s2);  strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy.
这样s1在内存中的存放为:ch\0

如果说s1的长度是6,那是错误的.你没有弄清strlen与sizeof的意思。
strlen函数的意思是测试字符串的字符长度,不含字符串结束标志的。
sizeof是个运算符,它的结果是字符串在内存中的所占字节大小,它要把\0算进去的   C/C++ 试题剖析(2)  试题3:

void test3(char* str1)
{
 char string[10];
 if( strlen( str1 ) <= 10 )
 {
  strcpy( string, str1 );
 }
} if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。
考查对基本功的掌握:

  (1)字符串以’\0’结尾;

  (2)对数组越界把握的敏感度;

  (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:

  2分

void strcpy( char *strDest, char *strSrc )
{
  while( (*strDest++ = * strSrc++) != ‘\0’ );
}
  4分

void strcpy( char *strDest, const char *strSrc )
//将源字符串加const,表明其为输入参数,加2分......

阅读全文(160) | 评论:0

C/C++ 学习笔记(2006-11-10 21:14:00)

摘要:《数据与算术运算》笔记 转于http://colormoon.programfan.com
  1.整数值 整数前面可以带(或不带)正、负号,但不允许带小数点、逗号或其他特殊符号(如美元符号)。 不同的数据类型在不同设备的存储空间是不同的。 要存储超过设备内定存储空间的整数,必须使用整数限定符。 2.浮点数 同整数值一样,浮点数也不允许带小数点、逗号或其他特殊符号。浮点数分为“float”、“double”、“long double”。它们的区别在于存储空间的大小。 浮点数后面加上“F”或“f”表示这是一个单精度浮点数,加上“L”或“l”表示这是一个双精度长浮点数,如果不加后缀则表示是双精度浮点数。 浮点数也可以用指数表示法表示。如1625 可以表示为 1.625e3,即 1.625x103。 3.字符值 A的ASC码值为65,a的ASC码值为97。 4.算术运算 %是取模运算符,该运算结果是取余数。 向输出流中插入数据可以在多个行中完成,以分号为结束。如: cout<<"The resoult is "       <<(22.5+5)<<endl; 但是包含在双引号里的字符串不能被分解为几行,且只有在最后一行中出现分号。 算术表达式的结果永远也不会是一个单精度浮点数,因为计算时,计算机临时将所有单精度数转换为双精度数。 5.整数的除法 两个整数相除,其结果是一个整数,小数部分被省去。 6.运算符的优越级     运算符                             结合性 ------------------------------------------------- --(一元的)         &......

阅读全文(247) | 评论:0

arm+linux平台开发的准备(2006-11-09 20:38:00)

摘要:下面关于arm+linux平台开发的准备,是针对开发人员来讲的。(转) 一、硬件开发的准备 1、单片机知识基础或者是计算机原理基础。 2、数字电路、模拟电路基础。 3、熟悉arm7、arm9原理。 4、会一到两种EDA软件(如PROTEL 99SE、POWERPCB等)。 5、对SDRAM、NAND FLASH、NOR FLASH、串口、USB、网络、液晶显示等硬件控制及读写原理比较了解。当然有的人不了解这些原理,而通过借鉴别人的设计也能设计出来。只是知其然,不知其所以然而已。 6、学习理解能力较强。 如果有上面这些基础,那么你就能够对arm应用的硬件做开发设计了。 二、bootloader、linux、文件系统移植及底层驱动开发的准备 1、单片机知识基础或者是计算机原理基础。 2、数字电路、模拟电路基础。 3、具备C、C++、汇编语言基础。 4、熟悉arm7、arm9原理。 5、熟悉bootloader、linux内核、linux文件系统的原理、配置、编译以及驱动程序的编写及加载过程。 6、对SDRAM、NAND FLASH、NOR FLASH、串口、USB、网络、液晶显示等硬件控制及读写原理非常了解。 7、学习理解能力强。 三、linux应用程序开发的准备 1、熟悉linux操作系统的工作原理、机制,熟悉进程、线程机制。 2、具备c、c++语言基础。 3、有的涉及串口、usb、网络、数据库编程,那么就需要有相应的基础。 4、学习理解能力强。        以上是我个人得出的做arm+linux平台开发所需要的基础和前提,可能存在错误或遗漏。请大家发表看法。        我把它分成三个方面。硬件、驱动、应用程序开发。如果三个方面都能做,那肯定是全才。由于做arm+linux开发牵涉的方方面面太多,所以进入门槛相对单片机开发要高。一旦熟悉了开发流程,也不是想象的那样困难。......

阅读全文(2996) | 评论:0

ARM9微控制器LPC3180的软硬件平台设计 (2006-11-09 20:35:00)

摘要:ARM9微控制器LPC3180的软硬件平台设计   摘要 介绍以Philips LPC3180微控制器为核心的嵌入式软硬件平台设计;对系统设计的硬件部分和软件部分进行详细的分析,并针对LPC3180芯片特性着重讨论了其软件系统构建以及系统启动流程。实验结果表明,LPC3180嵌入式系统平台结合片内硬件浮点运算单元,具有高性能的浮点运算处理能力,可满足复杂的嵌入式应用场合的要求。 
关键词 LPC3180 ARM9 软硬件平台 

      嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统;后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的,并且需要在设计之间进行权衡优化,根据实际应用进行外扩和裁剪。 

      基于ARM926EJS内核的LPC3180内部集成了丰富的外设资源,为嵌入式系统构建提供了很大的设计空间。本文结合笔者开发LPC3180嵌入式平台的实际经验,将具体介绍该系统的实现、结构组成和实验结果。
      
1  LPC3180芯片特性介绍 
     LPC3180是Philips公司新推出的一款ARM9微控制器。它采用90nm工艺技术,片内集成ARM9EJS处理器内核,具有高计算性能、低功耗的特性,这使得在很多对功耗敏感的嵌入式应用场合中仍能使用高性能的ARM9微控制器。LPC3180内核正常工作电压为1.2V,在低功耗模式下可降至0.9 V;同时,LPC3180作为一款新型的32位微控制器,其新特性还包括: 

◆  片内集成向量浮点(VFP)协处理器。LPC3180的浮点运算单元有3条独立的流水线,支持并行单精度或双精度浮点加/减、乘/除以及乘累积运算,完全兼容IEEE754标准,适用于高速浮点运算场合。 ......

阅读全文(2156) | 评论:0

DS1302C51源代码 (2006-11-09 20:29:00)

摘要:DS1302C51源代码     #include
#include #define mcuport2 P2
#define mcuport1 P1 unsigned char pd;
/*********************************************************************/
sbit T_CLK="P0"^7; /*实时时钟时钟线引脚 */
sbit T_IO="P0"^6; /*实时时钟数据线引脚 */
sbit T_RST="P0"^5; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//lcd引脚声明
/**************************************************/
sbit rs="P0"^0;
sbit rw="P0"^1;
sbit e="P0"^3;
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(unsigned char ucDa)
{
unsigned char i;
ACC = ucDa;
for(i="8"; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/***********************************************************......

阅读全文(2952) | 评论:0

PCB制版 相关(2006-11-09 20:23:00)

摘要:PCB工程师分级依据 工作岗位:入门级PCB工程师
  能力要求:
1、能制作简音的封装,如DIP10等到;
2、掌握至少一种PCB设计软件的基本操作,并能制订简单的布线线宽和间距等规则;
3、能对具有100个元件和200个网络或以下PCB进行较合理和有序的布局和布线;
4、能在他人或自定规则下手动或自动布线并修改,达到100%布通并DRC完全通过;
5、具备基本的机械结构和热设计知识;
6、掌握双面板走线的一些基本要求。
  工作内容:
1、简单PCB的设计和修改(如结构简音的前面板、单片机小系统板等);
2、复杂PCB中规定部分的走线;
3、与自己设计PCB相关的调试;
4、写相关的开发、调试日志。
  工作职责:对PCB中自己设计部分负责。
  工作岗位:初级PCB工程师
  能力要求:
1、能根据手册和实物制作较复杂的封装,如带灯RJ-45座等,并保证外形、焊盘等尺寸完全正确(按实物测量至少保证可插入);
  2、较熟悉掌握至少一种PCB设计软件并能独立或在指导下制订较详细的布线规则;
  3、能对具有400个元件和1000个网络或以下单、双面和多层PCB进行较合理和有序的布局和布线,能在布局布线过程中随时考虑到热设计、结构设计、电磁兼容性设计、美观等方面的要求,自己不能确定时及时向更高级PCB工程师请教或共同探讨;
  4、能在他人或自定规则下熟练手动或自动布线并修改,达到100%布通并DRC完全通过,基本上不存在线宽瓶颈、内层孤岛等问题,布线过程中能看出少量原理设计上低级错误并提出,并能正确进行引脚和门交换,能正确修改网络表和原理图;
  5、能正确导入、导出机械图纸并基本看懂结构尺寸要求;
  6、能在他人所制定规则或指导下进行一些高速和模拟PCB设计并基本稳定;
  7、丝印标志清晰明了,能独立完成出GERBER等设计输出工作并校对;
  8、具备基本的可制造性方面知识并用于实践,所设计板子50%以上可用于生产。
  工作内容:
1、较复杂PCB的设计和修改(如调度机中除CPU板外的板,十六画面分割器板等);
2、......

阅读全文(4609) | 评论:0

排序算法  集中(2006-11-07 17:34:00)

摘要:排序的算法集中到一起了,包括冒泡排序、选择排序、插入排序,Shell排序,快速排序、归并排序、堆排序,基数排序、bucket排序。 使用起来也很简单,包含SortAlgorithm.h即可直接使用(这里重在算法本身,用一个类包含static函数的做法则可以原谅了:)。 (两个文件:SortAlgorithm.h和main.cpp)。 //SortAlgorithm.h
#if !defined _SORT_ALGORITHM_H_
#define _SORT_ALGORITHM_H_

#ifndef NNULL
#define NULL 0L
#endif //~ NULL

#include <cassert>
#include <ctime>

#include <iostream>
using namespace std;

template <typename T>
class BasicSortor
{
public:
   
    // bubble sort
    static void bubbleSort( T* _data,int _left,int _right )
    {
        assert( NULL != _data );
        assert( ( _left >= 0 ) && ( _right >= _left ) );
   
        if ( 1 == _right - _left )  return ;  
   
&......

阅读全文(228) | 评论:0