C语言基础知识之函数指针和指针函数,自引用和相互引用,#define用法

2012年3月19日 没有评论

最近在尝试去看Redis的源码,在看的过程中发现很多C语言的基础知识不太了解,对碰到的三个主要知识点做了下深入的学习和了解。写出来分享下,以后忘记了也可以回过头来看看。

函数指针和指针函数

1 函数指针变量
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为”函数指针变量”。
函数指针变量定义的一般形式为:
类型说明符 (*指针变量名)();
其中”类型说明符”表示被指函数的返回值的类型。”(* 指针变量名)”表示”*”后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。
例如:
int (*pf)();
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。

2 指针型函数
前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
…… /*函数体*/
}
其中函数名之前加了”*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int *ap(int x,int y)
{
…… /*函数体*/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。 阅读全文…

分类: linux与c 标签:

Redis系列二之Redis的存储类型

2012年3月15日 没有评论
本文是基于 Redis-v2.2.4 版本进行分析.

1.1 Redis 内存存储总体结构

Redis 是支持多key-value数据库(表)的,并用 RedisDb 来表示一个key-value数据库(表). redisServer 中有一个 redisDb *db; 成员变量, RedisServer 在初始化时,会根据配置文件的 db 数量来创建一个 redisDb 数组. 客户端在连接后,通过 SELECT 指令来选择一个 reidsDb,如果不指定,则缺省是redisDb数组的第1个(即下标是 0 ) redisDb. 一个客户端在选择 redisDb 后,其后续操作都是在此 redisDb 上进行的. 下面会详细介绍一下 redisDb 的内存结构.

阅读全文…

分类: 数据库 标签:

Sphinx中文入门指南

2012年3月13日 没有评论

1.Sphinx简介

 

1.1.Sphinx是什么

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS 的原生支持)

1.2.Sphinx的特性

  • 高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);
  • 高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);
  • 可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可 处理100 M 文档);
  • 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;
  • 支持分布式搜索;
  • 支持短语搜索
  • 提供文档摘要生成
  • 可作为MySQL的存储引擎提供搜索服务;
  • 支持布尔、短语、词语相似度等多种检索模式;
  • 文档支持多个全文检索字段(最大不超过32个);
  • 文档支持多个额外的属性信息(例如:分组信息,时间戳等);
  • 支持断词;

阅读全文…

分类: 数据库 标签:

背景自适应的九宫格布局法

2012年3月9日 没有评论

 

1:用在何处

此种方法适用于内容高宽不固定,背景需要自适应的情况下,如对话框,小提示等。

阅读全文…

分类: 设计 标签:

Redis系列一之Redis和Rediska的安装

2012年3月7日 没有评论

在开始这个系列之前先看看什么是Redis。先看看官方的定义。

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。互联网发展越来越多的面临高并发和大数据的影响,在这种情况下,提出一个新的思想,内存是新的硬盘。利用内存读写速度快的特点,来解决高并发和大数据的问题。Redis在这个背景下就应运而生了。随着对Redis不断的熟悉,对此会有更深的理解。

熟悉Redis首先要学会安装。

$ wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz
$ tar xzf redis-2.4.8.tar.gz
$ cd redis-2.4.8
$ make
$ src/redis-server
$ src/redis-cli
redis set foo bar
OK
redis get foo
"bar"

修改配置文件

/etc/sysctl.conf
分类: 数据库 标签:

论NoSQL的数据模型

2012年3月5日 没有评论

NoSQL的一些非功能性的特性,比如扩展性、性能以及一致性的讨论,目前已经有很多。而对于NoSQL产品内部数据模型相关的知识一直比较欠缺,本文就希望能够系统地对NoSQL数据模型进行一些探讨。

我们大致先将NoSQL数据模型划分为下面几类:Key-Value存储、类BigTable数据库、文档数据库,全文索引引擎以及图数据库。

下面先上一个简单有趣的示例图,简单描述各个不同数据模型的构造:

阅读全文…

分类: 数据库 标签:

博客迁移到新浪SAE

2012年3月4日 没有评论

有半年多没写博客了,半年多前加入了一家电子商务公司,目睹了很多事情,对电子商务行业也有了更深的认识。后来因为一些客观原因辞职了。其实一直有迁移博客的打算,国外的空间访问速度实在是太慢了。但是转到国内的话域名需要备案,流程比较繁琐,国内的空间限制也颇多,服务器的安全也很难得到保障,这些都是我不大愿意的。

后来看到新浪SAE,上去看了看,发现资费也比较便宜,根据流量来收费,对于博客来说性价比是很高的。新浪的服务器安全大抵也是有保障的。就把博客迁移到了新浪SAE。迁移的过程也很顺利。原来申请的域名www.bearmao.com不想废弃掉,就在同事的VPS上做了个跳转,服务器是nginx的,google了好几次才解决问题。

在新公司里面用到了一些NOSQL的技术,主要是Redis。我一直也是在有看这方面的文章,只是没机会实践,可以借这个机会提升下相关技术。然后打算对PHP内核做一些深入的了解,正好可以巩固一下前面自学的一些C语言的知识。以前对PHP一直都是知其然不知其所以然,希望最近能有突破。

在新公司没有了以前那种焦虑的心情,比较能够进入学习和工作的状态了,看来我还是比较习惯大城市,在很长的一段时间内应该如此。上海最近一直都在下雨,有时间了再到处逛逛和久未见面的同学见下。

2012,新的开始。

分类: 产品 标签:

php解决文件名中文下载的问题

2011年5月11日 没有评论

在网站开发过程中,经常会碰到,需要提供附件下载的链接。如果文件名是中文的话,在IE下面就会有问题。主要是判断浏览器,如果是IE的话强制转换浏览器编码。这里提供一个解决方案。

	$f = @fopen($fileurl,"r");
	$ext = substr(strrchr($filename,"."),1);
	$contentType = $arrMime[$ext];

	if($f)
	{
		Header("Content-Type: ".$contentType);
		Header("Accept-Ranges: bytes");
		Header("Content-Length: ".filesize($fileurl));
		$encoded_filename = urlencode($filename);
		$encoded_filename = str_replace("+", "%20", $encoded_filename);
		$ua = $_SERVER["HTTP_USER_AGENT"];
		if (preg_match("/MSIE/", $ua)) {
			header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
		} else if (preg_match("/Firefox/", $ua)) {
			header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
		} else {
			header('Content-Disposition: attachment; filename="' . $filename . '"');
		}
		echo fread($f,filesize($rs["fileurl"]));
		ob_flush();
		fclose($f);
		die();
	}
分类: php 标签:

辗转相除法

2011年5月4日 没有评论

欧几里德法,也称辗转相除法。
gcd(m,n) = gcd(n,m%n)等价
while (n != 0)
{
temp = m % n;
m = n ;
n = temp ;
}
return m ; //这个返回值 就是所要求的最大公约数,如果
//还要求最小公倍数,那么最小公倍数就等于原来两个数的乘积除以最大公约数
或者
int gcd(int m,int n)
{
if(n==0)
return m;
return gcd(n,m%n);
}

分类: linux与c 标签:

c语言解析json数据

2011年5月2日 没有评论

我使用的是cJSONcJSONFiles

先看json的数据结构
c中没有对象,所以json数据是采用链表存储的


typedef struct cJSON {
struct cJSON *next,*prev;    // 数组 对象数据中用到
struct cJSON *child;        // 数组 和对象中指向子数组对象或值

int type;            // 元素的类型,如是对象还是数组

char *valuestring;            // 如果是字符串
int valueint;                // 如果是数值
double valuedouble;            // 如果类型是cJSON_Number

char *string;                // The item's name string, if this item is the child of, or is in the list of subitems of an object.
} cJSON;

比如你有一个json数据


{
"name": "Jack (\"Bee\") Nimble",
"format": {
"type":       "rect",
"width":      1920,
"height":     1080,
"interlace":  false,
"frame rate": 24
}
}

那么你可以

1:讲字符串解析成json结构体。

cJSON *root = cJSON_Parse(my_json_string);
2:获取某个元素

cJSON *format = cJSON_GetObjectItem(root,”format”);

int framerate = cJSON_GetObjectItem(format,”frame rate”)->valueint;

3:讲json结构体转换成字符串

char *rendered=cJSON_Print(root);

4:删除

cJSON_Delete(root);

5:构建一个json结构体


cJSON *root,*fmt;
root=cJSON_CreateObject();
cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));
cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());
cJSON_AddStringToObject(fmt,"type",        "rect");
cJSON_AddNumberToObject(fmt,"width",        1920);
cJSON_AddNumberToObject(fmt,"height",        1080);
cJSON_AddFalseToObject (fmt,"interlace");
cJSON_AddNumberToObject(fmt,"frame rate",    24);
分类: linux与c 标签: