7

关于投票
C语言中判断大小端的方法
有时候,用C语言写程序时需要知道是大端模式还是小端模式。 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
 
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
 
short int x;

char x0,x1;

x=0x1122;

x0=((char*)&x)[0];  //低地址单元
x1=((char*)&x)[1];  //高地址单元

若x0=0x11,则是大端; 若x0=0x22,则是小端......
 
 
(By  computer00 @ http://www.ednchina.com/Blog/computer00/ @2007-08-23  04:00)
系统分类: 单片机
用户分类: 编程田地
标签: C语言中 判断 大小端 的方法
来源: 原创
发表评论 阅读全文(1331) | 回复(1)

8

关于投票
C语言中指针和数组名小趣

在C语言中,指针和数组名通常都可以混用。
例如
char *p;
访问时,*p跟p[0]是一样的,*(p+1)跟p[1]是一样的。
对于数组
char b[5];
访问时,b[0]跟*b是一样的,b[2]跟*(b+2)是一样的。

在一般的通信中(例如串口),通常都使用字节传输。而像float,long int之类的,
有4字节。我的方法就是取它的地址,强制转换为char型指针,然后当作数组来用。
float x;
SBUF=((char*)&x)[0];
SBUF=((char*)&x)[1];
SBUF=((char*)&x)[2];
SBUF=((char*)&x)[3];
接收时,刚好倒过来。

更有趣的是,对于数组形式,数组名和后面的偏移量可以随便换。
char buff[10];
//或者用 char *buff=&buffer;

buff[3]=0xaa;
3[buff]=0xaa;  //居然是一样的,倒塌...

因此,我认为编译器是这么干的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy),
因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了...非典用法,请勿乱用,出了事偶不负责...

 

(By  computer00 @ http://www.ednchina.com/Blog/computer00/ @2007-08-22)

系统分类: 软件开发
用户分类: 编程田地
标签: C语言 指针 数组名
来源: 原创
发表评论 阅读全文(1176) | 回复(1)

12

关于投票
Windows按钮突破专家(VB版本源代码)
从这里下载完整程序包和可执行文件: rar
 
有个小软件,叫做Windows按钮突破专家,发现很好用,一些软件的按钮或者滑块什么的,被禁用了,没办法使用。如果使用这个突破专家,那么就可以使这些控件变得重新可用了,有时还真能实现原来的功能。例如一些软件没注册时,会限制一些功能,而可以使用突破专家来试试。总之遇到有什么按钮变成灰色的时候,又想要按它时,就可以想到按钮突破专家。
 
今天去网上搜索了一下,好不容易找到一个Delphi版本的源代码,哈哈~~~看看了,其实蛮简单的,就是调用了几个API函数。由于电脑上次重装过操作系统,还没装Delphi呢,所以就拿到VB里面去试试。结果就可以用拉~~~~~~
 
注意,直接在VB的调试环境下,是不能实现运行目的,需要用VB文件菜单中的生成.exe来生成.exe文件,然后再执行它,就可以了。这应该是在调试模式下,VB调试器做了某些保护。上次在做ADuC7026的下载线时,用到WinIO并口驱动,也是如此,调试下不能正常加载。
 
 
 
免责声明:本软件仅供学习编程用,擅自用于其它用途者后果自负。
 
 
部分源代码:
 
'模块部分
Option Explicit
'pointapi结构体
Type POINTAPI
 x As Long
 y As Long
End Type
'获取光标位置API函数
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
'从位置获取句柄API函数
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
'枚举子窗口API函数
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'使能窗口API函数
Public Declare Function EnableWindow Lib "user32" (ByVal Hwnd As Long, ByVal fEnable As Long) As Long
Public Sub SetWinEnable(ByVal Hwnd As Long)
 
 '将Hwnd窗口的Enable属性设置为True
 EnableWindow Hwnd, 1
 
End Sub
 
'窗体部分
'-------------------------------------------------
'Windows 按钮突破专家 VB版
' Creat by Computer-lov Date: 2007.01.16
' Last edit date:2007.01.16
' Copyright(C) 2007-2017 Computer-lov
' All rights reserved
' Welcome to my Blog: Http://computer00.21ic.org
'-------------------------------------------------
Option Explicit
Private Sub Command1_Click()
 If (Timer1.Enabled = True) Then '如果是启动状态,则关闭之
  Timer1.Enabled = False
  Command1.Caption = "启动按钮突破"
 Else                           '否则,启动它
  Timer1.Enabled = True
  Command1.Caption = "关闭按钮突破"
 End If
 
End Sub
Private Sub Command2_Click()
 
 '将按钮,文本框,复选框,选项框都设置为不可用
 Command2.Enabled = False
 Text2.Enabled = False
 Check1.Enabled = False
 Option1.Enabled = False
 
End Sub
Private Sub Form_Load()
 
 '定时器时间间隔设置为300ms
 Timer1.Interval = 300
 '定时器初始化为不启动
 Timer1.Enabled = False
 
End Sub
Private Sub Timer1_Timer() '定时器1
 
 Dim R As Long
 Dim P As POINTAPI
 Dim Hwnd As Long
 
 '获取鼠标位置,返回1,表示获取成功
 
 R = GetCursorPos(P)
 
 If R = 1 Then
 
  '获取鼠标位置点的窗口句柄
  Hwnd = WindowFromPoint(P.x, P.y)
 
  '显示窗口句柄在文本框1
  Text1.Text = Hwnd
 
  If (Hwnd <> 0) Then  '如果句柄不为0,则使该窗口可用。
  '事实上是将SetWinEnable函数的地址传递给了这个API函数,
  '在SetWinEnable这个函数中,将窗口的Enable属性改为了True
 
  EnumChildWindows Hwnd, AddressOf SetWinEnable, 0
 
  End If
 End If
End Sub
系统分类: 软件开发
用户分类: 编程田地
标签: Windows 按钮突破专家 VB版源代码
来源: 原创
发表评论 阅读全文(1254) | 回复(0)

10

关于投票
Delphi写的简易计算器
点击此处下载整个程序包:rar
系统分类: 软件开发
用户分类: 编程田地
标签: Delphi写的简易计算器
来源: 原创
发表评论 阅读全文(989) | 回复(3)

11

关于投票
Delphi写的简易文本编辑器
从这里下载整个程序包:rar
系统分类: 软件开发
用户分类: 编程田地
标签: Delphi 简易 文本编辑器
来源: 原创
发表评论 阅读全文(732) | 回复(0)

11

关于投票
C++Builder写的简单的图片浏览器

C++Builder写的简单的图片浏览器,这个是我学c++builder时,老师布置的作业~~~~~~~~

 

下载代码包: rar

系统分类: 软件开发
用户分类: 编程田地
标签: Cpp Builder 简易 图片浏览器
来源: 原创
发表评论 阅读全文(768) | 回复(2)

10

关于投票
VB写的一个简单的音频播放器
从这里下载整个VB程序包及可执行文件:rar
系统分类: 软件开发
用户分类: 编程田地
标签: VB编程 简易 音频播放器
来源: 原创
发表评论 阅读全文(725) | 回复(0)

10

关于投票
VB写的一个小玩意——灯笼

从这里下载整个文件包及可执行文件:rar

这是两个小红灯笼,会自动跑到屏幕的两边,并且一直旋转。

系统分类: 软件开发
用户分类: 编程田地
标签: VB 灯笼 变形窗口
来源: 原创
发表评论 阅读全文(712) | 回复(0)

12

关于投票
C语言中的头文件可以自己写吗?
一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#i nclude语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#i nclude语句将头文件引用时,相当于将头文件中所有内容,复制到#i nclude处。为了避免因为重复引用而导致的编译错误,头文件常具有

#ifndef   LABEL

#define   LABEL

   //代码部分

#endif

的格式。其中,LABEL为一个唯一的标号,命名规则跟变量的命名规则一样。常根据它所在的头文件名来命名,例如,如果头文件的文件名叫做hardware.h

那么可以这样使用:

#ifndef   __HARDWARE_H__

#define   __HARDWARE_H__

  //代码部分

#endif

这样写的意思就是,如果没有定义__HARDWARE_H__,则定义__HARDWARE_H__,并编译下面的代码部分,直到遇到#endif。这样,当重复引用时,由于__HARDWARE_H__已经被定义,则下面的代码部分就不会被编译了,这样就避免了重复定义。

另外一个地方就是使用include时,使用引号与尖括号的意思是不一样的。使用引号(“”)时,首先搜索工程文件所在目录,然后再搜索编译器头文件所在目录。而使用尖括号(<>)时,刚好是相反的搜索顺序。假设我们有两个文件名一样的头文件hardware.h,但内容却是不一样的。一个保存在编译器指定的头文件目录下,我们把它叫做文件I;另一个则保存在当前工程的目录下,我们把它叫做文件II