当前位置: 首页 > news >正文

C语言调试宏全面总结(六大板块)

  1. C语言调试宏进阶篇:实用指南与案例解析
  2. C语言调试宏高级技巧与最佳实践
  3. C语言调试宏的深度探索与性能考量
  4. C语言调试宏在嵌入式系统中的应用与挑战
  5. C语言调试宏在多线程环境中的应用与策略
  6. C语言调试宏在并发编程中的高级应用

68dbe2928ad44a0ba6573e485b52a0cd.jpeg

C语言调试宏进阶篇:实用指南与案例解析

前言

在C语言编程中,调试是提高代码质量和可靠性的关键步骤。而宏作为一种强大的文本替换工具,可以在调试过程中发挥巨大作用。本文将带你深入了解C语言中的调试宏,通过一系列实用的案例,让你掌握如何高效地使用这些工具。

一、调试宏基础

1.1 宏的定义与使用

宏是C语言中的一种预处理指令,用于在编译前对代码进行文本替换。宏的定义通常如下:

#define 宏名 替换文本

使用宏时,只需在代码中写入宏名,编译器会在预处理阶段将其替换为对应的文本。

1.2 宏的优点

  • 提高代码可读性:通过宏定义,可以将复杂的表达式或常量简化为一个易于理解的名称。
  • 方便代码维护:当需要修改某个常量或表达式时,只需修改宏定义即可,无需逐个修改代码中的每个实例。
  • 增强代码可移植性:通过宏定义,可以方便地适应不同的平台或编译器。

二、常用调试宏

2.1 ASSERT宏

ASSERT宏是一种常用的调试工具,用于检查程序中的假设是否成立。当ASSERT宏中的条件为假时,程序将终止执行。

#define ASSERT(condition) \if (!(condition)) { \fprintf(stderr, "Assertion failed: %s, file %s, line %d\n", #condition, __FILE__, __LINE__); \exit(EXIT_FAILURE); \}

2.2 DEBUG宏

DEBUG宏用于在调试模式下输出调试信息,而在发布模式下不产生任何代码。

#ifdef DEBUG
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
#else
#define DEBUG_PRINT(fmt, ...)
#endif

2.3 UNUSED宏

UNUSED宏用于标记函数中的未使用参数,避免编译器产生警告。

#define UNUSED(x) (void)(x)

三、调试宏案例解析

3.1 ASSERT宏的使用

int divide(int a, int b) {ASSERT(b != 0);return a / b;
}

在这个案例中,我们使用ASSERT宏来检查除数是否为0。如果b为0,程序将终止执行,并输出错误信息。

3.2 DEBUG宏的使用

int main() {int a = 5, b = 10;DEBUG_PRINT("a = %d, b = %d\n", a, b);return 0;
}

在这个案例中,我们使用DEBUG宏在调试模式下输出变量a和b的值。在发布模式下,这些调试信息将不会产生任何代码。

3.3 UNUSED宏的使用

void func(int a, int b, int c) {UNUSED(c);// 使用a和b进行操作
}

在这个案例中,我们使用UNUSED宏来标记未使用的参数c,避免编译器产生警告。

四、总结

调试宏是C语言中一种强大的调试工具,可以提高代码的可读性、可维护性和可移植性。通过本文的介绍,相信你已经掌握了如何使用这些调试宏,并在实际编程中灵活运用。

最后,记住,调试是编程过程中不可或缺的一环,而调试宏正是你在这场战斗中的得力助手。善用它们,让你的代码更加健壮和可靠!

C语言调试宏高级技巧与最佳实践

前言

在上一篇博客中,我们探讨了C语言调试宏的基础知识和一些实用案例。本文将深入探讨更高级的调试宏技巧,并分享一些最佳实践,帮助你在C语言编程中更高效地使用调试宏。

一、条件编译的高级应用

1.1#ifdef、#ifndef和#endif的妙用

在上一篇中,我们提到了#ifdef#endif的用法。除此之外,#ifndef(如果未定义)也是非常有用的。这些指令可以帮助我们根据不同的编译条件包含或排除代码段。

#ifndef DEBUG
#define NDEBUG
#endif
#include <assert.h>

在这个例子中,如果DEBUG未定义,我们定义NDEBUG,这样assert.h中的断言就不会执行,从而在发布版本中去除调试代码。

1.2 #if、#elif和#else的高级用法

#if#elif#else可以用来根据特定的条件编译代码。这对于创建可适应不同平台和配置的代码非常有用。

#if defined(DEBUG) && defined(_WIN32)
// Windows平台下的调试代码
#elif defined(DEBUG) && defined(__linux__)
// Linux平台下的调试代码
#else
// 其他情况下的代码
#endif

二、调试宏的高级技巧

2.1 带参数的宏与字符串化操作

在上一篇中,我们介绍了ASSERT宏。通过字符串化操作(#),我们可以将宏参数转换为字符串,这在调试输出中非常有用。

#define ASSERT(condition) \if (!(condition)) { \fprintf(stderr, "Assertion failed: %s, file %s, line %d\n", #condition, __FILE__, __LINE__); \exit(EXIT_FAILURE); \}

2.2 带参数的宏与连接操作

通过连接操作(##),我们可以在宏定义中连接多个参数,创建更灵活的宏。

#define JOIN(a, b) a##b
#define TOKENPASTE(x, y) JOIN(x, y)
#define MY_MACRO_NAME TOKENPASTE(MY_PREFIX, MacroName)

在这个例子中,MY_MACRO_NAME将被展开为MY_PREFIXMacroName

三、调试宏的最佳实践

3.1 保持宏的可读性和简洁性

在定义宏时,应尽量保持其简洁和易于理解。复杂的宏可能会隐藏错误,并使代码难以维护。

3.2 使用宏时避免副作用

宏展开可能会产生副作用,特别是在带参数的宏中。确保宏的每个参数只被计算一次,以避免潜在的问题。

3.3 使用宏进行代码保护

在编写库或模块时,使用宏来保护代码免受多重包含的影响是一种良好的实践。

#ifndef MY_HEADER_H
#define MY_HEADER_H
// 头文件内容
#endif

四、总结

调试宏是C语言编程中的强大工具,但它们也需要谨慎使用。通过本文,我们探讨了条件编译的高级应用,带参数宏的技巧,以及调试宏的最佳实践。希望这些内容能帮助你更有效地使用调试宏,提高代码质量。

记住,调试宏的正确使用可以大大提高代码的可维护性和可调试性。继续探索和实验,让这些工具成为你编程技能的一部分!

C语言调试宏的深度探索与性能考量

前言

在前两篇博客中,我们介绍了C语言调试宏的基础知识、进阶技巧和最佳实践。本文将深入探讨调试宏的高级应用,特别是如何在不牺牲性能的前提下,利用调试宏进行高效的程序调试和性能分析。

一、调试宏与性能分析

1.1 性能分析宏的定义

性能分析是软件开发中的一个重要环节。通过定义特定的性能分析宏,我们可以在不修改代码逻辑的情况下,测量代码段的执行时间。

#define PROFILE(func) \do { \clock_t start = clock(); \func; \clock_t end = clock(); \double time_spent = (double)(end - start) / CLOCKS_PER_SEC; \printf("Function %s took %f seconds to execute\n", #func, time_spent); \} while (0)

1.2 使用性能分析宏

使用上述宏,可以轻松地分析函数或代码块的执行时间。

PROFILE(slow_function());

在这个例子中,slow_function()的执行时间将被测量并打印出来。

二、调试宏与代码覆盖率

2.1 代码覆盖率宏的概念

代码覆盖率是衡量测试完整性的一个重要指标。通过定义特定的宏,我们可以在测试过程中跟踪哪些代码被执行。

#define COVERED() \do { \static bool covered = false; \if (!covered) { \covered = true; \covered_lines++; \} \} while (0)

2.2 使用代码覆盖率宏

在代码的关键部分使用COVERED()宏,可以统计测试过程中覆盖的代码行数。

if (condition) {COVERED();// 关键代码
}

三、调试宏与内存泄漏检测

3.1 内存泄漏检测宏的实现

内存泄漏是C语言程序中常见的问题。通过定义特定的宏,可以在分配和释放内存时进行跟踪。

#define MALLOC(size) my_malloc(size, __FILE__, __LINE__)
#define FREE(ptr) my_free(ptr, __FILE__, __LINE__)void *my_malloc(size_t size, const char *file, int line);
void my_free(void *ptr, const char *file, int line);

3.2 使用内存泄漏检测宏

使用自定义的MALLOCFREE宏,可以更容易地检测内存泄漏。

int *ptr = MALLOC(sizeof(int) * 10);
FREE(ptr);

四、调试宏与性能优化

4.1 性能优化宏的应用

在某些情况下,我们可能需要在调试和发布版本中执行不同的代码路径。通过条件编译,可以实现这一目标。

#ifdef NDEBUG
#define OPTIMIZED_CODE
#endif// ...#ifdef OPTIMIZED_CODE
// 性能优化代码
#else
// 调试代码
#endif

五、总结

调试宏在C语言编程中扮演着重要角色,不仅可以帮助我们找到和修复错误,还可以用于性能分析和代码覆盖率统计。通过本文的深度探索,我们学习了如何在不牺牲性能的前提下,利用调试宏进行高效的程序调试和性能分析。

记住,调试宏的正确使用可以大大提高代码的可维护性和可调试性。继续探索和实验,让这些工具成为你编程技能的一部分!

C语言调试宏在嵌入式系统中的应用与挑战

前言

在前几篇博客中,我们探讨了C语言调试宏在通用编程中的应用。然而,在嵌入式系统的开发中,调试宏的使用面临着独特的挑战和限制。本文将深入探讨嵌入式系统中调试宏的应用,以及如何克服这些挑战。

一、嵌入式系统中的调试限制

1.1 资源限制

嵌入式系统通常资源有限,如内存、处理器速度和存储空间。因此,在使用调试宏时,需要特别注意其对资源的影响。

1.2 实时性要求

许多嵌入式系统有严格的实时性要求。调试宏可能会引入额外的执行时间,影响系统的响应时间。

1.3 缺乏调试工具

与桌面或服务器环境不同,嵌入式系统可能缺乏成熟的调试工具,如调试器和性能分析器。

二、嵌入式系统中调试宏的应用

2.1 优化宏的使用

为了减少资源消耗,可以在编译时通过条件编译来控制宏的启用和禁用。

#ifdef NDEBUG
#define LOG(msg, ...)
#else
#define LOG(msg, ...) printf(msg, __VA_ARGS__)
#endif

2.2 使用轻量级宏

在嵌入式系统中,应避免使用复杂的宏。简单的宏可以减少代码大小和执行时间。

#define MIN(a, b) ((a) < (b) ? (a) : (b))

2.3 使用宏进行错误处理

在嵌入式系统中,错误处理非常重要。使用宏可以简化错误处理的代码。

#define CHECK(condition, error_action) \if (!(condition)) { \error_action; \}

三、嵌入式系统中的调试技巧

3.1 使用串口输出

许多嵌入式系统都有串口,可以通过串口输出调试信息。

#define SERIAL_LOG(msg, ...) serial_printf(msg, __VA_ARGS__)

3.2 使用LED指示

在资源非常有限的系统中,可以使用LED指示程序的状态或错误。

#define LED_ERROR led_on(LED_RED)

四、总结

在嵌入式系统的开发中,调试宏的应用需要特别注意资源消耗和实时性要求。通过优化宏的使用、使用轻量级宏和特定的调试技巧,可以在不牺牲系统性能的前提下,有效地使用调试宏。

记住,嵌入式系统的调试是一个挑战,但也是一个机会,通过创造性地使用调试宏,你可以开发出更可靠、更高效的嵌入式软件。继续探索和实验,让这些工具成为你编程技能的一部分!

C语言调试宏在多线程环境中的应用与策略

前言

在之前的博客中,我们探讨了C语言调试宏在通用编程和嵌入式系统中的应用。然而,当涉及到多线程程序时,调试宏的使用变得更加复杂。本文将讨论在多线程环境中使用调试宏的策略,以及如何确保调试信息的准确性和线程安全性。

一、多线程环境中的调试挑战

1.1 线程安全问题

在多线程程序中,多个线程可能同时访问和修改共享资源,包括调试信息。这可能导致数据竞争和不可预测的行为。

1.2 调试信息的同步

确保调试信息同步是非常重要的,以便能够准确地跟踪和分析线程的执行。

1.3 调试性能的影响

在多线程环境中,调试宏可能会对程序的性能产生更大的影响,因为它们可能会引入线程间的竞争和同步开销。

二、多线程环境中调试宏的应用策略

2.1 使用线程局部存储(TLS)

线程局部存储是一种机制,允许每个线程都有自己的变量实例。这可以用于存储线程特定的调试信息。

__thread char tls_buffer[256];
#define LOG_THREAD(msg, ...) sprintf(tls_buffer, msg, __VA_ARGS__); printf("%s", tls_buffer)

2.2 使用互斥锁保护共享资源

对于需要跨线程共享的调试资源,可以使用互斥锁来保护它们,防止数据竞争。

pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;#define LOG_SHARED(msg, ...) \pthread_mutex_lock(&log_mutex); \printf(msg, __VA_ARGS__); \pthread_mutex_unlock(&log_mutex)

2.3 使用条件编译优化调试代码

在多线程环境中,可以通过条件编译来优化调试代码,减少对性能的影响。

#ifdef NDEBUG
#define THREAD_SAFE_LOG(msg, ...)
#else
#define THREAD_SAFE_LOG(msg, ...) LOG_SHARED(msg, __VA_ARGS__)
#endif

三、多线程调试技巧

3.1 使用线程特定的日志文件

每个线程可以将调试信息写入自己的日志文件,这样可以更容易地分析和跟踪线程的执行。

__thread FILE *thread_log_file = NULL;
#define THREAD_LOG(msg, ...) \if (!thread_log_file) { \char filename[32]; \sprintf(filename, "thread_%d.log", pthread_self()); \thread_log_file = fopen(filename, "w"); \} \fprintf(thread_log_file, msg, __VA_ARGS__); \fflush(thread_log_file)

3.2 使用静态或局部变量减少锁的使用

尽可能使用静态或局部变量来存储调试信息,以减少对互斥锁的需求。

static int static_counter = 0;
#define INC_COUNTER() static_counter++

四、总结

在多线程环境中,调试宏的使用需要特别注意线程安全性和性能影响。通过使用线程局部存储、互斥锁和条件编译,可以有效地管理调试信息,并确保其准确性和线程安全性。

记住,多线程程序的调试是一个复杂的过程,但通过适当的策略和技巧,你可以更有效地使用调试宏,提高代码的质量和可靠性。继续探索和实验,让这些工具成为你编程技能的一部分!

C语言调试宏在并发编程中的高级应用

前言

在之前的博客中,我们探讨了C语言调试宏在多线程环境中的应用。然而,随着并发编程的复杂性增加,对调试宏的需求也变得更加高级。本文将深入探讨并发编程中调试宏的高级应用,包括如何处理复杂的同步问题、如何跟踪并发执行流程,以及如何优化调试性能。

一、并发编程中的调试挑战

1.1 同步问题

并发编程中的同步问题可能导致死锁、竞态条件和饥饿等问题,这些都使得调试变得复杂。

1.2 跟踪并发执行

在并发程序中,多个线程或进程的执行流程可能交织在一起,这使得跟踪程序的执行变得困难。

1.3 性能影响

调试宏可能会对并发程序的性能产生显著影响,特别是在高负载和高并发的场景下。

二、并发编程中调试宏的高级应用

2.1 使用原子操作和锁

在并发编程中,使用原子操作和锁来保护共享资源是至关重要的。调试宏可以帮助我们跟踪这些操作的正确性。

pthread_mutex_t lock;
#define LOCK() \if (pthread_mutex_lock(&lock) != 0) { \fprintf(stderr, "Failed to acquire lock at %s:%d\n", __FILE__, __LINE__); \}
#define UNLOCK() \if (pthread_mutex_unlock(&lock) != 0) { \fprintf(stderr, "Failed to release lock at %s:%d\n", __FILE__, __LINE__); \}

2.2 使用日志和跟踪工具

在并发编程中,使用日志和跟踪工具可以帮助我们理解程序的并发行为。

#define LOG_CONCURRENT(msg, ...) \printf("[%ld] " msg "\n", pthread_self(), __VA_ARGS__)

2.3 使用断言和静态分析工具

断言和静态分析工具可以帮助我们在编译时和运行时检测并发错误。

#define ASSERT_CONCURRENT(condition) \if (!(condition)) { \fprintf(stderr, "Concurrent assertion failed: %s at %s:%d\n", #condition, __FILE__, __LINE__); \exit(EXIT_FAILURE); \}

三、并发编程调试技巧

3.1 使用线程池和任务队列

通过使用线程池和任务队列,可以简化并发编程的调试,因为这样可以减少线程创建和销毁的开销。

3.2 使用调试器和性能分析器

现代调试器和性能分析器提供了许多用于并发编程的调试功能,如线程视图、锁视图和性能分析。

3.3 使用模拟和测试框架

使用模拟和测试框架可以帮助我们在开发和测试阶段发现并发错误。

四、总结

在并发编程中,调试宏的应用需要特别注意同步问题、执行流程的跟踪和性能影响。通过使用原子操作和锁、日志和跟踪工具、断言和静态分析工具,以及调试器和性能分析器,可以有效地管理并发程序的调试过程。

记住,并发编程的调试是一个复杂的过程,但通过适当的策略和技巧,你可以更有效地使用调试宏,提高代码的质量和可靠性。继续探索和实验,让这些工具成为你编程技能的一部分!

 

相关文章:

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇&#xff1a;实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇&#xff1a;实用指南与案…...

unity万向锁代数法解释

unity的矩阵旋转乘法顺序是yxz 旋转x的90度的矩阵: 1 0 0 0 0 -1 0 1 0旋转y和z的矩阵假设角度为y和z&#xff0c;矩阵略不写了 按顺序乘完yxz之后结果是 cos(y-z) sin(y-z) 0 0 0 -1 -sin(y-z) cos(y-z) 0这个结果和Rx(pi/2) *Rz(某个角度)的结果是一个形式&#xff0c;Rx和…...

stm32入门学习10-I2C和陀螺仪模块

&#xff08;一&#xff09;I2C通信 &#xff08;1&#xff09;通信方式 I2C是一种同步半双工的通信方式&#xff0c;同步指的是通信双方时钟为一个时钟&#xff0c;半双工指的是在同一时间只能进行接收数据或发送数据&#xff0c;其有一条时钟线&#xff08;SCL&#xff09;…...

GDB常用指令

GDB调试&#xff1a;GDB调试的是可执行文件&#xff0c;在gcc编译时加入-g参数&#xff0c;告诉gcc在编译时加入调试信息&#xff0c;这样gdb才能调试这个被编译的文件。此外还会加上-Wall参数尽量显示所有警告信息。 GDB命令格式&#xff1a; 1、start&#xff1a;程序在第一…...

Nginx 高级 扩容与高效

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…...

pythonflaskMYSQL自驾游搜索系统32127-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1研究背景 1.2爬虫技术 1.3flask框架介绍 2 1.4论文结构与章节安排 3 2 自驾游搜索系统分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 6 2.3.2 非功…...

C++ vector的基本使用(待补全)

std::vector 是C标准模板库(STL)中的一个非常重要的容器类&#xff0c;它提供了一种动态数组的功能。能够存储相同类型的元素序列&#xff0c;并且可以自动管理存储空间的大小&#xff0c;以适应序列大小变化&#xff0c;处理元素集合的时候很灵活 1. vector的定义 构造函数声…...

Java 属性拷贝 三种实现方式

第一种 List<OrederPayCustomer> orederPayCustomerList this.list(queryWrapper); List<CustomerResp>customerRespListnew ArrayList<>();for (OrederPayCustomer orederPayCustomer : orederPayCustomerList) {CustomerResp customerResp new Custome…...

Java-变量,运算符,输入与输出

目录 一&#xff0c;语法基础 1.基本Java程序 2.语法基础 2.1 变量 2.2 常量限制(fiinal)类比C中的const 2.3 类型转化 2.4 运算符 2.5 表达式 2.5 输入与输出 2.5.1 输入 2.5.2 输出 一&#xff0c;语法基础 1.基本Java程序 public class Main{public static void…...

五、一个quad同时支持pcie和sfp两种高速接口的ref时钟配置

项目描述 上位机将截图数据通过 XDMA 写入到 FPGA 侧的 DDR 内存区域 1 中通过 axi_lite 接口给 axi_read_start 信号&#xff0c;通知 AXI_read 模块启动读取数据&#xff0c;然后通过 GTP TX 模块发送出去。经过光纤回环&#xff0c;GTP RX 端接收到数据&#xff0c;送给 AX…...

AI辅助教育:九章大模型的数学辅导功能解析

1.简介 九章大模型是学而思为学习研发的模型&#xff0c;该模型对于数学做了很多专门的训练&#xff0c;在题目推荐方面做得比较好。 同时&#xff0c;这个模型也能支持上传图片&#xff0c;对图片内容进行分析&#xff0c;然后针对内容进行校对&#xff0c;推荐相识题目。 支…...

力扣刷题之3128.直角三角形

题干描述 给你一个二维 boolean 矩阵 grid 。 请你返回使用 grid 中的 3 个元素可以构建的 直角三角形 数目&#xff0c;且满足 3 个元素值 都 为 1 。 注意&#xff1a; 如果 grid 中 3 个元素满足&#xff1a;一个元素与另一个元素在 同一行&#xff0c;同时与第三个元素…...

OD C卷 - 机场航班调度

机场航班调度&#xff08;100&#xff09; 航班组成&#xff1a;前两个大写字母代表航空公司缩写&#xff0c;后面4个数字代表航班信息&#xff1b;对输入的航班排序 首先按照航空公司缩写升序排序&#xff1b;同一航空公司的按照航班信息升序排序&#xff1b; 输入描述&…...

uni-app中使用支付宝扫码插件并且在真机调试时使用(详细教程)

前言&#xff1a;uni-app自带的扫码api 识别不灵敏&#xff0c;每次都得扫很长时间且不断调整才能扫出来码&#xff0c;所以决定使用支付宝扫码插件&#xff0c;官方插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id2636#detail 使用步骤: 1、下载插件到项目中 2、…...

每日学术速递8.5—1

1.SV4D: Dynamic 3D Content Generation with Multi-Frame and Multi-View Consistency 标题&#xff1a; SV4D&#xff1a;具有多帧和多视图一致性的动态 3D 内容生成 作者&#xff1a;Yiming Xie, Chun-Han Yao, Vikram Voleti, Huaizu Jiang, Varun Jampani 文章链接&…...

1、操作系统相关概念

1、操作系统是计算机上的第一层软件&#xff0c;用于管理计算机硬件设备&#xff0c;提高他们的利用率和通吐量&#xff0c;并为用户和应用程序提供一个接口。不同操作系统目标不同&#xff0c;查询设备的操作系统&#xff0c;侧重人机交互性&#xff1b;武器控制操作系统&…...

【ModelSim】仿真问题记录

1、波形出不全&#xff1a; 1、甚至连clk波形都出不来 2、个别波形只有到仿真结束的时候才出现 解决办法&#xff1a; 1、添加波形需要是实例中的net 2、排查是否存在声明与示例的位宽不一致的信号 3、观察是否存在未初始化的变量寄存器 4、缩短整个仿真的步长 2、Instance列…...

如何提高深度学习中数据运行的稳定性

在深度学习中&#xff0c;模型的训练通常会受到随机性因素的影响&#xff0c;如参数初始化、数据加载顺序等。这会导致每次训练得到的结果有所不同。要减少这种不稳定性&#xff0c;可以采取以下措施&#xff1a; 1.固定随机种子 通过设置随机种子&#xff0c;可以使得每次训…...

【连续数组】python刷题记录

R3-前缀和专题 绝对要用字典记录 ben神&#xff0c;前缀和字典 class Solution:def findMaxLength(self, nums: List[int]) -> int:#前缀和字典,key为差值&#xff0c;value为坐标dict{0:-1}#当前1和0的差值counter0ret0for i,num in enumerate(nums):#多1&#xff0b;1if…...

JavaScript青少年简明教程:DOM和CSS简介

JavaScript青少年简明教程&#xff1a;DOM和CSS简介 DOM简介 DOM&#xff08;Document Object Model&#xff09;将文档表示为一个树形结构&#xff0c;其中每个节点都是一个对象&#xff0c;每个对象都有其自身的属性和方法。 通过对DOM的操作&#xff0c;开发者可以使用编…...

架构师知识梳理(一):计算机硬件

目录 计算机硬件组成 CPU CPU的组成 CPU的功能 校验码 奇偶校验 CRC CRC计算案例 指令 指令指行过程 指令系统 指令系统分类 指令流水线技术 流水线技术相关计算公式 存储 计算机存储系统设计 高速缓存Cache 缓存的局部性原理 地址映射 替换算法 关于命中…...

从根儿上学习spring 四 之run方法启动第一段

图1 由上图我们可以看到&#xff0c;我把run方法分成了5个小段&#xff0c;每小段使用红框圈了起来&#xff0c;这一篇我们先开始讲第一段。大家需要关注下行号&#xff0c;我讲的时候可能会使用行号对应具体某行代码。 图1-289-290行&#xff1a; 没啥好说的定义了两个变量&…...

智能闹钟如何判断用户已经醒了?

智能闹钟判断用户是否已经醒来的方式主要依赖于其内置的传感器和算法系统。以下是一些常见的判断方法&#xff1a; 一、传感器监测 体动传感器&#xff1a;智能闹钟通常配备有体动传感器&#xff0c;用于监测用户的身体运动。当用户从睡眠状态转变为清醒状态&#xff0c;并开始…...

【算法】动态规划解决背包问题

应用场景——01背包问题 有一个背包&#xff0c;背包的容量为 4&#xff0c;现有如下物品 要求 1.目标为装入背包的总价值最大&#xff0c;并且重量不超出 2.要求装入的物品不能重复 动态规划算法介绍 1.动态规划算法的核心是&#xff1a;将大问题划分为小问题进行解决&…...

day09 工作日报表

日期 30日07月2024年 任务安排 今天主要就是讲了security类工作的原理&#xff0c;然后就是让我们自己做项目 工作中的问题 今天做项目的时候发现有时候用postman测试返回20001&#xff0c;说错误见控制台&#xff0c;但是控制台一片祥和&#xff0c;于是就尝试用tr…...

C++学习之路(1)— 第一个HelloWorld程序

C学习之路&#xff08;1&#xff09;— 第一个HelloWorld程序 一、前言 C在C语言的基础上添加了对面向对象编程和泛型编程的支持&#xff0c;在 20世纪90年代便是最重要的编程语言之一&#xff0c;并在21世纪仍保持强劲势头。C继承了C语言高效、简洁、快速和可移植性的传统。 …...

python3 pyside6图形库学习笔记及实践(三)

目录 前言菜单栏相关控件使用QtDesigner快速构建菜单栏结构语法 上下文菜单概念为窗体添加上下文菜单为控件添加上下文菜单 折叠菜单资源的加载内置图标Rcc的使用创建资源文件加载资源文件 前言 本系列文章为b站PySide6教程以及官方文档的学习笔记 原视频传送门&#xff1a;【…...

03 库的操作

目录 创建查看修改删除备份和恢复查看连接情况 1. 创建 语法 CRATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] create_specification:  CHARACTER SET charset_name  CPLLATE collation_name 说明&#xff1a; 大写的标识关键…...

嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)

树莓派性能非常强悍&#xff0c;但是对于某些复杂的项目来说&#xff0c;会出现心有余而口不足的情况&#xff0c;为了解决这类问题&#xff0c;可以在树莓派上使用扩展板&#xff0c;我们介绍几款常见的扩展板&#xff0c;不仅可以扩展到树莓派&#xff0c;其他单片机或嵌入式…...

linux通过抓包工具tcpdump查看80端口访问量情况

方法&#xff1a; tcpdump -i ens32 -tn dst port 80 -c 10 | awk -F"." {print $1"."$2"."$3"."$4} | sort | uniq -c | sort -nr |head -n 10 #-i&#xff1a;指定端口 #-t&#xff1a;在输出的每一行不打印时间戳 #-n&#xff…...