当前位置: 首页 > 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;实用指南与案…...

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

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

Ionic 滑动框:实现高效移动应用交互体验

Ionic 滑动框:实现高效移动应用交互体验 Ionic 是一个强大的开源框架,用于构建高性能、高质量的移动端和网页应用。它以其优雅的UI组件和强大的功能而闻名,其中滑动框(Slider)是Ionic UI组件库中的一个重要组成部分。滑动框提供了一种直观、互动的方式来展示图片、文本或…...

书生大模型实战营第三期——入门岛

第一关&#xff1a;Linux基础知识 任务如下&#xff1a; 任务描述闯关任务完成SSH连接与端口映射并运行hello_world.py可选任务 1将Linux基础命令在开发机上完成一遍可选任务 2使用 VSCODE 远程连接开发机并创建一个conda环境可选任务 3创建并运行test.sh文件 1. 使用密码进行…...

Android入门之路 - WebView加载数据的几种方式

之前客户端加载H5时遇到了一些问题&#xff0c;我为了方便解决问题&#xff0c;所以将对应场景复刻到了Demo中&#xff0c;从之前的网络加载模拟为了本地加载Html的方式&#xff0c;但是没想到无意被一个基础知识点卡了一些时间&#xff0c;翻看往昔笔记发现未曾记录这种基础场…...

git的rebase 和 merge 的区别

rebase 和 merge 的区别 Merge&#xff08;合并&#xff09;和 Rebase&#xff08;变基&#xff09;是 Git 中两种常用的分支整合方式&#xff0c;它们有不同的工作原理和适用场景&#xff1a; Merge&#xff08;合并&#xff09;&#xff1a; ● Merge 操作将两个分支的不同提…...

科普文:JUC系列之Java中7种阻塞队列BlockingQueue的双锁源码解读

概叙 Queue接口与List、Set同一级别&#xff0c;都是继承了Collection接口**。队列是一种数据结构&#xff0e;它有两个基本操作&#xff1a;在队列尾部加人一个元素&#xff0c;和从队列头部移除一个元素&#xff0c;队列以一种先进先出的方式管理数据。 队列分为两种&#x…...

Kafka生产者(二)

1、生产者消息发送流程 1.1 发送原理 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c;Sender 线程不断从 RecordAccumulator 中拉取…...

ReentrantLock源码分析

文章目录 一、AQS1、state属性2、等待队列3、条件变量 二、ReentrantLock1、非公平锁实现原理1.1 获取锁1.2 释放锁1.3 可重入原理1.4 可打断原理不可打断可打断 1.5 公平锁实现原理1.6 条件变量原理awaitsignal 一、AQS AQS全称是 AbstractQueuedSynchronizer&#xff0c;是阻…...

(四十一)大数据实战——spark的yarn模式生产环境部署

前言 Spark 是一个开源的分布式计算系统。它提供了高效的数据处理能力&#xff0c;支持复杂的数据分析和处理任务&#xff0c;是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。Spark Core&#xff1a;实现了Spark的基本功能&#xff0c;包含任务调度、内存管理、错误…...

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…...

Spring Boot 整合 Dubbo3 + Nacos 2.4.0

准备工作&#xff1a;Nacos 一、前置工作 安装Nacos&#xff0c;参考&#xff1a;Nacos 快速开始 此次安装 Nacos 最新版本&#xff1a;2.4.0 单机版 安装教程&#xff1a;Linux 安装 nacos 2.4.0-CSDN博客 二、创建配置文件 创建命名空间 新增配置文件 dubbo:application:i…...

力扣-200.岛屿数量

刷力扣热题–第二十四天:200.岛屿数量 新手第二十四天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目描述 2.题目解答 这道题刚开始想的确实想的绞尽脑汁的&#xff0c;看了相关解答才明白的&#xff0c;三种方法&#xff0c;这里想先用两种方法进行实现&#…...

学习 MediaPipe 手部检测和手势识别

学习 MediaPipe 手部检测和手势识别 1 手部检测1.0 Demo1.1 mediapipe.solutions.hands.Hands1.1.1 Hands 初始化1.1.2 process 检测 1 手部检测 1.0 Demo import time import cv2 import mediapipe as mpmpHands mp.solutions.hands hands mpHands.Hands(model_complexity…...

TypeScript 接口

TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。即如果一个东西走起来像鸭子、叫起来像鸭子&#xff0c;那它就是鸭子。 通过定义接口&#xff0c;为特定的结构赋予了一个明确的名称和规范。 在 TypeScript 中&a…...

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--添加商品功能

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 前文三篇登录和注册功能的实现 基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网&#xff08;1&#xff09;-项目搭建&#xff08;前期准备工作…...

自定义SQL Server数据访问层:打造专属数据交互之门

自定义SQL Server数据访问层&#xff1a;打造专属数据交互之门 在软件开发中&#xff0c;数据访问层&#xff08;Data Access Layer, DAL&#xff09;扮演着至关重要的角色&#xff0c;它作为应用程序与数据库之间的桥梁&#xff0c;负责所有的数据存取操作。SQL Server作为一…...

【课程总结】Day15(中):图像分割之实例分割

前言 在上一章&#xff0c;我们通过学习了解了语义分割以及U-Net网络结构【课程总结】Day15&#xff08;上&#xff09;&#xff1a;图像分割之语义分割。在本章&#xff0c;我们将学习了解图像分割中的实例分割以及相关的数据预处理注意事项。 图像分割 语义分割 语义分割…...

【Linux】常见指令

目录 一、指令的理解二、Linux的目录结构三、XShell 下的热键三、shell命令以及运行原理四、Linux常见的指令汇总1. ls 指令1.1 常见的一些有关 ls 的别名1.2 隐藏文件或目录1.3 * 的匹配 2. pwd 指令3. cd 指令3.1 cd . . 指令 4. touch指令5. mkdir指令6. rmdir指令 &&am…...

redis学习(一)

背景 redis是一个高性能的KV数据库&#xff0c;在工作中经常用到&#xff0c;可被用作缓存、分布式锁等&#xff0c;作为被高频使用的组件&#xff0c;了解其实现对工作有很大帮助&#xff08;包括面试&#xff09;。为此&#xff0c;在对redis有一定的使用、了解之后&#xff…...

LabVIEW在DCS中的优势

DCS&#xff08;Distributed Control System&#xff0c;分布式控制系统&#xff09;是一种用于工业过程控制的自动化系统。它将控制任务分散到多个控制单元中&#xff0c;通过网络连接和协调这些单元来实现对整个过程的监控和控制。DCS通常用于大型工业设施&#xff0c;如化工…...

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

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

后端面试题日常练-day15 【Java基础】

题目 希望这些选择题能够帮助您进行后端面试的准备&#xff0c;答案在文末 Java中的自动装箱&#xff08;Autoboxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;是指什么&#xff1f; a) 自动装箱是将基本数据类型转换为对应的包装类&#xff0c;拆箱是将包装类转换为…...

椭圆曲线加法运算

1. 定义 椭圆曲线 (Elliptic Curve) 不是函数&#xff0c;而是一条平面曲线&#xff0c;其方程是定义如下&#xff1a; y 2 x 3 a x b y^2x^3axb y2x3axb 其中&#xff0c;判别式 Δ − 16 ( 4 a 3 27 b 2 ) ≠ 0 \Delta -16(4a^327b^2)\neq 0 Δ−16(4a327b2)0。判别…...

采用计数排序的思想,解决只出现一次的数字

目录 问题 思路 代码 注意点&#xff1a; 问题 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常…...

网络云相册实现--nodejs后端+vue3前端

目录 主页面 功能简介 系统简介 api 数据库表结构 代码目录 运行命令 主要代码 server apis.js encry.js mysql.js upload.js client3 index.js 完整代码 主页面 功能简介 多用户系统&#xff0c;用户可以在系统中注册、登录及管理自己的账号、相册及照片。 每…...

程序设计基础(c语言)_补充_1

1、编程应用双层循环输出九九乘法表 #include <stdio.h> #include <stdlib.h> int main() {int i,j;for(i1;i<9;i){for(j1;j<i;j)if(ji)printf("%d*%d%d",j,i,j*i);elseprintf("%d*%d%-2d ",j,i,j*i);printf("\n");}return 0…...

【Unity】 HTFramework框架(五十四)【进阶篇】Deployment 轻量级资源部署管线

更新日期&#xff1a;2024年7月31日。 Github源码&#xff1a;[点我获取源码] 索引 Deployment 轻量级资源部署管线使用 Deployment一、创建部署配置二、编辑部署配置三、正式开始资源部署步骤一&#xff1a;资源打包步骤二&#xff1a;资源版本构建步骤三&#xff1a;资源版本…...

达梦数据库的系统视图v$cachesql

达梦数据库&#xff08;DM Database&#xff09;的系统视图V$CACHESQL用于显示有关数据库中缓存的SQL语句的信息。该视图提供了有关每个SQL语句的执行统计信息&#xff0c;帮助用户优化SQL性能和调试问题。 V$CACHESQL视图的主要字段 以下是V$CACHESQL视图中的一些关键字段&a…...

java基础 之 equals和==的区别

文章目录 浅谈“”特点比较基本类型比较引用类型 浅谈“equals”背景和使用重写equals自定义类为什么需要重写equals方法 总结附录代码及文章推荐 前言&#xff1a; 1、8大基本数据类型&#xff0c;它们的值直接代表了某种数据&#xff0c;不是对象的实例&#xff0c;不能使用n…...

学习STM32(1)--Keil软件安装与基本操作和Keil 软件高级应用

目录 1 引 言 2 实验目的 3 实验内容 3.1 认识单片机和STM32 3.2 安装、认识软件Keil和硬件STM32F103开发板 3.3 学习调试工程 3.4 Keil工程软件的配置 4 深入解析 思考一 1.以项目“12-GPIO输出—使用固件库点亮LED”为例子&#xff0c;认识本地工程文件夹&#xf…...

独立开发者系列(37)——理解async和await

1.理解同步与异步 同步就是执行某个任务A-B-C-D&#xff0c;就是严格按照顺序执行&#xff0c;可以理解为正常的代码逻辑&#xff0c;如果运行的代码都不是很消耗时间的情况系啊&#xff0c;同步可以减少编程的复杂度。但是对于请求远程服务结果的这种服务&#xff0c;如果同步…...

在C#中为图片添加数字水印的几种办法

最近在写个人项目时&#xff0c;有遇到需要将图片加上水印防止被盗取的需求。这里找了几种实现方式&#xff0c;可供有需要的朋友参考。 本身我不是搞算法这块的&#xff0c;所以这里只是找了一些实现&#xff0c;也没有继续深究下去。 以前在学校的时候从书上了解过可以将一…...

Vue的学习(二)

目录 一、class及style的绑定 1.v-bind:class绑定类名 绑定class为对象 ​编辑2. v-bind:class绑定类名 绑定class为对象 3.v-bind:class绑定类名 绑定class为数组 1) v-bind:class绑定类名 绑定class为数组 方法一&#xff1a; 2) v-bind:class绑定类名 绑定class为数组…...

PointNet和PointNet++论文解读

目录 一、导言 二、PointNet介绍 三、PointNet网络结构 1、损失函数 2、正则化 四、PointNet 1、分层次的点集抽象层 一、导言 PointNet来自CVPR2017&#xff0c;是最早直接处理点云数据用于计算机视觉的模型&#xff0c;并运用于分割、检测、场景理解任务&#xff0c;P…...

Pytest测试报告生成专题

在 pytest 中,你可以使用多个选项生成不同格式的测试报告。以下是几种常用的生成测试报告的方法: 1. 生成简单的测试结果文件 你可以使用 pytest 的 --junitxml 选项生成一个 XML 格式的测试报告,这个报告可以与 CI/CD 工具集成。 pytest --junitxml=report.xml这将在当前…...

【在Python中读取Excel文件内容】

在Python中读取Excel文件内容&#xff0c;常用的库有xlrd&#xff08;主要用于读取.xls文件&#xff0c;但不支持.xlsx的较新版本&#xff09;&#xff0c;以及openpyxl&#xff08;专门用于读取和写入.xlsx文件&#xff09;和pandas&#xff08;提供了一个更高级别的接口来处理…...

尚品汇-首页三级分类实现-nginx静态代理生成的静态页面(二十六)

目录&#xff1a; &#xff08;1&#xff09;问题详解 &#xff08;2&#xff09;首页商品分类实现 &#xff08;3&#xff09;修改web-all模块 &#xff08;4&#xff09;页面渲染 &#xff08;1&#xff09;问题详解 &#xff08;2&#xff09;首页商品分类实现 前面做了…...

HTML 段落

HTML 段落 概述 HTML&#xff08;超文本标记语言&#xff09;是构建网页的标准语言&#xff0c;而段落是构成网页内容的基本单元。在HTML中&#xff0c;段落是通过<p>标签来定义的。本文将详细介绍HTML段落的相关知识&#xff0c;包括段落的基本结构、样式设置、以及在…...

Http自定义Header导致的跨域问题

最近写一个小项目&#xff0c;前后端分离&#xff0c;在调试过程中访问远程接口&#xff0c;出现了CORS问题&#xff0c;接口使用的laravel框架&#xff0c;于是添加了解决跨域的中间件&#xff0c;但是前端显示仍存在跨域问题&#xff0c;以为自己写的有问题&#xff0c;检查了…...

20240805 每日AI必读资讯

世界首例&#xff01;AI机器人做牙科手术&#xff0c;8倍速诊疗比人类医生更精准 - Perceptive&#xff1a;让人工智能控制的自主机器人&#xff0c;首次对人类患者进行了全过程的牙科手术&#xff0c;速度大约是人类牙医的8倍。 - 两项新技术 1、OCT 3D成像系统&#xff1a;…...

COMSOL金属氢化物-放氢过程

在此记录下放氢过程的软件设置思路 1、采用的是"达西定律""层流" 物理场&#xff0c;其中"层流"物理场选择了”弱可压缩流动“&#xff0c;这里主要是选择”可压缩流动“的话&#xff0c;算出来的瞬时流量值跟实测差距太大了。 2、设置"达西…...

Unity2D在处理精灵表过程中出现不清晰的解决方法

问题阐述 在我们拿到一张精灵表的时候&#xff0c;我们通常要进行切割。但这样往往导致切割的效果不是很好&#xff0c;这里举一个简单的例子。 这是举例子用到的精灵表 我们先对他进行切割处理。 将single改为Multiope 进入精灵编辑器后&#xff0c;我们选择切割方式 此时我…...

C语言第13篇

1.下面程序是计算n个数的平均值,请填空.______ #include<stdio.h> void main( ) { int i,n; float x,avg0.0; scanf("%d",&n); for(i0;i<n;i) { scanf("%f",&x); avgavg______; } avg________; printf("avg%f\n",avg); } A) …...

Meta Reality Labs:巨额亏损背后的挑战与展望

一、财务概况 自2020年以来,Meta的Reality Labs部门累计亏损已超过450亿美元,其中2023年的亏损达到160亿美元,2024年第一季度亏损38亿美元,分析师预计第二季度亏损可能接近50亿美元。尽管投入巨大,Reality Labs的收入却呈现下降趋势,与不断增加的支出形成鲜明对比。 二…...

linux安装docker(实操教程)

一、安装前准备工作 1.查看服务器操作系统版本 2.查看服务器的操作系统内核版本 3.安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2如果不是root用户登陆的系统&#xff0c;需要手动输入sudo -i切换到root帐户 4.设置阿里云docker-ce镜像源 yum-c…...

隐写工具steghide linux编译安装

1、git clone https://github.com/StefanoDeVuono/steghide.git 2、autoreconf -i 3、./configure 4、make 编译完成后再src目录下又steghide执行下程序 报错&#xff1a;configure: error: cannot find required auxiliary files: compile时需要执行autoreconf 如果往j…...

山寨手机 老手机 山寨平板 提高速度 cpu超频的方法360超级root和setup

第一&#xff0c;挂机 &#xff0c;按音量键 &#xff0c;看机器的配置&#xff0c;注意&#xff0c;山寨机器的 安卓版本不可信啊&#xff0c;安卓4.4.2会标注安卓10 第二 &#xff0c;下载360超级root, http://2012rs.mysxl.cn/ https://xdaforums.com/t/setcpu-for-root-us…...

【两整数之和】python刷题记录

R3-位运算专题。 仲夏之约&#xff0c;留尺一寸&#xff0c;小记一事&#xff0c;算是了结。 无进位和 与 异或运算 规律相同&#xff0c;进位 和 与运算 规律相同&#xff08;并需左移一位&#xff09; 牛啊牛啊 class Solution:def getSum(self, a: int, b: int) -> int…...

常见cms漏洞之dedecms

DedeCMS是织梦团队开发PHP 网站管理系统&#xff0c;它以简单、易用、高效为特色&#xff0c;组建出各种各样各具特色的网站&#xff0c;如地方门户、行业门户、政府及企事业站点等。 下载地址请网上自行寻找 搭建方式选择php study 首先搭建环境 #前台http://localhost/dedecm…...