博文

指针一小题(2007-03-24 16:02:00)

摘要:题:  *   已知 int lstat(const char *file, struct stat *buf); 则请判断下面正误 * *   A) *     struct stat *statbuf; *     lstat("a.txt", statbuf); * *   B) *     struct stat statbuf; *     lstat("a.txt", &statbuf); * *  答案请选择空白区域(做为学习用,贻笑大方了) * * 答案: *   1)错误 *     由lstat原型知道第二个参数是要一个 struct stat 结构变量的指针(即变量内存地址) *     上面只是由 struct stat *statbuf; 定义了一个指针,此时指针所指内容未知,所以不能直接 lstat("a.txt", statbuf); 这样等于把lstat函数的结果放入未知内存,所以引起错误,  只有给它一个已经定义好的结构变量才可用 * *     可以如下修正 *       struct stat *statbuf; *       struct stat buf; *       statbuf = &buf; * *       lstat("a.txt", statbuf);......

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

C/C++语言void及void指针深层了解(2007-03-24 15:46:00)

摘要:许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。 void真正发挥的作用在于: (1) 对函数返回的限定; (2) 对函数参数的限定。 众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。  例如: float *p1; int *p2; p1 = p2; 其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为: p1 = (float *)p2; 而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换: void *p1; int *p2; p1 = p2; 但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。下面的语句编译出错: void *p1; int *p2; p2 = p1; 提示“'=' ......

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

C语言指针专题(2007-03-23 14:45:00)

摘要:一、数组的指针、指针数组以及指向指针的指针   考虑数组的指针的时候我们要同时考虑类型和维数这两个属性。换一句话,就是说一个数组排除在其中存储的数值,那么可以用类型和维数来位置表示他的种类。 A)一维数组  在c和c++中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示)。例如:int a[10];int *p; p=&a[0]//和p=a是等价的:  因为a是数组名,所以他是该数组的地址,同时因为第一个元素为a[0],那么&a[0]也代表了该数组的地址。但是我们是不是就说一个数组名和该数组的第一个元素的&运算是一回事呢?在一维的时候当时是的,但是在高维的时候,我们要考虑到维数给数组带来的影响。  a[10]是一个数组,a是数组名,它是一个包含10个int类型的数组类型,不是一般的指针变量噢!(虽然标准文档规定在c++中从int[]到int*直接转换是可以的,在使用的时候似乎在函数的参数为指针的时候,我们将该数组名赋值没有任何异样),a代表数组的首地址,在数字层面和a[10]的地址一样。这样我们就可以使用指针变量以及a来操作这个数组了。所以我们要注意以下问题: (1) p[i]和a[i]都是代表该数组的第i+1个元素;(2) p+i和a+i代表了第i+1个元素的地址,所以我们也可以使用 *(p+I)和*(a+I)来引用对象元素;(3)p+1不是对于指针数量上加一,而是表示从当前的位置跳过当前指针指向类型长度的空间,对于win32的int为4byte; B)多维数组  对于二维数组a[4][6];由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a[0][0]地址的数字是相同的,但是意义却是不同的。对于该数组我们可以理解为:a的一维数组(第一层),它有四个元素a[0]、a[1]、a[2]、a[3](第二层),而每个元素又含有6个元素a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5](第三层),…到此我们终于访问到了每个元素了,这个过程我们经历了:a->a[0]->a[0][0];  整体来讲:a是一个4行5列的二维数组,a表示它指向的数组的首地址(第一个元素地址&a[0]),同时a[0]指向一......

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

三步学会Java Socket编程(2007-03-23 14:04:00)

摘要:     第一步 充分理解Socket   1.什么是socket   所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。   以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。   重要的Socket API:   java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。   . Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。   . getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。   . getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。   注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。   2.如何开发一个Server-Client模型的程序   开发原理:   服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。   客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后......

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

用C语言编写简单的接口程序(2007-03-18 12:24:00)

摘要:在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言的方便。   在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和状态信息。这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)进行如下简单的编码:0H:发送的是新的半个字节数据1H:重新发送上次传送错误的数据2H:文件名结束3H:文件结束这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通过信息位来区分。下面就是我用C语言编写控制串行口的程序。我们以一个发送文件的程序为例,介绍一下用C语言实现对接口的控制。 源程序用C语言编写简单的接口程序源代码#include "dos.h"#include "stdlib.h"#include "stdio.h"#define PORT 0void SendFile(char fname); /* 发送文件*/void Send(int s); /*发送一个字节*/void SendFileName(char fname); /*发送文件名*/void ReceiveFile(); /*接收文件*/void GetFileName(char f); /*接收文件名*/void InitPort(int port,unsigned char para); /*初始化端口*/void SendPort(int port,char c); /*端口发送*/int ReadPort(int port); /*读端口字节*/int CheckState(int port); /*检查端口状态*/int Receive(int port,int G); /*接收一个字节*/main(argc,argv)int argc;char *argv[];......

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

图形模式下的汉字显示(2007-03-18 12:16:00)

摘要:我们在编写一些应用软件时,为了使软件更为通俗浅显、易学易用,具备汉字的用户界面是必不可少的条件。在文本模式下,只要有汉字操作系统的支持,显示汉字是不成问题的。只要用printf或cprintf就可以了。#include void main(){printf("我正在学习C语言!");}  在图形模式下显示汉字就稍稍麻烦些。可幸的是有很多人从事这一问题的研究,并开发了一些用于汉字显示的函数。这些函数不需要汉字系统的支持,但用到其中的字库文件。如UCDOS的HZK16。  汉字显示的第一步是打开字库文件。   函数: int OpenHz(const char *Hz16Path); 功能:打开字库文件Hz16Pathint handle; /*打开的字库文件指针*/int OpenHz(const char *Hz16Path){return (handle=open(Hz16Path,O_RDONLY|O_BINARY));} 打开字库文件后,就可以用下面介绍的函数显示16点阵的汉字。  函数: int WrtHz16(int x,int y,int z,int color,char *p); 功能:在(x,y)用color颜色显示汉字串p,汉字之间的空格数为z。intWrtHz16(int x, int y,int z,int color,char *p){unsigned int i,c1,c2,f=0; /*x,y:write at (x,y);*/int rec,i1,i2,i3; /*z:space between;*/long l; /*color:txt color*/char by[32]; /*p:HZ str*/if( handle<0 ) return -1; while((i=*p++)!=0){if(i>0xa1)if(f==0){c1=(i-0xa1)&0x07f;f=1;}else{c2=(i-0xa1)&0x07f;f=0;rec=c1*94+c2;l=rec*32L;lseek(handle,l,SEEK_SET);read(handle,by,32);for(i1=0;i1<16;i1++)for(i2=0;i2<2;i2++)for(i3=0;i3<8;i3++)if(GetBit(......

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

转帖]C语言图形函数(2007-03-17 14:13:00)

摘要:   基本图形函数     基本图形函数包括画点, 线以及其它一些基本图形的函数。本节对这些函数 作一全面的介绍。     一、画点     1. 画点函数      void far putpixel(int x, int y, int color);     该函数表示有指定的象元画一个按color所确定颜色的点。对于颜色color的 值可从表3中获得而对x, y是指图形象元的坐标。     在图形模式下, 是按象元来定义坐标的。对VGA适配器,  它的最高分辨率为 640x480, 其中640为整个屏幕从左到右所有象元的个数, 480 为整个屏幕从上到 下所有象元的个数。屏幕的左上角坐标为(0, 0), 右下角坐标为(639, 479), 水 平方向从左正向, 到右为x轴垂直方向从上到下为y轴正向。TURBO C 的图形函数 都是相对于图形屏幕坐标, 即象元来说的。     关于点的另外一个函数是:      int far getpixel(int x, int y);     它获得当前点(x, y)的颜色值。     2. 有关坐标位置的函数      int far getmaxx(void);     返回x轴的最大值。      int far getmaxy(void);     返回y轴的最大值。      int far getx(void);     返回游标在x轴的位置。     &......

阅读全文(3137) | 评论:1

c语言图形处理基本知识(2007-03-17 13:53:00)

摘要: Turbo C提供了非常丰富的图形函数, 所有图形函数的原型均在graphics. h中, 本文主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外, 使用图形函数时要确保有显示器图形驱动程序*BGI, 同时将集成开发环境Options/Linker中的Graphics lib选 为on, 只有这样才能保证正确使用图形函数。     1. 图形模式的初始化     不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器, 在不同模式下也有不同分辨率。因此, 在屏幕作图之前, 必须根据显示器适配器种类将显示器设置成为某种图形模式, 在未设置图形模式之前, 微机系统默认屏幕为文 本模式(80列, 25行字符模式), 此时所有图形函数均不能工作。设置屏幕为图形模式, 可用下列图形初始化函数:      void far initgraph(int far *gdriver, int far *gmode, char *path);     其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见表2。图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形 适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序 EGAVGA.BGI。                表2. 图形驱动器、模式的符号常数及数值 ━━━━━━━━━━......

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

 Eclipse平台入门之二:开发环境与实例(2007-03-16 20:42:00)

摘要:接着上一篇文章Eclipse平台入门之一:什么是Eclipse,我们将开始介绍Java 开发环境(JDE)。 为试验一下 Java 开发环境,我们将创建并运行一个“Hello, world”应用程序。使用 Java 透视图,右键单击“Hello”项目,选择 New=>Class,如图 2 所示。在随后出现的对话框中,键入“Hello”作为类名称。在“Which method stubs would you like to create?”下面,选中“public static void main(String[] args)”复选框,然后按 Finish。   图 2. 在 Java 透视图中创建新类 这样将在编辑器区域创建一个包含 Hello 类和空的 main() 方法的 .java 文件,如图 3 所示。然后向该方法添加如下代码(注意其中 i 的声明是有意省略了的):   图 3. Java 编辑器中的 Hello 类 您会在键入时注意到 Eclipse 编辑器的一些特性,包括语法检查和代码自动完成。在 2.1 版(我曾下载 M2 版来试用过)中,当您键入开括号或双引号时,Eclipse 会自动提供配对的符号,并将光标置于符号对之内。在其他情况下,您可以通过按 Ctrl-Space 来调用代码自动完成功能。代码自动完成提供了上下文敏感的建议列表,您可通过键盘或鼠标来从列表中选择。这些建议可以是针对某个特定对象的方法列表,也可以是基于不同的关键字(比如 for 或 while)来展开的代码片断。语法检查依赖增量编译。每当您保存代码,它就在后台接受编译和语法检查。默认情况下,语法错误将以红色下划线显示,一个带白 “X” 的红点将出现在左边沿。其他错误在编辑器的左边沿通过灯泡状的图标来指示;这些就是编辑器或许能为您修复的问题——即所谓的Quick Fix(快速修复)特性。 上面的代码例子在 for 语句后面有一个灯泡状图标,因为 i 的声明被省略了。双击该图标将调出建议的修复列表。在此例中,它将提供创建一个类字段 i、一个局部变量 i 或一个方法参数 i 的建议;单击其中的每一个建议都会显示将要生成的代码。图 4 显示了该建议列表和建议创建一个局部变量之后生成的代码。   图 4. Quick Fix 建议 双击该......

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

 Eclipse平台入门之一:什么是Eclipse(2007-03-16 20:39:00)

摘要:本文为您提供关于 Eclipse 平台的概述,包括起源和体系结构。本文首先简要讨论 Eclipse 的开放源代码性质及其对多种编程语言的支持,然后通过一个简单的程序例子展示 Java 开发环境。本文还将考查以插件扩展形式可用的一些软件开发工具,并展示一个用于 UML 建模的插件扩展。Eclipse 是什么?Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。基于 Eclipse 的应用程序的突出例子是 IBM 的 WebSphere Studio Workbench,它构成了 IBM Java 开发工具系列的基础。例如,WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、Web 服务和数据库访问的支持。Eclipse 是开放源代码的软件开放源代码软件是这样一种软件,它们在发布时附带了旨在确保将某些权利授予用户的许可证。当然,最明显的权利就是源代码必须可用,以便用户能自由地修改和再分发该软件。这种用户权利的保护是通过一种称为 copyleft 的策略来完成的:软件许可证主张......

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