0%

C语言实现一个支持动态扩展的状态机

Ref: C语言实现有限状态机FSM

状态模式的定义详见:C++设计模式

动态数组实现详见:C语言实现一个支持任意类型的动态数组

本文内容依赖于上文提供的动态数组类型dynamic_arr

基于Ref一文中设计的有限状态机进行了改进,将状态机与其相关的状态、事件以及动作函数通过绑定的形式关联,实现了一定程度上的解耦。支持以字符串的形式动态扩展状态迁移表,从而达到用同样的接口创建多个职责不同的状态机且各自互不干扰的目的。(由于”删除“操作在非服务器程序中可以通过注释”新增“操作实现,因此本文暂未添加删除状态或事件的功能函数)

不足之处:动作函数的形式需统一,待进一步改进。

阅读全文 »

C语言中的内存对齐原则

详解内存对齐

内存对齐规则

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

对齐数

  1. 看编译环境,确认默认对齐位数 32位编译器,默认最小对齐为4字节,64位编译器默认最小对齐为8字节,指针长度也是8字节; 注意:64位系统在编译器是32位时或者注释为32位时,默认对齐也为4字节。可用以下语句声明为4字节:

    1
    #pragma pack(4)

  2. 再确定最终对齐位数 在确定默认对齐位数后,找出结构体中最长字节的数据类型,比较最长数据类型和默认对齐位数,谁小,谁是最终对齐位数。 注意:最长字节的数据类型计算取其原始类型,比如,char a[3],在算最长数据类型时,其值为1。

  3. 长度计算 再加入新的长度时,需要计算已有长度是否能够整除新添加长度,不能整除需要填充空间进行偏移,直到能够整除,放入新的长度。最后完整长度需要能够整除最终对齐数,不能整除则需要填充偏移。

阅读全文 »

C++ Design Patterns

李建忠 C++ 设计模式

《设计模式 可复用面向对象软件的基础》

设计模式初探

什么是设计模式?

每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。 ——Christopher Alexander

“设计模式”某种程度上是为了弥补语言上的不足实现的。

底层思维与抽象思维 * 底层思维:向下,语言构造、编译转换、内存模型、运行时机制 * 抽象思维:向上,面向对象、组件封装、设计模式、架构模式

向下:深入理解三大面向对象机制

  • 封装:隐藏内部实现
  • 继承:复用现有代码
  • 多态:改写对象行为

向上:深刻把握面向对象机制带来的抽象意义,理解如何用这些机制表达现实世界,用抽象思维进行评判,掌握什么是“好的面向对象设计”

需求的变化很多时候会冲击整个软件架构,因此在设计软件时要考虑应对复杂性的方式: * 分解:分而治之,大问题分成小问题,整体流程分成小流程,复杂问题分成简单问题 * 抽象:由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型

阅读全文 »

Git

一小时Git教程

常用命令

git init:在执行路径内初始化一个 .git/ 仓库

工作区(Working Directory).git/文件夹的上级路径,也是实际操作所在的目录

暂存区/索引(Staging Area/Index).git/index/,用于临时存放即将提交到Git仓库的内容

本地仓库(Local Repository).git/objects,存储代码和版本信息的主要位置

git add <file/dir>:将工作区中的文件添加到暂存区

git ls-files:查看位于暂存区中的文件

git commit -m "message":将暂存区中的文件提交到本地仓库

  • -a:同时使用该参数可以一并完成暂存和提交两个动作

git status:查看哪些文件在工作中(Untracked),哪些在暂存区中(Changes to be committed

git log [--oneline]:查看历史commit记录,包含了每一次提交的ID

阅读全文 »

旋转矩阵与坐标变换

旋转矩阵

旋转方向正负的定义

在笛卡尔坐标系中,当我们讨论旋转方向时,首先需要判断所讨论坐标系是“右手系”还是“左手系”,右手系的方向遵循“右手定则”,左手系则遵循“左手定则”,其含义为:用右手或左手握住坐标轴,大拇指朝向轴的正半部分,此时其余四指自然握紧形成的方向即为绕该轴旋转的“正方向”。

数学与物理中描述角度或角速度时,在没有特别说明是“左手系”的情况下,默认使用的是“右手系”

正方向在公式中的体现为:sincos括号数值的符号。而括号的符号则由右手系或左手系决定。

旋转矩阵的定义:

右手系,旋转角值沿右手螺旋方向为正(即逆时针为正)

\(Z\)轴转\(\alpha\) \[ R_z = \begin{bmatrix} cos(\alpha) &-sin(\alpha) &0 \\ sin(\alpha) &cos(\alpha) &0 \\ 0 &0 &1 \end{bmatrix} \]

\(Y\)轴转\(\beta\) \[ R_y = \begin{bmatrix} cos(\beta) &0 &sin(\beta) \\ 0 &1 &0 \\ -sin(\beta) &0 &cos(\beta) \end{bmatrix} \]

\(X\)轴转\(\gamma\) \[ R_x = \begin{bmatrix} 1 &0 &0 \\ 0 &cos(\gamma) &-sin(\gamma) \\ 0 &sin(\gamma) &cos(\gamma) \end{bmatrix} \]

阅读全文 »

本文提供 Windows10 + VS Code 配置 C++ OpenCV-4.5.5 + Opencv_Contrib-4.5.5 开发环境的具体操作步骤。

软件版本

CMake-3.20.2: cmake-3.20.2-windows-x86_64.msi

MinGW-W64 GCC-8.1.0: x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z

OpenCV-4.5.5: opencv-4.5.5-vc14_vc15.exe

OpenCV_Contrib-4.5.5: opencv_contrib-4.5.5.zip

下载完后解压到同一个路径下,方便集中管理。opencv_contrib 包可以直接放进 opencv 文件夹内。

首先配置 MinGW 和 CMake 的系统环境变量:

1
2
E:\Environment\mingw\bin
E:\Environment\cmake\bin

在 cmd 中通过 cmake -versiongcc -v 验证是否配置成功:

阅读全文 »

ApacheCN社区

Hadoop2.x与3.x端口变化

Maven Repository

Spark与Scala版本对应关系/Maven中央库

本文Spark配置基于通过VirtualBox搭建的Hadoop集群(3台Ubuntu18.04-Server服务器)环境;

涉及到的包版本:

  • JDK1.8 jdk-8u271-linux-x64.tar.gz

  • hadoop-3.3.0 hadoop-3.3.0.tar.gz

  • spark-3.0.1 spark-3.0.1-bin-hadoop3.2.tgz

  • scala-2.12.13 scala-2.12.13.tgz

  • hbase-2.4.0 hbase-2.4.0-bin.tar.gz

  • zookeeper-3.6.2 apache-zookeeper-3.6.2-bin.tar.gz

阅读全文 »

安装虚拟机增强功能

载入增强镜像文件

VBox菜单栏点击 设备 -> 安装增强功能,等待查找到匹配的镜像文件,一般名称为VBoxGuestAdditions_5.2.42.iso,查找到之后点击下载;

下载完毕镜像文件默认会保存到 ~/.config/VirtualBox/路径下,如果下载完成时提示是否分配光驱,点是即可,如果忽略了这一步,可以在 设备 -> 分配光驱 -> 选择虚拟盘 中手动分配;

分配成功时,可在 分配光驱 中看到勾选的增强镜像盘,也可在VBox对应虚拟机的管理界面-存储栏目中查到,另外,虚拟机系统中的 /dev 路径下会出现子目录 cdrom,内容即为增强镜像文件的内容:

阅读全文 »

实践背景

  • 大数据简介

    大数据(Big Data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库工具能力范围的数据集合,具有海量数据规模、快速数据流转、多样数据类型和价值密度低四大特征。

  • Hadoop简介

    Hadoop是一套开源的用于大规模数据集的分布式存储和处理的工具平台。它最早由Yahoo的技术 团队根据Google所发布的公开论文思想用JAVA语言开发。以分布式文件系统HDFS(Hadoop distributed file system)和Map Reduce分布式计算框架为核心,具有高容错性、高伸缩性等优点,允许用户将Hadoop部署在廉价的硬件上,构建分布式文件存储系统。

阅读全文 »

王道DSA笔记

内容来源:王道2021数据结构

Chapter1 绪论

数据结构

四个概念:

  • 数据元素:数据的基本单位,通常作为一个整体进行考虑和处理。
  • 数据项:构成数据元素的不可分割的最小单位。
  • 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
  • 数据对象:具有相同性质的数据元素的集合,是数据的一个子集。

数据结构三要素:

  • 数据的逻辑结构:集合、线性结构、树形结构、图结构
  • 数据的物理结构(存储结构):顺序存储、链式存储,索引存储、散列存储(哈希)
  • 数据的运算:包括运算的定义和实现;运算的定义针对逻辑结构指出运算的功能,运算的实现针对存储结构指出运算具体操作步骤。

绪论部分要点:

  • 若采用顺序存储,则各个数据元素在物理上必须是连续的;若采用非顺序存储,则各个数据元素在物理上可以是离散的。
  • 数据的存储结构会影响存储空间分配的方便程度,以及对数据运算的速度。

数据类型:一个值的集合和定义在此集合上的一组操作的总称

  • 原子类型:值不可再分的数据类型,如boolint等。
  • 结构类型:值可再分解为若干成分的数据类型,如structclass等。

抽象数据类型:(Abstract Data Type,ADT)抽象数据组织及与之相关的操作,用数学化的余元定义数据的逻辑结构以及定义运算,与具体的实现无关(不涉及物理结构)。

阅读全文 »