https://www.gravatar.com/avatar/8e10df0bad4c56b3464cd715f8d96c46?s=240&d=mp

21世纪C语言 第1章 便利编译配置

使用包管理器

必须获取的包:

  • 编译器。必须安装gccclang可能也有用。
  • gdb,调试器
  • Valgrind,测试C内存使用错误。
  • gprof,一个分析工具
  • make,你永远不需要直接调用编译器
  • pkg-config,查找库
  • Doxygen,文档生成
  • 文本编辑器。Emacsvim
  • 自动工具:AutoconfAutomakelibtool
  • Git
  • Shell替换品,比如Z shell。

一些省去重复造轮子的C库:

第16章 模板和泛型编程

面向对象编程和泛型编程都是处理程序编写时类型未知的情况。两者的区别是面向对象编程直到运行时类型才能知道,而泛型编程类型在编译期间知道。

容器,迭代器和算法都是泛型编程的例子。当编写一个泛型程序,我们用一种独立于任何类型的方式编写代码。当使用一个泛型程序,我们提供程序的实例将操作的类型或值。

Pygame第6章 接受用户输入

用户可以有很多种方式与游戏交互,这一章详细讲解多种输入设备。除了从设备获取信息,我们也要探索如何将用户所做的事情翻译成游戏中有意义的事件。容易交互对任何游戏都至关重要,不管你有多好的外观和声音。

Pygame第5章 让画面动起来

这一章描述如何以一种可以预测的方式在屏幕上移动对象,和如何使运动在其他人电脑里面一致。

理解帧率

我们需要知道计算机游戏中关于运动的第一件事情就是没有什么东西真正在移动。电脑屏幕或电视机展示给我们一系列图片,当两张图片间隔时间够短时,我们的大脑将这些图片混合在一起从而制造了流畅运动的假象。一张图片称为一帧,FPS(Frame Per Second)是每秒的帧数,也就是帧率。产生流畅运动需要的帧数,因人而异。

整理代码片段

根据pid获取进程名

void get_process_name_by_pid(int pid, char *name)
{
    char buf[256] = {0};
    char path[256] = {0};

    sprintf(buf, "/proc/%d/exe", pid);
    readlink(buf, path, sizeof(path));

    char *filename = basename(path);
    strcpy(name, filename);
}

C语言变长数组

C99标准才有的特性

void test_vla(const char *str)
{
    int len = strlen(str);

    char a[len + 1];
    memset(a, 0, sizeof(a));

    strcpy(a, str);

    printf("%s\n", a);
}

确保路径存在

bool besure_path(const char *pathname) {
    int len = strlen(pathname);

    char buffer[len + 1];
    memset(buffer, 0, sizeof(buffer));

    strcpy(buffer, pathname);

    for (int i = 0; i < len; ++i) {
        if (buffer[i] == '/') {
            buffer[i] = 0;

            if (access(buffer, F_OK) < 0) {
                if (mkdir(buffer, 0755) < 0) {
                    return false;
                }
            }

            buffer[i] = '/';
        }
    }

    return true;
}

计算一个数字二进制格式1的个数

int count_bit(int n) {
    int count = 0;

    while (n != 0) {
        ++count;
        n &= n - 1;
    }

    return count;
}