分类存档: C/C++

值得推荐的C/C++框架和库【转载】

Libevent
libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源。
下载链接:https://github.com/libevent/libevent
Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态数据库驱动网站的速度。Memcached 基于一个存储键/值对的 hashmap。Memcached-1.4.7的代码量还是可以接受的,只有10K行左右。
下载地址:http://memcached.org/
Redis
Redis 是一个使用 C 语言写成的,开源的 key-value 数据库。Redis支持的操作和数据类型比Memcached要多,现在主要用于缓存,支持主从同步机制,Redis的学习可以参考<>一书。
下载地址:http://redis.io/
Webbench
Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。
下载链接:https://github.com/LippiOuYang/WebBenchl[……]

Continue

DXF库(dxflib)使用指南[转载]

作者: Andrew Mustun
版权: 2004-2005 RibbonSoft公司. 保留所有权利。
日期: 2005年3月
原文: http://www.ribbonsoft.com/dxflib/manual.pdf
源码: http://www.ribbonsoft.com/archives/dxflib/dxflib-2.0.4.8-2.src.tar.gz
翻译: 柴树杉(http://chaishushan.googlepages.com )

第一章 简介
dxflib是一个用来读写DXF文件的C++库。当读DXF文件的时候,dxflib分析文件并且调用用户自己定义的函数来添加实体、层、等。
需要注意的是,dxflib并不保存任何实体或者信息。它只是从DXF文件中分析可以识别的实体以及其他的对象。
使用dxflib库读DXF文件并不需要知道所有的DXF格式信息。当然,像实体、属性、层、段等基本概念还是需要了解的。如果是用dxflib库写DXF文件,则需要知道DXF文件是如何组织的。
dxflib完全基于C/C++标准库实现,不依赖任何其他的库。
第二章 编译dxflib库
Unix/Linux
在Unix/Linux系统中编译dxflib库,需要输入以下命令:

./configure
make

该命令生成一个”./lib/dxflib.a”静态库。如果需要创建一个动态连接库,需要用”make shared”代替前面的”make”命令。这样就生成一个”./lib/libdxf.so.2.0.x.x”文件,然后再创建一个”./lib/libdxf.so”连接到”./lib/libdxf.so.2.0.x.x”。
如果不使用”make install”命令,你也可以直接将头文件和生成的库文件复制到你需要的目录中。
Windows
在windows系统中编译dxflib库可以有多中选择,你可以使用VC、Borland C++、GCC以及其他各种编译器。
在这里我们采用cygwin和gcc编译:

./configure
MinGW32-make

[……]

Continue

位移法解平面桁架

最近稍稍闲下来一点,准备系统的学习一下有限元。
一般认为,矩阵位移法是有限元的雏形,并且矩阵位移法与杆系有限元在操作步骤上几乎完全一样。
这里以下图所示桁架为例简单写一下推导过程,详细的教材上都有。
1

单元编号 单元节点编号 节点局部编号
1 1,3 i,j
2 1,2 i,j
3 3,4 i,j
4 2,4 i,j
5 3,2 i,j

[……]

Continue

随便写写

似乎真的好长时间都没有来打理这个博客了,毕业了!

上班不比上学,自己所能支配的时间真的很少。上次去开评审会,一个老先生说,做这行就是五加二,白加黑。确实如此,通宵加班也不止一次两次了。但无论怎样,我还是很热爱这个行业的。我一直在努力,我希望能用最短的时间在这个领域成为“天才”。

说实话,我始终不能接受自己已经毕业的事实。作息,生活习惯都没能及时的适应工作。有时真的感觉好累,但所有人都是这么过来的,没什么好抱怨的。起码现在家里不会再逼我去考公务员,能做点自己喜欢的事是何等幸福啊。

这个行业的责任确实很重,每次在图纸上签上自己名字的时候我都感到心里没底。也许是大学的时候读书不够认真吧,缺少那一份自信。再或许,大学时候我如果花很多时间在“读书”上面,现在可能得不到在设计院工作的机会。死读书的大多没什么好“下场”。

真的很想每天能够抽出一点时间在编程上面,这是兴趣。写一些小工具可以节约很多时间,国内的桥梁计算软件,说实话没有一个是让我比较满意。

我始终相信活到老学到老,毕业了才开始深入学习有限元希望不会晚。不过工作实在是太忙了,真后悔在学校没有拿出更多时间学习。有时候人就是逼出来的,在学校可以用三个月去做一座桥的施工图设计,工作了,只要设定一个时间底线,四天我也能完成。这个月完成了两座小桥的施工图设计,工作进度总体上我自己还是比较满意的。

十一确实是令人期待,手头的工作基本都完成了,回去好好放松一下,哪也不想去,就在家里给自己放几天假!

这几个月确实没什么时间写代码,就之前勉强抽出点时间帮一个朋友写的建筑荷载组合的小程序,没什么技术含量,就是照着规范的流程跑一遍,没有经过严格的测试,希望看到这些代码的朋友不要轻易用在实际工程中。

[……]

Continue

SDCC编译器简明使用教程

先前翻译了SDCC编译器手册第一章的内容,尝试过去翻译其他章节,不过难度似乎比我预计的要大,在google的帮助下也完成不了,现在只能结合自己的使用写点了.

本文以SDCC手册第三章内容为基础!

这里不介绍SDCC的安装过程,作为电气工程专业或者计算机嵌入式方向的学生这不是什么困难的事!安装后把SDCC的bin目录添加到path环境变量使得你能在任何目录下使用SDCC,使用archlinux和debian系统的没有这一步,安装时已经自动配置好了!我平时很少使用集成开发工具(IDE)写代码,所以编辑源代码你可以使用你最拿手的工具,任何文本编辑器都可以,我使用的是vim!

源代码与Keil C的稍许不同

对于已经习惯使用Keil C的用户需要注意一下,SDCC的源代码和Keil C有所不同,需要做一点调整才能编译通过.SDCC比较多的使用像8051.h这样的头文件(include/mcs51目录下也有reg51.h这样的头文件).

对于一些非ANSI C的关键字,SDCC均采用双下滑线开头的方式定义,如__code,__idata,__sbit……对于单片机引脚的定义SDCC采用了__at关键字和十六进制地址(用户对底层地址信息要弄清楚,不过我觉得__at关键字是一个比较有特色的改进),如下:

//SDCC                                      Keil C
__sbit __at 0x94 blackLineLeft;         sbit blackLineLeft=P1^4;
__sbit __at 0x95 blackLineRight;        sbit blackLineRight=P1^5;
__sbit __at 0x80 in1;                   sbit in1=P1^0;
__sbit __at 0x81 in2;                   sbit in2=P1^1;
__sbit __at 0x82 in3                    sbit in3=P1^2;
__sbit __at 0x83 in4;                   sbit in4=P1^3;

更多的地址信息可以查看附录

对于内嵌汇编代码,SDCC使用__asm和__endasm两个关键字,参考代码如下:

void delay0_1(uint n) {
    for(i=0;i

......[......]

Continue

ZJU 2420 解题报告

Calendar

Time Limit: 1 Seconds Memory Limit: 32768 KB

A calendar is a system for measuring time, from hours and minutes, to months and days, and finally to years and centuries. The terms of hour, day, month, year and century are all units of time measurements of a calender system.

According to the Gregorian calendar, which is the civil calendar in use today, years evenly divisible by 4 are leap years, with the exception of centurial years that are not evenly divisible by 400. Therefore, the years 1700, 1800, 1900 and 2100 are not leap years, but 1600, 2000, and 2400 are leap years.

Given the number of days that have elapsed since January 1, 2000 A.D, your mission is to find the date and the day of the week.

Input

The input consists of lines each containing a positive integer, which is the number of days that have elapsed since January 1, 2000 A.D. The last line contains an integer -1, which should not be processed. You may assume that the resulting date won’t be after the year 9999.

Output

For each test case, output one line containing the date and the day of the week in the format of “YYYY-MM-DD DayOfWeek”, where “DayOfWeek” must be one of “Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday” and “Saturday”.

[……]

Continue

《C程序设计语言》习题解

T1.15,重新编写1.2节中的温度转换程序,使用函数实现温度转换。

#include
int fahrToCel(int fahr)
{
  return 5 * (fahr - 32) / 9;
}
int main()
{
  int fahr, cel;
  int lower, upper, step;
  lower = 0;
  upper = 300;
  step = 20;
  fahr = lower;
  while (fahr < upper) {
      cel = fahrToCel(fahr);
      printf("%d\t%d\n", fahr, cel);
      fahr += step;
  }
  return 0;
}

T1.16,修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多的打印文本。

#include
#define MAXLEN 1000
int getLine(char *s);
void copy(char *to, char *from);
int main()
{
  int len, maxLen;
  char line[MAXLEN], maxLine[MAXLEN];
  maxLen = 0;
  while((len = getLine(line)) != 0) {
      printf("%d %s\n", len, line);
      if(len > maxLen) {
          copy(maxLine, line);
          maxLen = len;
      }
  }
  if(maxLen > 0) printf("%s\n", maxLine);
  return 0;
}
int getLine(char *s)
{
  int i = 0;
  while((s[i] = getchar()) != '\n') i++;
  s[i] = '\0';
  return i;
}
void copy(char *to, char *from)
{
  int i = 0;
  while((to[i] = from[i]) != '\0') i++;
}

[......]

Continue

SDCC第一章手册翻译

最近开始使用SDCC编译器,本来想详细写点SDCC的文章,不过一直没有解决单片机在Linux平台下的烧录问题,所以计划暂时停止了.没事干,先翻译一下 SDCC Manual 第一章的内容!希望对大家有所帮助.不过我这人做事常常有头无尾,所以不太可能把整个手册都翻译好!

SDCC开发比较活跃,不同时期的Manual可能会有些变化,我这翻译的时候Revision是6253.新版本可能会略有一些变化,总体变化不会很大.我的英语不是很好,既不是英语专业的也不是计算机专业的,还不是电气专业的,翻译中难免(可能性很大)会出现的错误,优先建议你去读SDCC Manual的原文,英语不好再考虑对照这篇文章读原文,迫不得已再直接读我的中文翻译.

Chapter 1

简介

1.1 关于SDCC

SDCC(Small Device C Compiler)是 Sandeep Dutta 为8位微处理器设计的开源,可重用,经过优化的ANSI-C交叉编译器.当前版本的目标平台为Intel MCS51兼容单片机(8031, 8032, 8051, 8052系列), Dallas 的 DS80C390 及其衍生产品, Freescale(原属于 Motorola)的 HC08 和基于 Zilog Z80 的兼容单片机.SDCC 也可支持其他单片机,PIC 支持正在开发中.整个编译器源代码在GNU通用公共许可证(GPL)下发布. SDCC 使用 ASXXXX 和 ASLINK 的修改版本作为交叉编译工具和链接工具. SDCC 针对各种单片机进行有效的拓展,可以更好的使用基本的硬件资源.

此外,SDCC 对单片机做了大量标准优化,例如:

  • 全局表达式消除
  • 循环优化(无操作循环优化,归纳变量循环优化,你循环优化)
  • 重复常量合并
  • 复制传播
  • 无效代码清楚
  • switch语句的跳转优化

[……]

Continue

最短路寻线智能小车(智能出租车)

前几周和舍友一起参加学院的电子设计大赛。这是为我们的小车写的报告。这是我第一次比较规范的写代码,做点有项目性质的东西,也是第一次做单片机上的编程,整体比较粗糙。高手看了别见笑。如果有什么错误欢迎大家指出来,交流使人进步!

一.系统方案选择与论证

1.1.设计要求

1.1.1.任务

设计制作一个智能小车模型,在一份已知地图上从指定起点出发通过计算最短路径选择最佳路线到达终点。每个节点为一个“十”字交叉路口。

1.1.2.要求

根据任务要求我们为自己的设计确定了以下目标:

基本部分:

  1. 计算从起点到终点的最短路径。
  2. 在每个节点通过转向选择一条路线到达下一个节点。
  3. 从一个节点到下一个节点进行寻线操作。
  4. 到达一个节点能够自动停车。

1.2.系统方案对比论证

1.2.1.系统总体方案设计论证

本系统大体上分为四个基本模块,它们的关系可由如下方框图示意

1.2.2.各模块方案选择与论证

1.2.2.1.车体设计

方案 1:自己制作电动小车。但自己制作的车体比较粗糙,对于寻线小车,车身重量以及平衡都要有精确的测量,而且也要控制好小车行驶的路线和转弯的力矩及角度,这些都比较难良好地实现。

方案 2:购买具有组装完整的车架车轮。使用两轮驱动并配置万向轮,选用转轴力矩大的减速电机来提供动力及精确调节转弯。 成品的车架车轮由于装配紧凑,使得各种所需电路的安装十分方便,看起来也比较美观。而且这种电动车一般都价格适中。

基于以上分析,我们选择方案2。

[……]

Continue

《C程序设计语言》习题解

//练习1-13,编写一个程序,打印输入中单词长度的直方图.水平方向的直方图比较容易绘制,垂直方向的困难一些.(书中第17页)
//做这个练习之前最好能先弄懂直方图是什么
//首先,定义:
//n为某个长度单词出现的次数
//M为出现最频繁的长度的次数
//H为你所定义的直方图的最大长度
//那么所求的len = n * H / M[……]

Continue