2011年12月

二叉排序树

二叉排序树(Binary Sort Tree)性质:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

- 阅读剩余部分 -

交换机配置基本命令

平安夜晚上决定写篇博客,最近要期末考试了,一个学期落下的课程每天都得补,但是趁着杰哥在,我学习 了下实验室的锐捷的设备,主要是交换机和路由的配置。只学了两个下午,所以就大概记录下学到的东西。

首先是vlan技术:VLAN(虚拟局域网)是对连接到的第二层交换机端口的网络用户的逻辑分段,不受网络用户的物理位置限制而根据用户需求进行网络分段。一个VLAN可以在一个交换机或者跨交换机实现。VLAN可以根据网络用户的位置、作用、部门或者根据网络用户所使用的应用程序和协议来进行分组。上面是百度百科上的一些话,简而言之,用vlan技术能划分不同的网络(就算接在同一交换机上的),而且可以使其通信。下面是一些基本的命令的记录:

- 阅读剩余部分 -

YCrCb 模型

不久前做的激光笔项目里面有一块内容是,查找一张图片中的红点,算法之一就是通过YCrCb 模型模型来寻找最亮的点。

YCrCb 模型更适合图形压缩. 因为人眼对图片上的亮度 Y 的变化远比色度 C 的变化敏感. 我们完全可以每个点保存一个 8bit 的亮度值, 每 2x2 个点保存一个 Cr Cb 值, 而图象在肉眼中的感觉不会起太大的变化.。
所以, 原来用 RGB 模型, 4 个点需要 4x3=12 字节. 而现在仅需要 4+2=6 字节; 平
均每个点占 12bit. 当然 JPEG 格式里允许每个点的 C 值都记录下来; 不过 MPEG 里
都是按 12bit 一个点来存放的, 我们简写为 YUV12。

[R G B] -> [Y Cb Cr] 转换
-------------------------


(R,G,B 都是 8bit unsigned)

       | Y  |     |  0.299       0.587       0.114 |   | R |     | 0 |

       | Cb |  =  |- 0.1687    - 0.3313      0.5   | * | G |   + |128|

        | Cr |     |  0.5       - 0.4187    - 0.0813|   | B |     |128|

Y = 0.299*R + 0.587*G + 0.114*B  (亮度)
Cb =  - 0.1687*R - 0.3313*G + 0.5   *B + 128
Cr =    0.5   *R - 0.4187*G - 0.0813*B + 128

[Y,Cb,Cr] -> [R,G,B] 转换
-------------------------


R = Y + 1.402  *(Cr-128)
G = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128)
B = Y + 1.772  *(Cb-128)

循环队列

循环队列的C语言实现,把整个队列当作环来处理。一段连续的空间当作队列,front指向队列头,rear指向队列的尾。每次有数据进入队列,则rear向后一个位置移动,如果超过了最大空间,那么取余数;数据出队列,则front向后一个位置移动。队列满的时候rear = front,队列空的时候也是rear = front,于是可以这样处理,如果 rear+1 = front的话就表明是满队列,这样虽然浪费了一个空间,但是可以处理好队列满和空的问题。

- 阅读剩余部分 -

窗口透明和边框隐藏设置

上次做激光笔项目的时候想到了窗口变透明,就相当于屏幕的最上层是一个透明窗口,并且没有边框。然后今天看醒哥的屏保数字雨的时候突然间记起来上次的实现,于是又写了下。

关于窗口的透明处理首先设置下窗口属性

 SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_LAYERED);

然后用下面这个函数
BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window 透明窗体的句柄
COLORREF crKey, // specifies the color key 颜色值
BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]
DWORD dwFlags // action 透明方式,可以取两个值:
        // 当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效; 
 // 当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey的地方将变为透明。
        LWA_ALPHA = 0x2
        LWA_COLORKEY=0x1
);

其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_ALPHA被设置的话,通过bAlpha参数指定窗体的透明度;如果LWA_COLORKEY标志被设置的话,则指定关键色为crKey,该颜色所覆盖的区域将从窗体去除,去除后的区域将不再进行点击检测,其他颜色则正常显示。如果阿尔法混合值设置为0,其窗口区域同样不进行点击检测。

至于窗口的无边框可以在创建窗口时设置参数即可。

	cx = GetSystemMetrics(SM_CXSCREEN);
	cy = GetSystemMetrics(SM_CYSCREEN);
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_DLGFRAME | WS_THICKFRAME | WS_POPUP,        // window style
                          0,              // initial x position
                          0,              // initial y position
                          cx,              // initial x size
                          cy,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters

 

单向链表

到期末了,准备最后一个月把数据结构的一些小算法总结下,都在Fedora上用 codeblocks+ddd写,刚好可以熟悉下linux平台。另外C++还是没开始学,于是就准备在写数据结构实现的过程中直接用C++,发现写成了C+,真是悲剧。。。。

先是简单的单向链表,书上的很简洁,但是看起来不是很懂,于是我就自己写了,虽然复杂了很多,但是还是比较简洁,效率应该是差不多的,我多的不过是几个分支。下面是几个注意点

- 阅读剩余部分 -

从CSDN搬家出来首篇博客

受杰哥,囧哥和醒哥的影响,加上协会有了自己的服务器,我果断买了一个域名。前两天网站排版,CSDN博客导出···一系列的烦额。CSDN连个导出的功能都没,实在让我伤心。我已经准备一篇一篇复制了,结果今天下午杰哥突然告诉博客园有专门导出CSDN博客的功能,所以我就先把CSDN的博客导到了博客园,再从博客园导到现在的博客里,真是纠结额···幸好全都导出来了,不过很多博客的排版都乱了,不过没什么关系。以后这里就是专属于我的地带了,我可以随便写自己想写的,程序点滴,生活点滴,情感点滴都可以记录了额····最近感觉自己没什么进步,整个节奏都乱了,各种各样的事情,又要期末考试了,必须要马上找回节奏额,希望一切都能好起来吧!!!

指针指向字符串和数组储存字符串区别

    #include <stdio.h>  

    void main()
    {
        char *p = NULL,*str = "aafg" ,aa[10] = "abc";
        p = strcpy(str,aa);
        printf("%s/n",p );
    }

定义了一个指向字符串的指针,str是在栈上分配的变量,储存的地址对应的是在常量区中分配的空间。"aafg"是存储在常量区里面,
是不能改变的。char *str 其实存在一种 const char *类型的隐式转换,而strcpy要做的改变常量,所以程序编译的时候没错,运行的
时候就出错了。

- 阅读剩余部分 -

(转)C/C++ 通用 Makefile

C/C++ 通用 Makefile
Generic Makefile for C/C++ Program

==================================================
Keywords: Makefile, make, Generic, C/C++
Author:   whyglinux (whyglinux AT hotmail DOT com)
Date:     2006-03-04
==================================================

本文提供了一个用于对 C/C++ 程序进行编译和连接以产生可执行程序的通用 Makefile。

在使用 Makefile 之前,只需对它进行一些简单的设置即可;而且一经设置,即使以后对源程序文件有所增减一般也不再需要改动 Makefile。因此,即便是一个没有学习过 Makefile 书写规则的人,也可以为自己的 C/C++ 程序快速建立一个可工作的 Makefile。

这个 Makefile 可以在 GNU Make 和 GCC 编译器下正常工作。但是不能保证对于其它版本的 Make 和编译器也能正常工作。

- 阅读剩余部分 -

(转)VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

现象:在vs2008中,建立一个空项目,添加一个c++文件main.cc

#include<iostream> using namespace std; int main() { cout << "hello"<<end; return 0; }

 

该程序能够编译得过,但是执行,无论是debug还是release,都很出现

“无法找到“xxx.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件。”

- 阅读剩余部分 -

assert小记

#include <assert.h>
void assert( int expression );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,并且能够指出错误在哪行,然后马上终止程序,有点if判断的味道。
#include <stdio.h>
#include <assert.h>
int main()
{
    char *p;
    char a[] ={"china"};
    p = (char *)malloc(strlen(a)+1);
    p = a;
    printf("%s %d",p,strlen(p));
    assert(p == NULL);
    return 0;
}

- 阅读剩余部分 -

<转>GTK+ VS MFC

今天看到一篇关于GTK+和MFC对比的文章,学GTK+编程的来看看 

MFC已经江河日下,日渐式微,而GTK+可谓欣欣向荣,如日中天。这里无意于落井下石,痛打落水狗,贬MFC而尊GTK+。自己即在使用MFC也在使用 GTK+,不会偏袒其中之任何一方。这个对比完全出于个人对两者的理解,说它是不完全对比,一方面只是一时兴起想做个笔记而已,另外一方面我对两者的理解 也是有限的。

1. 两者都是基于面向对象设计的。尽管MFC是用C++写的,而GTK+是用C写的,但思想都是面向对象的。GTK+使用glib的对象机制,由于用C写的,其实现相对有点繁琐。

- 阅读剩余部分 -

数组和指针

数组访问数组和指针访问数组的区别:
char a[] = "abcdef"; char *p = "abcdef";
数组的访问是通过先获取数组的首地址,然后通过相对的偏移量来获取地址,通过地址读出内容;
指针的访问形式:假设指针本身的地址是4624,先是存储变量是4624的内容,假设是5081,取得i的值算出5081+i的值然后读取该地址的内容,也就是说指针访问数组的多了一次额外的提取。指针保存的是数据的地址,间接来访问数据,首先获得是存储的内容,将其作为地址,然后通过地址提取数据。而数组a[i]只是简单的以a+i为地址取得数据。
数组指针和指针数组的区别:
int *p[10];因为[]的优先级比*高,所以解释为 指针数组,意思就是 先是定义一个数组,然后前面加int *表示里面的成员都是int型指针,这就是 指针数组。数组每个元素都存放这int型数据的地址,也就是一个int型指针。还是来看代码吧(*^__^*) 。

- 阅读剩余部分 -

No package g++ available问题解决

   Fedora16下,我打开codeblocks后,写了一个小程序,结果要编译的时候显示“g++ ”不存在,我回到终端里面,输入yum install g++,结果No package g++ available,我就郁闷了,我自己电脑上上次也是这么装的额,怎么回事额。。。后来找了下,发现只要输入yum install gcc-c++就OK了,但具体为什么我不是很清楚。