<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[u011749929的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u011749929</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u011749929]]></copyright><item><title><![CDATA[modbusTcp 从站和主站]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/125522791</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/125522791</guid><author>u011749929</author><pubDate>Wed, 29 Jun 2022 15:32:35 +0800</pubDate><description><![CDATA[主要测试读保持寄存器，地址4xxxx开始。不废话直接上代码下面是从站（server）代码：


我们可以通过modscan32工具来读取数据测试。下面是主站（client）代码:]]></description><category></category></item><item><title><![CDATA[设计模式--单一职责模式之桥模式]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/114651205</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/114651205</guid><author>u011749929</author><pubDate>Thu, 11 Mar 2021 11:23:32 +0800</pubDate><description><![CDATA[“单一职责”模式

单一职责模式出现的原由是：在软件设计中，如果出现责任划分不清楚，使用继承得到的结果往往会随需求的变化，子类急剧膨胀，同时充斥重复代码，这个时候的关键就是划清责任。

桥模式

A：说明

桥模式的动机：由于某些类型的固有的实现逻辑，使得他们具有多个变化得维度，带来子类膨胀和重复代码的问题。

B：例子（不同平台的邮件信箱收发邮件的实现）

1）首先我们想到是一堆的功能接口，将其所有功能接口放到一个纯虚类中，作为基类。同时有想到支持的平台主题，包括PC和Mobile，并继承接口定义的基类，]]></description><category></category></item><item><title><![CDATA[设计模式--单一职责模式之装饰模式]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/114632142</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/114632142</guid><author>u011749929</author><pubDate>Wed, 10 Mar 2021 15:19:49 +0800</pubDate><description><![CDATA[“单一职责”模式

单一职责模式出现的原由是：在软件设计中，如果出现责任划分不清楚，使用继承得到的结果往往会随需求的变化，子类急剧膨胀，同时充斥重复代码，这个时候的关键就是划清责任。

装饰模式

A:说明

其他模式虽然也存在职责问题，但装饰模式在责任划分这块是极其突出的模式之一。另一是桥模式。

B:例子（有关io操作）

实现一个对文件流/网络流/内存流，进行加密/缓存/加密缓存操作。UML和代码如下：




//业务操作     公共操作放到纯虚类中
class Stream{
public:
.]]></description><category></category></item><item><title><![CDATA[图片尺寸，分辨率和像素的理解]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/114030885</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/114030885</guid><author>u011749929</author><pubDate>Wed, 24 Feb 2021 17:43:30 +0800</pubDate><description><![CDATA[图片的尺bai寸和分辨率都是描述图du片的清晰度，图片zhi的尺寸x图片的分辨率=图片的像素dao。两者对于描述zhuan图片清晰度成正比。

图片的尺寸是描述一张图片的大小数据，通常描述为“图片长1920、宽1080”。数字图片的“长宽”并非物理意义的长度单位，而是在图片“横”和“竖”这两个维度上包含的像素个数。比如，1920×1080的图片是由横向1920个像素、纵向1080个像素（合计2,073,600个像素）构成的。

而图片的分辨率则是指单位面积内的像素数量，即像素密度，单位是dpi（dots p]]></description><category></category></item><item><title><![CDATA[图像旋转--利用opencv，cuda-npp的实现。]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/109689962</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/109689962</guid><author>u011749929</author><pubDate>Sat, 14 Nov 2020 17:45:29 +0800</pubDate><description><![CDATA[一，软件开发中，某些场景需要旋转图像，本文注意处理的是旋转图像90°，180°，270°。任意角度的旋转不涉及。注意选择观看。

图像的旋转可以利用opencv实现cpu完成，也可以通过cuda中的npp工具实现gpu完成，gpu的效率要比cpu搞很多。具体代码片段如下：

二，opencv代码实现：

1，实现如下：


void rotateImage(int degree) {

	cv::Mat srcCopy;
	cv::Mat src_img = imread("./bird.jpg", IMR]]></description><category></category></item><item><title><![CDATA[取模运算的理解和应用]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/107044606</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/107044606</guid><author>u011749929</author><pubDate>Wed, 01 Jul 2020 10:11:10 +0800</pubDate><description><![CDATA[软件开发过程中，总会遇到取余，取模，取整的计算或者思想，这里小结一下。

取模和取余，这两个运算在真整数的时候是一个概论，在负整数进行除法运算时不同。符号：“ % ”。

取整：即求商。符号：“ / ”。

取模和取余的区别

取余运算，在计算商值时，商值向0方向舍入，靠近0原则。
	取模运算，在计算商值时，商值向负无穷方向舍入；尽可能让商值小的原则（不超多商值的最大值）。
	例子：
取模

简述
			商值
			
			取模值
		5 mod 3 = 2
			5/3 = 1.66 商取小原则 商=1.]]></description><category></category></item><item><title><![CDATA[c++管理虚方法之override和final]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/107034293</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/107034293</guid><author>u011749929</author><pubDate>Tue, 30 Jun 2020 12:30:03 +0800</pubDate><description><![CDATA[零，背景

c++中，多态的核心，就是希望通过基类访问派生类中重写（overload）的虚方法，来实现不同派生类的不同响应。但虚方法带来一些编程陷阱。如，派生类中继承了基类的虚方法，提供了不同的版本，将会出现隐藏（shadow），覆盖旧版本。如下：


class Base{
public:
    virtual void func(char ch) const {}
};

class Bingo: public Base{
public:
    virtual void func(char *ch.]]></description><category></category></item><item><title><![CDATA[c++的常量折叠]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/107006922</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/107006922</guid><author>u011749929</author><pubDate>Mon, 29 Jun 2020 15:54:42 +0800</pubDate><description><![CDATA[何谓常量折叠？
常量折叠就是将常量表达式计算求值，并用求得的值来替换表达式，放入常量表。可以算作一种编译优化。（预编译阶段）

接下来我们通过一段代码来分析一下了解一下常量折叠及其特性：


int main()
{
  const int a = 10;
  int b = 2*a;
  int c = b;
  int *p = (int*)&amp;a;
  *p = 100;
  cout &lt;&lt; a &lt;&lt; endl;//输出10
  cout&lt...]]></description><category></category></item><item><title><![CDATA[const 关键字]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/106921765</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/106921765</guid><author>u011749929</author><pubDate>Sat, 27 Jun 2020 21:17:55 +0800</pubDate><description><![CDATA[一，C语言中的const

在c语言中， const 不是常量，只能说是不可改变的变量，c编译器，不能将const修饰的变量看成一个编译期间的常量，因为其在内存中有分别，c编译器不能知道在编译期间的值，所以不能作为数组定义的下标。


const int a=10；
int Array[b];  //编译错误

const 类名 变量名 与 类名 const 变量名 同义 

1，初始化问题

在c语言中，const int a；因为a只是个变量，且只会分配存储在“只读数据段”中内存，只读数据段中存放着常量]]></description><category></category></item><item><title><![CDATA[数据结构与算法--排序（二）]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/106616931</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/106616931</guid><author>u011749929</author><pubDate>Fri, 19 Jun 2020 13:07:57 +0800</pubDate><description><![CDATA[一，前言

归并排序和快速排序都用了分治的思想，来解决排序的问题。

二，归并排序的原理

归并排序的核心思想
]]></description><category></category></item><item><title><![CDATA[指针和引用]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/106770471</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/106770471</guid><author>u011749929</author><pubDate>Wed, 17 Jun 2020 13:36:48 +0800</pubDate><description><![CDATA[一，指针

1，指针的含义

指针是一种特殊的遍历，其存储的值被解释成内存里的一个地址。要理解一个指针需要搞清指针的四方面内容：指针的类型，指针所指向的类型，指针的值（指针所指向的内存地址），指针本身所占据的内存地址。

指针的类型
从语法的角度说，指针的类型，只要把指针声明语句中的指针名去掉，剩下的部分就是指针类型。例如：


int *ptr;      //指针类型是int*
int **ptr;     //指针类型是int**
int (*ptr)[3]; //指针类型是int(*)[3]
int]]></description><category></category></item><item><title><![CDATA[数据结构与算法--排序（一）]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/106069702</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/106069702</guid><author>u011749929</author><pubDate>Mon, 08 Jun 2020 13:17:47 +0800</pubDate><description><![CDATA[排序算法很多，其中最经典，最常用的：冒泡排序 ，插入排序，选择排序，归并排序，计数排序，基数排序，桶排序。大致可以分为三类，如图：



带着思考学习：插入排序和冒泡排序的时间复杂度相同，都是，在实际的软件开发 里，为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢？

一，如何分析一个“排序算法”

学习排序算法，除了学习它的算法原理，代码实现外，还需要分析一个排序算法，要分析一个排序算法，需要从下几个方面入手：

...]]></description><category></category></item><item><title><![CDATA[数据结构与算法--递归]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/106020306</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/106020306</guid><author>u011749929</author><pubDate>Sun, 10 May 2020 10:36:34 +0800</pubDate><description><![CDATA[零，递归的典例

递归的例子。 周末你带着女朋友去电影院看电影，女朋友问你，咱们现在坐在第几排啊？电影院里面太黑了，看不清，没法数，现在你怎么办？ 别忘了你是程序员，这个可难不倒你，递归就开始排上用场了。于是你就问前面一排的人他是第几排，你想只要在他的数字上加一，就知道自己在哪一排了。但 是，前面的人也看不清啊，所以他也问他前面的人。就这样一排一排往前问，直到问到第一排的人，说我在第一排，然后再这样一排一排再把数字传回来。直到你前面的人告诉你他在哪一排，于是你就知道答案了。

一，如何理解“递归”

数据结]]></description><category></category></item><item><title><![CDATA[数据结构--队列]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/106012976</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/106012976</guid><author>u011749929</author><pubDate>Sat, 09 May 2020 15:09:41 +0800</pubDate><description><![CDATA[一，如何理解“队列”

可以把队列想象成排队买票，先来的先买，后来的人只能站末尾，不允许插队。先进者先出，这就是典型的“队列”。 栈只支持两个基本操作：入栈push()和出栈pop()。队列跟栈非常相似，支持的操作也很有限，最基本的操作也是两个：入队enqueue()，放一个数据到 队列尾部；出队dequeue()，从队列头部取一个元素。如图：



队列也是一种操作受限的线性表数据结构。

队列作为一种非常基础的数据结果，队列的应用也非常广泛，特别是一些具有某些额外特性的队列，例如循环队列，阻塞队列，并发]]></description><category></category></item><item><title><![CDATA[数据结构--栈]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/105953436</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/105953436</guid><author>u011749929</author><pubDate>Sat, 09 May 2020 09:53:11 +0800</pubDate><description><![CDATA[一，如何理解“栈”

关于“栈”，有一个非常贴切的例子，就是一摞叠在一起的盘子。我们平时放盘子的时候，都是从下往上一个一个放；取的时候，我们也是从上往下一个一个地 依次取，不能从中间任意抽出。后进者先出，先进者后出，这就是典型的“栈”结构。



从栈的操作特性上看，栈是一种“操作受限”的线性表，只允许一个在插入和删除数据。

二，如何实现一个“栈”

栈的注意操作包含两个操作，入栈和出栈，即在栈...]]></description><category></category></item><item><title><![CDATA[数据结构--链表（二）]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/105836996</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/105836996</guid><author>u011749929</author><pubDate>Wed, 06 May 2020 15:49:39 +0800</pubDate><description><![CDATA[如何轻松写出正确的链表代码？

技巧一：理解指针或引用的含义
]]></description><category></category></item><item><title><![CDATA[数据结构--链表（一）]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/105811229</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/105811229</guid><author>u011749929</author><pubDate>Tue, 28 Apr 2020 15:00:42 +0800</pubDate><description><![CDATA[一，五花八门的链表结构

1，与数组的区别

先看下图：



可以看出，数组需要一块连续的内存空间来存储，对内存要求比较高，链表恰恰相反，不需要一块连续的内存，通过“指针”将一组零散的内存块串联起来。链表五花八门，最常见的三种链表结构：单链表，双向链表和循环链表。

2，单链表



单链表存在两个特殊节点，一个作为基地址的头结点还有一个是指向为NULL地址的尾结点。与数组一样，链表也支持数据的...]]></description><category></category></item><item><title><![CDATA[数据结构-数组]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/105798771</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/105798771</guid><author>u011749929</author><pubDate>Mon, 27 Apr 2020 22:35:18 +0800</pubDate><description><![CDATA[一，为何数组的下标都是从0开始
]]></description><category></category></item><item><title><![CDATA[序幕]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/105766496</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/105766496</guid><author>u011749929</author><pubDate>Mon, 27 Apr 2020 20:15:21 +0800</pubDate><description><![CDATA[一、学习的目的是什么？

  建立对代码的时间复杂度和空间复杂度意识，写出高指令的代码，能够设计基本架构，提升编码能力，训练逻辑思维。而非为了死记硬背几个知识点。

二、数据结构和算法是什么？
  1、数据结构是指一组数据的存储结构。

  2、算法就是操作数据的方法 。

  3、数据结构和算法是相辅相成的，数据结构是为算法服务的，而算法要作用在特定的数据结构之上。
三、学习的重...]]></description><category></category></item><item><title><![CDATA[复杂度分析与统计]]></title><link>https://blog.youkuaiyun.com/u011749929/article/details/105766941</link><guid>https://blog.youkuaiyun.com/u011749929/article/details/105766941</guid><author>u011749929</author><pubDate>Mon, 27 Apr 2020 20:15:01 +0800</pubDate><description><![CDATA[时间，空间复杂度分析

一，如何评估代码的时间，空间复杂度。

  在运行时，通过添加运行的统计时间来衡量代码的性能，受硬件的性能并受测试数据的规模两个局限性，不能很好的评估。

一般我们用“肉眼”来评估算法的执行效率，粗略地讲，就是算法代码执行的时间。

二，如何用“肉眼”来评估（大O 复杂度表示法）

  从CPU的角度来看，每一行代码都执行着类似的操作：读数据-运算-写数据。我们粗略...]]></description><category></category></item></channel></rss>