- 博客(62)
- 收藏
- 关注
原创 C++ vector的详细用法和底层原理
vector是STL容器中的一种常用的容器,和数组类似,由于其大小(size)可变,常用于数组大小不可知的情况下来替代数组。vector是为了实现动态数组而产生的容器,然而向量这个名字是STL编写者取名没区好,因为在数学上的向量在几何中是矢量,两者名字相同而意义大相径庭。vector也是一种顺序容器,在内存中连续排列,因此可以通过下标快速访问,时间复杂度为O(1)。然而,连续排列也意味着大小固定,数据超过vector的预定值时vector将自动扩容。//定义一个空的二维vector。
2024-10-25 14:08:41 1002
原创 C++中指针类型、引用类型、值类型
可能会导致程序崩溃或其他不可预期的结果。改进方案1:可以在堆上创建对象,并返回对象的指针。但这需要调用者在适当的时候手动释放内存。
2024-10-24 10:01:59 696
原创 C++ 占位符
格式占位符(%)是在C/C++语言中格式输入函数,如 scanf、printf 等函数中使用。其意义就是起到格式占位的意思,表示在该位置有输入或者输出。占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑。
2024-10-22 14:57:52 296
原创 C#使用Lazy<T>提高性能
单例模式 在这个示例中,的构造函数中有一些输出语句用于表明对象的创建过程。当创建实例时,对象并没有立即被创建。只有在第一次访问时,才会被创建,后续再次访问时,直接返回已经创建好的对象。在这个示例中,通过指定线程安全模式创建实例。然后创建两个(模拟多线程环境),两个都会访问。由于的线程安全机制,即使在多线程环境下,也只会被创建一次。
2024-10-08 11:46:23 447
原创 分享一下C#单例模板类SingletonTemplate<T>
单例模式是一种软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来获取该实例。可以确保实例只在第一次被访问时创建,避免了每次进入锁后都进行实例创建的开销。在内部会处理线程安全问题,无需手动进行双重检查锁定。这段代码实现了一个通用的单例模板类。在多线程环境下,使用。
2024-10-08 11:40:22 409
原创 C#参数数组params的使用方法
如:public static void useParams( int[] list) 和 public static void useParams(params int[] list) 方法参数相同不可重载。如: public static void useParams(int i1,int i2)优于 public static void useParams(params int[] list)第一个先被调用。3.参数类型:“params” 关键字可以与任何类型配合使用,不仅仅局限于整数类型。
2024-09-27 14:56:49 491
原创 Modbus通信主站和从站点区别的理解
主站(Master):主站是通信的发起者,它控制着整个通信过程。它发送请求并等待从站的响应。主站可以是PLC、计算机或其他控制器。它根据需要发起读写操作,并负责处理从站返回的数据。从站(Slave):从站响应主站的请求,它的行为由主站的指令决定。每个从站都有一个唯一的地址,以便主站能准确地定位到它。当从站接收到主站的请求时,它会执行相应的操作,如读取或写入数据,然后将结果返回给主站。通信流程主站发出一个请求,包含目标从站的地址、功能码、数据等信息。从站收到请求后,解析指令并执行相应的操作。
2024-09-03 18:41:57 1002
原创 C#为复杂属性提供下拉式编辑框和弹出式编辑框
弹出式和下拉式是如何实现的呢,这需要为属性提供一个专门的编辑类。.Net为我们提供了一个System.Drawing.Design.UITypeEditor类,它是所有编辑类的基类,从他继承出了诸如ColorEditor、FontEditor的类,因此我们可以在属性框中编辑颜色和字体。定义了这样的类,我们也可以为自己的属性实现弹出式和下拉式编辑方式。 继承者说明:若要实现自定义设计时 UI 类型编辑器,必须执行下列步骤1. 定义一个从 派生的类目的:创建一个新的编辑器类,用于自定义编辑属性值
2024-08-23 11:58:24 550
原创 Winform中DataGridView网格添加ComboBox
3 .编写DataGridView的CurrentCellChanged事件和ComBoBox的SelectedIndexChanged事件。1. 在窗体类中声明一个全局的变量ComBoBox,并在Form的Load事件中设置号ComBoBox的下拉选项。2 .在DataGridView绑定完数据源之后,将ComBoBox添加到DataGridView中。
2024-08-21 10:21:00 291
原创 TCP通信三次握手四次挥手理解
TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,旨在解决在不可靠的互联网上如何确保端到端的可靠数据传输问题。
2024-08-05 14:11:46 896
原创 halcon中XLD
XLD(eXtended Line Descriptions):XDL就是一个轮廓函数,它不是基于像素,人们通常称他为亚像素,只不过它比像素更精确,可以精确到像素内部的一种描述。在Halcon中,
2024-08-02 15:40:03 1047
原创 Halcon学习之derivate_gauss
HALCON 图像处理库中的一个常用算子,用于计算图像的高斯导数。高斯导数是一种平滑导数,在计算过程中结合了高斯滤波,具有平滑噪声的效果。这个算子可以计算图像的不同导数,如梯度、一阶导数、二阶导数、以及 Hessian 行列式等。
2024-07-29 17:16:56 679
原创 Halcon学习之边缘扩展
适合用于图像整体的边缘闭合,不考虑边缘段的长度或具体间隙大小。提供了更精细的控制,允许根据边缘段的长度和最大间隙进行选择性闭合。选择使用哪一个算子取决于具体的应用场景和对边缘连接的要求。
2024-07-29 15:22:53 210
原创 C#Thread详解与示例
C# 多线程编程是提高应用程序性能和响应性的有效方式。通过 Thread 类,您可以创建和启动新的线程,管理线程的生命周期,以及实现线程之间的通信。然而,多线程编程也带来了线程安全的问题,需要通过锁、线程局部变量、Concurrent collections 和 Task 等方式来确保数据的一致性和程序的稳定性。执行耗时的计算或IO操作,如文件处理、数据加密、图像处理等。处理用户界面任务,如后台处理、异步更新UI组件等。实现并行算法,提高计算效率,如矩阵计算、科学模拟等。
2024-07-18 11:38:09 1301
原创 C#各种锁知识点
先上总结:lockMonitor粒度:锁的粒度是指锁定代码块的范围。如果锁定范围太大,会减少并发性,影响性能。尽量减少锁定代码块的大小,只锁定必要的部分。
2024-07-18 11:14:38 998
原创 c# System.Threading.Timer
下一个Timer对象到期时,线程就会唤醒,在内部调用ThreadPool 的 QueueUserWorkItem,将一个工作项添加到线程池队列中,使你的回调方法得到调用。period 继续使用 Timeout.Infinite. 使用这个方法要注意如果timer 在被Dispose了,使用Change 将会引发异常。使用Dispose方法后,callback还是会执行完一个完整的生命周期,不会中途停止。定时器将会一直执行。如果回调方法的执行时间很长,计时器可能(在上个回调还没有完成的时候)再次触发。
2024-07-18 09:55:58 1330
原创 关于X86、X64及AnyCpu的讨论
在C#和.NET开发中,目标平台配置(X86、X64及Any CPU)决定了应用程序在不同处理器架构上的运行方式。
2024-07-17 11:55:32 721
原创 PFA、PEEK和PP的材质、特点及用途
通过这些特点和用途的比较,可以看出PFA、PEEK和PP在不同领域和应用中的优势和适用性。PFA和PEEK因其高性能和耐化学性,主要用于高要求的工业和技术应用,而PP则因其良好的综合性能和低成本,被广泛用于各种日常和工业应用。
2024-07-17 08:54:01 869
原创 PLC中的高低字节如何理解?
双字(Double Word,通常是32位整数)的高低字节定义可能会因具体的PLC型号和通信协议而有所不同。通常,双字可以被划分为两个16位字,每个16位字又分为高字节和低字节。
2024-07-16 17:14:19 805
原创 windows10设置环境变量Path步骤
1、鼠标右键“我的电脑”,点击“属性”,打开控制面板窗口,如图:2、点击“高级系统设置”,弹出设置窗口,如图:3、点击底部的“环境变量”,弹出环境变量窗口,如图:4、在下面的“系统变量”一栏,找到“Path”,并选中它,然后点击“编辑”,弹出编辑窗口,如图:5、在编辑环境变量窗口,点击“新建”,把路径填进去即可6、最后,一路点击“确定”,完成配置
2024-07-10 12:27:23 2628
原创 C#的DllImport使用方法
我们编写的C#代码(也包括.net平台上的其他语言,如VB,J#等),首先经过编译器把代码编译成中间语言(IL),当方法被调用时,公共语言运行库CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。环境的外部,直接编译成目标计算机码,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。指示入口点的调用约定。非托管代码生成的DLL文件,比如使用C++编写的代码编译生成的DLL,不能在VS中直接引用,可以通过DllImport方法来使用。
2024-07-10 12:23:15 983
原创 C# 一个串口通信的案例实现
Reader:R // 读取失败Reader:R12345678// 读取成功Example:Reader:0A 52 30 31 32 33 34 35 59 54 0D 0A // 成功Reader:0A 52 46 41 49 4C 0D 0A // 失败RPP1R12345678RFAIL。
2024-06-18 14:46:42 507 1
原创 C++关于拷贝构造函数的一些理解
拷贝构造函数通常以引用的方式接受同类型的对象作为参数,以完成对象的拷贝。程序中如果没有定义拷贝构造函数系统会生成一个默认的拷贝构造函数,它会将作为初始值的对象的数据成员的值都拷贝到要初始化的对象中。注意:拷贝构造函数的形参通常建议使用引用类型,如果不使用引用类型,而是传递对象本身,会导致在函数调用时发生对象的拷贝,这样就会调用拷贝构造函数本身,导致无限循环。编译器在执行B=fun2()时会创建一个临时的无名对象,在执行return A 时实际上是调用了拷贝构造函数将A 的值拷贝到。的属性值也被修改了。
2024-06-05 13:25:24 611
原创 C++函数模版和C#的泛型函数的区别
函数模板和C#的泛型函数在概念上是非常相似的,都是用于创建能够处理多种数据类型的通用函数。是类型参数的占位符。而在 C# 中,泛型函数使用。等形式来声明泛型参数。
2024-06-02 17:26:45 466
原创 C++ 变量的声明和初始化方式
在大多数情况下,这三种初始化方式都可以使用,并且它们在结果上是等效的。然而,列表初始化在某些情况下会更加严格,并且在使用窄化转换时会进行检查,这使得它在某些情况下更加安全。但在 C++ 中,直接初始化和复制初始化之间有一些微妙的区别。通常,直接初始化更加高效并且可以用于更多的情况,因为它在声明的同时就执行了初始化操作。,这也会导致窄化转换,但是列表初始化对窄化转换进行了检查,因此会导致编译错误。这是 C++11 引入的一种新的初始化方式,也被称为初始化列表。这是一种传统的初始化方式,称为复制初始化。
2024-06-02 15:52:09 517
原创 C#中的值类型与引用类型
这些值类型在C#中通常被用来存储简单的数据,它们的实例直接包含其数据的副本,而不是引用到实际数据的地址。在C#中,值类型是一种数据类型,它们直接包含它们的数据,并存储在栈上或内联在其他对象中。与引用类型不同,值类型的实例直接包含其数据的副本,而不是引用到实际数据的地址。在C#中,结构体是一种值类型,它们的实例直接包含其数据的副本,而不是引用到实际数据的地址。这些引用类型在C#中都是通过引用在内存中进行管理的,它们的实例是存储在堆内存中的,并通过引用来访问和操作。:是一种类型安全的函数指针,用于引用方法。
2024-06-02 10:37:39 590 1
原创 C++联合体用法
联合体(union)在 C++ 中是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型,联合体的大小等于其中最大成员的大小。联合体的大小通常等于其中最大成员的大小,这可能导致内存浪费。在使用联合体时,要注意对齐问题,特别是在处理跨平台或者对内存大小敏感的情况下。因为联合体共用内存,所以a.u.x占用的内存里的4被后来的a.k覆盖了,变成了0;联合体的所有成员共享同一块内存,因此对一个成员的修改会影响到其他成员。这可能导致意外的行为,特别是当不同成员的类型大小不同时。来访问联合体的成员。
2024-06-01 15:25:40 565
原创 C++操纵符用法
C++中的操纵符(Manipulators)是用于格式化输入输出的特殊工具。它们可以在输出流中控制各种格式,如设置字段宽度、精度、填充字符等。: 控制输出的对齐方式,分别为左对齐、右对齐和在填充字符之间对齐。: 控制bool类型的输出,以字符串形式输出true或false。这些操纵符可以单独使用,也可以组合使用以实现更复杂的格式化需求。: 控制浮点数的输出格式,分别为定点表示和科学计数法表示。: 在浮点数的输出中始终显示小数点。: 设置浮点数的精度为n位小数。: 设置填充字符为c。
2024-06-01 11:20:09 335
原创 C++位运算
右移操作会在左侧添加指定数量的零或符号位,并且可能导致右侧的位丢失。位移是一种常见的位操作,用于将二进制数字向左或向右移动指定数量的位。在 C++ 中,对于左移操作,如果移动的位数超过了数据类型的位数,则会对移动的位数取模,即取余数。符号位的翻转:对于符号位的翻转,可以使用按位异或操作来实现。按位与(AND)是一种位操作,用于将两个二进制数字的相应位进行逻辑与操作。按位或(OR)是一种位操作,用于将两个二进制数字的相应位进行逻辑或操作。按位异或(XOR)是一种位操作,用于比较两个二进制数字的相应位。
2024-06-01 09:58:02 847
原创 机器字长与操作系统的关系
因此,如果你的计算机是64位处理器,你可以选择安装32位或64位的Windows操作系统,但不能安装64位操作系统于32位处理器上。因此,随着技术的进步,许多现代计算机都采用了64位处理器和64位操作系统,以提供更好的性能和更大的内存支持。64位处理器可以更高效地处理更大的数据集和更多的内存,因此通常用于64位操作系统,如Windows的64位版本。总的来说,如果你的计算机硬件支持64位系统,并且你需要更好的性能、更大的内存支持和更好的未来扩展性,那么64位系统通常是更好的选择。
2024-05-31 13:36:55 587
原创 为什么16进制普遍应用在计算机领域
现在的16进制则普遍应用在计算机领域,这是因为将4个比特(4位)转换成单独的十六进制数字相对容易,这是因为十六进制系统是基于二进制系统的。在二进制系统中,每一位都只有两种可能的状态,0或1,而在十六进制系统中,每个数字可以表示4位二进制数。这些RGB值也可以以16进制表示,例如,红色的RGB值是(255, 0, 0),可以表示为 #FF0000。在计算机中,内存地址通常以16进制表示。总的来说,16进制在计算机领域中的应用十分广泛,它提供了一种简洁、易于理解和转换的方式来表示二进制数据。
2024-05-31 09:50:47 919
原创 MFC学习日记-AfxMessageBox和MessageBox区别
AfxMessageBox()函数在任何类里边都可以使用,而MessageBox()函数只能在CWnd类的继承类中使用。另外,AfxMessageBox()函数的参数没有MessageBox()函数的参数丰富,所以后者较前者灵活。MessageBox()是Win32API函数.后者是mfc中的全局函数.在MFC中能用MessageBox()的地方都能用AfxMessageBox().。在第一种形式中,lpszText表示在消息框内部显示的文本,消息框的标题为应用程序的可执行文件名(如Hello)。
2024-05-30 14:49:34 1410
原创 Halcon之光度立体法
要保证好的图像质量,首先要确保相机采集的图像具有线性特征,可以使用算子radiometric_self_calibration确认相机特性,如果相机采集的图像是非线性的,可以利用算子 lut_trans 矫正灰度信息。但对于一些特殊的产品,因为阴影的原因,三个方向打光不能很好的表征缺陷特征,造成重建的图像特征不明显,这个时候就需要在原来基础上增加打光方向,避免死角。这个角度是以图像为准的,比如光从图像右侧打过来,角度就是0°,从上面打过来,角度是90°,从左面打过来,角度是180°,下边打过来是270°。
2024-05-23 16:52:43 1723
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人