Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

Matlab浮点数比较方法

发表于 2021-12-17

Matlab中的浮点数按照IEEE754约定,以有限的精度进行存储。因此,在进行浮点数的比较时,要特别小心,防止看不见的误差导致错误的结果。例如在Matlab中输入如下代码:

1
2
testNum=0:0.1:1
testNum(4) == 0.3 % 结果将表示两者不相等

最好采用如下方式比较两个浮点数是否相等:

1
abs(testNum(4)-0.3)<eps

参考链接

  1. While comparing the equality of two floating numbers(a,b), we use abs(a – b) < tolerance. Could anyone let me know if there’s anyway that this function may yield bad results or errors ?,by mathworks.

CPlusPlus静态变量

发表于 2021-12-14 | 更新于 2024-04-25

static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。

我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。

另外,在 C++ 中,需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见时,可将其定义为静态数据。

c++类静态成员函数调用成员变量

方法一

一种最简单的方法就是在类静态函数的形参列表里面加入类指针,到时候直接传入实例的this指针就能操作类成员变量了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
public:
static void test(A *a)
{
a->m_a += 1;
}
void hello()
{
}
private:
static int m_staticA;
int m_a
};

方法二

一开始定义的时候就把实例的this指针复制给一个静态的类指针,这样不用传入this指针直接操作,但是这样如果多个实例都需要操作的时候会出现问题,定义多个变量的时候需要注意静态指针指向的是哪个实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A
{
public:
A()
{

}
static void test()
{
m_gA.m_a += 1;
}
void hello()
{
}
private:
static int m_staticA;
static A *m_gA;
int m_a
};

A* A::m_gA=NULL;

参考链接

  1. C/C++ 中 static 的用法全局变量与局部变量,by runoob.
  2. C/C++ 中的static关键字,by Arkin.
  3. c++类静态成员函数调用成员变量,by xxwtiancai.
  4. C++类里面定义一个指向自己的静态成员函数,by JJ_S.

shotcut视频编辑软件使用帮助

发表于 2021-12-06

最近有个视频剪辑的需求,以前用过会声会影,但感觉它安装包太大了。用了一下爱剪辑,发现该软件确实比较易用,但各种功能限制较多,广告太多,充值的坑太多。最后还是选择了开源的shotcut,基本也能满足简单的视频编辑要求。

参考链接

  1. Shotcut视频剪辑软件使用,by 清风草原.
  2. 开源视频处理工具Shotcut的用法: 剪切、合并、增加背景音乐、添加字幕、 插入视频、图片转视频并加背景音乐、制作电子相册,by lggirls.

CPlusPlus默认参数

发表于 2021-11-21 | 更新于 2021-12-14

函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,我们可以省略含有默认值的参数。也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
void Func(int i = 1, float f = 2.0f, double d = 3.0)
{
cout << i << ", " << f << ", " << d << endl ;
}

int main(void)
{
Func() ; // 1, 2, 3
Func(10) ; // 10, 2, 3
Func(10, 20.0f) ; // 10, 20, 3
Func(10, 20.0f, 30.0) ; // 10, 20, 30
return 0 ;
}

参考链接

  1. C++默认参数,by 滴水瓦.

CPlusPlus之Lambda表达式

发表于 2021-11-20

参考链接

  1. C++ 11 Lambda表达式,by 滴水瓦.

CPlusPlus函数设计技巧

发表于 2021-11-15 | 更新于 2021-11-17

在C++中,参数传递的方式是“实虚结合”。

  • 按值传递(pass by value)
  • 地址传递(pass by pointer)
  • 引用传递(pass by reference)

参考链接

  1. C语言函数设计的一般原则和技巧,by C语言中文网.
  2. 设计C++函数传参时如何决定使用指针还是引用?,by zhihu.
  3. C++中函数调用时的三种参数传递方式详解,by CC丶Z.
  4. C++ 函数可以直接返回一个对象吗?,by nettee.
  5. 数组作为函数参数,by LiHongxi.
  6. C++类对象作为函数参数传递详解,by c语言中文网.
  7. C++引用10分钟入门教程,by c语言中文网.
  8. C++中类成员对象与指针的区别,by PengStrongLee.
  9. C++中using的三种用法,by 算法集市.
  10. 10、【C++】前向声明/嵌套类/局部类(内部类),by 阿慕路泽.
  11. C++11 noexcept 关键字用法学习,by CNBLOG.

Simulink的强化学习代理开始无输出结果的解决方法

发表于 2021-11-14

Simulink进行强化学习代理训练时,出现如下错误:

1
2
3
Derivative of state '2' in block 'physicalModel/Nonlinear Second-Order Actuator/Integrator, Second-Order
Limited' at time 0.0 is not finite. The simulation will be stopped. There may be a singularity in the solution. If not, try reducing the step size
(either by reducing the fixed step size or by tightening the error tolerances)

经过分析,导致该错误的原因是产生强化学习代理初始输入信号的Memory模块的初始值设为inf导致的。解决方法是修改Memory模块的初始值。

参考链接

  1. Simulink扩展卡尔曼滤波输出无结果的解决,by 渣渣丰.

软件自动化测试工具简介

发表于 2021-11-14

在软件测试中,自动化测试指的是使用独立于待测软件的其他软件来自动执行测试、比较实际结果与预期并生成测试报告这一过程。在测试流程已经确定后,测试自动化可以自动执行的一些重复但必要测试工作。也可以完成手动测试几乎不可能完成的测试。对于持续交付和持续集成的开发方式而言,测试自动化是至关重要的。

GUI自动化测试工具

WinAppDriver

WinAppDriver(Windows Application Driver)是一个类似Selenium的UI自动化测试服务。
系统要求: Windows10或Windows Server 2016。支持应用程序: UWP, WPF, WinForms, Win32。

Microsoft UI Automation

UI Automation是Microsoft .NET 3.0框架下提供的一种用于自动化测试的技术,是在MSAA基础上建立的,MSAA就是Microsoft Active Accessibility。UI Automation在某些方面超过了MSAA,UI自动化提供了Windows Vista中,微软Windows XP的全部功能,和Windows Server 2003。

Web自动化测试工具

Selenium

Selenium 是为web浏览器的自动化提供了各种工具和依赖包。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现 Web 界面的测试。

参考链接

  1. spy++简介,by jackhuang.
  2. 自动化测试,by wikipedia.
  3. 用 Selenium + OpenCV 来玩 HTML5 小游戏,by 郑恒.
  4. Selenium,by Selenium homepage.
  5. 【龙测教程】教你做windows自动化测试,by pur-maple.
  6. 使用UI Automation实现自动化测试–1,by 开着拖拉机.
  7. Windows GUI自动化测试技术的比较和展望,by vagabond1.
  8. 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt,by YinKaisheng.
  9. 聊聊 PC 端自动化最佳方案:Pywinauto,by Linux爱好者.
  10. 聊聊 PC 端自动化最佳方案 - WinAppDriver,by AirPythonl.

CPlusPlus智能指针简介

发表于 2021-11-13 | 更新于 2024-04-21

当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。

智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。

auto_ptr

auto_ptr的实现原理其实是在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。

smart_ptr

智能指针(smart_ptr)是Boost各组件中,应用最为广泛的一个。

Boost从很早就提供了如下的智能指针,并且功能一直保持稳定:

  • scoped_ptr:不可拷贝与赋值,承载new,只能在 scoped_ptr 声明的作用域内使用。
  • scoped_array:不可拷贝与赋值,承载new []。
  • shared_ptr:可拷贝,承载new。boost 库中重要组成,重点学习。
  • shared_array:可拷贝,承载new []。
  • weak_ptr:弱引用。
  • intrusive_ptr:需要自实现计数功能的,引用计数智能指针。

smart_ptr的一种实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
template <typename T>  
class smart_ptr
{
public:
smart_ptr(T *p = 0): pointee(p), count(new size_t(1)) { } //初始的计数值为1
smart_ptr(const smart_ptr &rhs): pointee(rhs.pointee), count(rhs.count) { ++*count; } //拷贝构造函数,计数加1
~smart_ptr() { decr_count(); } //析构,计数减1,减到0时进行垃圾回收,即释放空间
smart_ptr& operator= (const smart_ptr& rhs) //重载赋值操作符
{
//给自身赋值也对,因为如果自身赋值,计数器先减1,再加1,并未发生改变
++*count;
decr_count();
pointee = rhs.pointee;
count = rhs.count;
return *this;
}
//重载箭头操作符和解引用操作符,未提供指针的检查
T *operator->() { return pointee; }
const T *operator->() const { return pointee; }
T &operator*() { return *pointee; }
const T &operator*() const { return *pointee; }
size_t get_refcount() { return *count; } //获得引用计数器值
private:
T *pointee; //实际指针,被代理
size_t *count; //引用计数器
void decr_count() //计数器减1
{
if(--*count == 0)
{
delete pointee;
delete count;
}
}
};

c++ 11智能指针

c++ 11 提供了3种智能指针:std::shared_ptr、std::unique_ptr、std::weak_ptr,使用时引用头文件 。

  • shared_ptr允许多个指针指向同一个对象
  • unique_ptr则“独占”所指向的对象
  • weak_ptr,它是一种弱引用,指向shared_ptr所管理的对象

参考链接

  1. 智能指针,by 百度百科。
  2. C++各类设计模式及实现详解,by linux.
  3. C++智能指针auto_ptr详解,by CHENG Jian.
  4. boost 学习笔记 4:智能指针 smart_ptr,by einverne.
  5. 研究C++类的成员变量构造析构顺序,by paokuflying.
  6. C++智能指针作为成员变量,by caesar1228.
  7. 为什么建议你用nullptr而不是NULL,by 守望.
  8. C++11动态内存与智能指针,by herryone123.

spy++简介

发表于 2021-11-12 | 更新于 2021-11-13

开发某些自动化工具,第一步就是要获取目标窗口的句柄,然后通过该窗口句柄向该窗口发送消息,以实现自动输入等功能。而获取窗口句柄必然离不开Spy++工具。

GUI自动测试

HTML5 Canvas自动测试

参考链接

  1. Windows上spy++的安装和使用,by wyplj_sir.
  2. [WinAPI] 获取窗口句柄的几种方法,by beautifulzzzz.
  3. c# 获取当前活动窗口句柄,获取窗口大小及位置,by jack_孟.
  4. 通过获取窗口句柄模拟键鼠点击的一些方法,by unbalance_.
  5. Why do some windows not receive Windows messages,by stackoverflow.
  6. Spy++ alternative that can send messages,by stackoverflow.
  7. 哪些事情是 AutoIt 可以而 AutoHotkey 不行的?,by zhihu.
  8. AutoIt 软件自动化操作,by 邹龙彬.
  9. 游戏测试 游戏自动化测试三三二二,by IAmTester.
  10. 序、自动化测试概述,by Airtest Project Docs.
  11. Selenium详解,by 闲欢.
  12. canvas进阶——如何实现canvas的事件系统,by 我的蓝猫被削了.
  13. CANVAS 实现事件系统,by 阿飞.
  14. Canvas的高级绘制技巧和事件系统,by Canvas in deeps.
  15. 使用Selenium和openCV对HTML5 canvas游戏进行自动化功能测试(一),by silmerusse.
  16. 用 Selenium + OpenCV 来玩 HTML5 小游戏,by 郑恒.
上一页1…212223…54下一页

Jack Huang

537 日志
69 标签
© 2026 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse