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

C语言基础20

内容提要

  • 预处理

  • 库文件

预处理

C语言编译步骤

  1. 预处理

  2. 编译

  3. 汇编

  4. 链接

什么是预处理

预处理就是在源文件(.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理程序自动完成。当源文件在编译时,编译器会自动调用预处理程序来完成预处理执行的操作,预处理执行解析完成才能进入下一步的编译过程

查看预处理结果:

 gcc 源文件 -E -o 程序名[.后缀]

预处理功能

宏定义(可以使用宏定义完成无符号常量的创建)
  • 不带参数的定义

    • 语法:

       #define 宏名称 常量数据
    • 预处理机制:此时的预处理只做数据替换,不做类型检查

    • 注意:宏定义不会占用内存空间,因为在编译前已经将宏名替换成了常量数据

    • 宏展开:在预编译时将宏名替换成字符串的过程称之为“宏展开”(将宏名替换成常量数据的过程)

    • 案例:

       #define PI 3.1415926​int main(){float l,s,r,v;printf("请输入圆的半径:\n");scanf("%f",&r);// 计算周长l = 2.0 * PI * r;// 计算面积s = PI * r * r;printf("l=%10.4f\ns=%10.4f\n",l,s);return 0;}
  • 带参数的宏定义

    • 语法:

       #define 宏名(参数列表) 参数表达式
    • 面试题:

       #define multi(a,b) (a) * (b)#define multi(a,b) a * b

      实现:

       // 定义一个带参数的宏,带参数的宏名为小写#define multi_1(a,b) (a) * (b)#define multi_2(a,b) a * b​int main(){int result1 = multi_1(7+2,3); // (a)*(b) = (7+2)*3 = 27printf("%d\n",result1); // 27int result2 = multi_2(7+2,3); // a * b = 7+2 * 3 = 13printf("%d\n",result2); // 13return 0;}
  • 宏定义的作用域:

    • #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束

    • 可以用#undef命令终止宏定义的作用域

    • 案例:

       #define PI 3.14  // PI的作用域 10行 ~ 18行#define DAY 28   // DAY的作用域 11行 ~ 文件末尾​void func1(){float r = 4;float s = PI * r * r;int day = DAY;}#undef PI // 终止了PI的范围​#define PI 3.1415926​void func2(){float r = 4;float s = PI * r * r;int day = DAY;}​int main(int argc, char *argv[]){func1();func2();return 0;}
  • 在宏定义中引用已定义的宏名

    • 案例:

       #define R 3.0       // 半径#define PI 3.14  #define L 2 * PI * R   // 在宏定义中引用已定义的宏名#define S PI * R * R​#define P_WIDTH 800#define P_HEIGHT 480#define SIZE P_WIDTH * P_HEIGHT​int main(int argc, char *argv[]){printf("L=%f\nS=%f\n",L,S);return 0;}
文件包含

概念

所谓“文件包含”处理是指一个源文件可以将另一个源文件的全部内容包含进来。这适用于多文件开发。通常,一个常规的C语言程序会包含多个源码文件(*.c),当某些公共资源需要在各个源码文件中使用时,为了避免多次编写相同的代码,我们一般会进行代码的抽取(*.h),然后在各个源码文件中直接包含即可

注意:*.h中的函数声明必须要在*.c中有对应的函数定义(函数的实现),否则没有意义。(函数一旦声明,就一定要定义)

头文件(.h)的内容

头文件中所存放的内容,就是各个源码文件的彼此可见的公共资源,包括:

  • 全局变量的声明

  • 普通函数的声明

  • 静态函数的定义

  • 宏定义

  • 结构体、共用体的定义

  • 枚举常量列表的定义

  • 其他头文件包含

示例代码:

 // head.h​extern int global;    // 全局变量的声明extern void func1();  // 普通函数的声明static void func2();  // 静态函数的声明,写在.h中,引用此文件的.c文件直接调用;写在.c,只能这个.c文件访问{...}#define max(a,b) ((a)>(b)?(a):(b)) // 宏定义​struct node          // 结构体定义{...};​union attr           // 共用体定义{...};​enum SEX             // 枚举常量列表定义{...};​#include <stdio.h>   // 系统头文件#include "myhead.h"  // 自定义头文件

特别说明:

  1. 全局变量、普通函数的定义一般出现在某个源文件(*.c,*.cpp)中,其他源文件想要使用都需要进行声明,因此一般放在头文件中更方便

  2. 静态函数、宏定义、结构体、联合体的定义都只能在其所在的文件可见,因此如果多个源文件都需要的话,放到头文件中定义是最方便的选择

预处理机制:将文件中的内容替换文件包含指令

包含方式
  1. #include <xxxx.h>:系统会到标准库文件目录(Linux下/usr/include)查找包含的文件,建议对于系统库访问采用这种写法

  2. #include "xxxx.h":在当前工程路径下(Linux下./)查找包含的文件,如果未找到,就去标准库文件目录下查找。建议对于自定义库采用这种写法

案例

myhead.h

 #ifndef _MYHEAD_H#define _MYHEAD_H​/*** 数组的累加和运算* @param int* int数组* @param int 数组大小*/extern int sum(const int*, int)#endif // _MYHEAD_H

myhead.c

 #include <stdio.h>#include "myhead.h"​/*** 数组的累加和运算(定义)*/int sum(const int *arr, int len){const int *p = arr;int sum = 0;for(; p < arr + len; p++){sum += *p;}return sum;}

app.c

 #include <stdio.h>#include "myhead.h"​int main(int argc, char *argv[]){int arr[] = {11,12,13,14,15};int result = sum(arr,sizeof(arr)/sizeof(arr[0]));printf("数组累加和的结果是:%d\n",result);return 0;}

多文件编译命令:

 gcc app.c myhead.c -o app
条件编译

定义:根据设定的条件选择待编译的语句代码

预处理机制:将满足条件的语句进行保留,将不满足条件的语句进行删除,交给下一步编译

语法:

  • 语法一:

    根据是否找到标识,来决定是否参与编译(标识存在为真)

     #ifdef 标识   // 判断标识符定义与否,定义为真,未定义为假(找到标识符为真①,找不到为假②)... ①#else... ②#endif
  • 语法二:

    根据是否找到标识,来决定是否参与编译(标识不存在为真)

     #ifndef 标识   // 判断标识符定义与否,未定义为真,定义为假(找不到标识符为真①,找不到为假②)... ①#else... ②#endif
  • 语法三:

    根据表达式的结果,来决定是否参与编译(表达式成立为真1,不成立为假0)

     #if 表达式   // 判断表达式结果,成立为1,不成立为0... ①#else... ②#endif

案例:

 #include <stdio.h>​#define LETTER 0 // 默认是大写​int main(int argc,char *argv[]){// 测试用的字母字符串char str[20] = "C Language";char c;int i = 0;// 遍历获取每一个字符while((c = str[i])!='\0'){#if LETTERif(c >= 'a' && c <= 'z'){c -= 32;}#elseif(c >= 'A' && c <= 'Z'){c += 32;}#endifprintf("%c",c);i++;}printf("\n");return 0;}

避免头文件重复包含的方法

其实就是头文件去重复

由于头文件包含指令#include的本质是复制粘贴,并且一个头文件中可以嵌套包含其他头文件,因此很容易出现头文件被重复包含的文件。此时就需要我们进行去重,去重需要用到预处理提供的去重相关的指令

语法:

 #ifndef _XXXX_H  // 一般为 下划线+头文件名大写+下划线+H#define _XXXX_H..#endif

案例:

 #ifndef _MYHEAD_H#define _MYHEAD_H​/*** 数组的累加和运算* @param int* int数组* @param int 数组大小*/extern int sum(const int*, int);#endif // _MYHEAD_H

库文件

什么是库文件

库文件本质上是经过编译后生成的可被计算机执行的二进制代码,但注意库文件不能独立运行,库文件需要加载到内存中才能执行。库文件大量存在于Windows、Linux、MacOS等软件平台上

库文件的分类

  • 静态库

    • Windows:xxx.lib

    • Linux:libxxxx.a

  • 动态库(共享库)

    • Windows:xxx.dll

    • Linux:libxxxx.so.major.minor

注意:不同的软件平台因为编译器、链接器不同,所生成的库文件是不兼容的

静态库与动态库的区别
  1. 静态库链接时,将库中所有内容包含到最终的可执行程序中

  2. 动态库链接时,将库中的符号信息包含到最终可执行程序中,在程序运行时,才将动态库中符号的具体实现加载到内存中

静态库与动态库的优缺点
  1. 静态库

    • 优点:生成的可执行程序不再依赖静态库文件

    • 缺点:可执行程序体积较大

  2. 动态库

    • 优点:生成的可执行程序体积小;动态库可被多个语言程序共享

    • 缺点:可执行程序运行依赖动态库文件

库文件的创建

Linux系统下库文件命名规范:libxxxx.a(静态库)libxxxx.so(动态库)

静态库文件的生成
  1. 将需要生成库文件对应的源文件(*.c)通过编译(不链接)生成(*.o)目标文件

  2. ar命令将生成的*.o打包生成libxxxx.a

库的生成:

库的使用:

动态库文件的生成
  1. 利用源文件(*.c)通过编译(不链接)生成*.o目标文件

  2. 将目标文件链接为*.so文件

库的生成:

库的使用:

注意:如果在代码编译过程或者运行中链接了库文件,系统会到/lib和/usr/lib目录下查找库文件,所以建议直接将库文件放置在/lib或者/usr/lib,否则系统可能无法找到库文件,造成编译或者运行错误

扩展
  1. 查看应用程序(例:app)依赖的动态库

  2. 动态库使用方式:

    • 编译时链接动态库,运行时系统自动加载动态库

    • 程序运行时,手动加载动态库

    • 实现:

      • 涉及内容:

        • 头文件:#include <dlfcn.h>

        • 接口函数:dlopendlclosedlsym

        • 依赖库:-ldl

        • 句柄handler:资源的标识

      • 示例代码:

         #include <stdio.h>#include <dlfcn.h>​int main(int argc,char *argv[]){// 1. 加载动态库 "/lib/libdlfun.so"//    - RTLD_LAZY: 延迟绑定(使用时才解析符号,提高加载速度)//    - 返回 handler 是动态库的句柄,失败时返回 NULLvoid* handler = dlopen("/lib/libdlfun.so", RTLD_LAZY);if (handler == NULL){// 打印错误信息(dlerror() 返回最后一次 dl 相关错误的字符串)fprintf(stderr, "dlopen 失败: %s\n", dlerror());return -1;}// 2. 从动态库中查找符号 "sum"(函数名)//    - dlsym 返回 void*,需强制转换为函数指针类型 int sum(int *arr, int size);//    - 这里假设 "sum" 是一个接受两个int*,int参数、返回 int 的函数int (*paddr)(int*, int) = (int (*)(int*, int))dlsym(handler, "sum");if (paddr == NULL){fprintf(stderr, "dlsym 失败: %s\n", dlerror());dlclose(handler); // 关闭动态库(释放资源)return -1;}​// 3. 调用动态库中的函数 "sum",计算{11,12,13,14,15}的累加和int arr[5] = {11,12,13,14,15};printf("sum=%d\n", paddr(arr, sizeof(arr)/sizeof(arr[0])));// 4. 关闭动态库(释放内存和资源)dlclose(handler);return 0;}
      • 编译命令

         gcc demo06.c -ldl

相关文章:

C语言基础20

内容提要 预处理 库文件 预处理 C语言编译步骤 预处理 编译 汇编 链接 什么是预处理 预处理就是在源文件&#xff08;.c文件&#xff09;编译之前&#xff0c;所进行的一部分预备操作&#xff0c;这部分操作是由预处理程序自动完成。当源文件在编译时&#xff0c;编译…...

conda常用命令

要查看使用conda创建的虚拟环境&#xff0c;可以按照以下步骤操作&#xff1a; 打开终端或命令行工具&#xff1a;确保你已经打开了终端或命令行界面&#xff0c;以便输入conda命令。 输入命令查看环境列表&#xff1a; 使用以下任一命令查看conda创建的虚拟环境&#xff1a…...

Ubunut18.04 离线安装MySQL 5.7.35

一、环境准备 1.1 官方下载MySQL5.7.35 完整包 1.2 上传包 & 解压 上传包名称是&#xff1a;mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL # 解压&#xff1a; tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…...

地图与图层操作

地图文档本质上就是存储在磁盘上的地图&#xff0c;包括地理数据、图名、图例等一系列要素&#xff0c;当完成地图制作、图层要素标注及符号显示设置后&#xff0c;可以将其作为图层文件保存到磁盘中&#xff0c;在一个图层文件中&#xff0c;包括了定义如何在地图上描述地理数…...

红宝书第三十一讲:通俗易懂的包管理器指南:npm 与 Yarn

红宝书第三十一讲&#xff1a;通俗易懂的包管理器指南&#xff1a;npm 与 Yarn 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、基础概念 包管理器&#xff1a;帮你自动下载和管理第三方代码库&#xff08;如…...

李建忠:智能体正将互联网从信息网络重构为行动网络

引言 模型正在从训练为主转换为推理为主的新范式&#xff0c;智能体正将互联网从信息网络重构为行动网络&#xff0c;我们正处在从人类使用互联网到 AI 代理使用互联网的转折点。这不是未来&#xff0c;而是此刻已经发生的颠覆。 3 月 22 日&#xff0c;在腾讯云架构师技术同…...

瑞芯微AI处理器详解

瑞芯微&#xff08;Rockchip&#xff09;的芯片产品线覆盖从低功耗MCU到高性能AIoT处理器&#xff0c;以下是其主流芯片系列及RK3568的市场定位分析&#xff1a; 一、瑞芯微主要芯片系列 旗舰级 RK3588&#xff1a;12nm工艺&#xff0c;4A764A55&#xff0c;6TOPS NPU&#xff…...

Compose Multiplatform+Kotlin Multiplatfrom 第五弹跨平台

截图功能 Compose MultiplatformKotlin Multiplatfrom下实现桌面端的截图功能&#xff0c;起码搞了两星期&#xff0c;最后终于做出来了&#xff0c;操作都很流畅&#xff0c;截取的文件大小也正常&#xff0c;可参考支持讨论&#xff01; 功能效果 代码实现 //在jvmMain下创…...

linux安装ollama

俩种方式都可 一、linux通过docker安装ollama镜像 1.下载安装ollama镜像 # 安装 Docker sudo yum install docker sudo systemctl start docker#docker查看所有容器 docker ps -a # 查看所有容器# docker查看指定容器 docker ps -a |grep ollama# 创建模型存储目录&#xff…...

113. 在 Vue 3 中使用 OpenLayers 实现鼠标移动显示坐标信息

✨ 写在前面 在地图类项目开发中&#xff0c;一个常见需求就是&#xff1a;实时获取用户鼠标在地图上的经纬度坐标&#xff0c;并展示在地图上。 本文将通过一个简单的案例&#xff0c;手把手带大家在 Vue 3 项目中集成 OpenLayers 地图库&#xff0c;并实现以下功能&#xf…...

跳跃游戏的最优解法——贪心算法的智慧与实践

跳跃游戏的最优解法——贪心算法的智慧与实践 跳跃游戏是一类经典的算法题&#xff0c;既有趣又充满挑战&#xff0c;不仅能锻炼思维能力&#xff0c;还能直观展现贪心算法的核心思想。今天&#xff0c;我们从题目入手&#xff0c;拆解贪心算法的原理&#xff0c;用通俗易懂的…...

搭建docker registry私服,并且支持https推送

搭建docker registry私服&#xff0c;并且支持https推送 一、为什么写这篇文章二、搭建过程三、验证 一、为什么写这篇文章 网上关于搭建docker registry的文章一大把&#xff0c;但是都是配置为http方式推送&#xff0c;且需要显示端口&#xff0c;这个在真正项目使用中&…...

UniApp Vue 3 中的网络请求封装及用法

在UniApp中&#xff0c;结合Vue 3的强大特性&#xff0c;进行网络请求的封装是项目中常见的需求。这样的封装不仅提高了代码的可维护性&#xff0c;还使得在组件中使用网络请求更加简洁。本文将详细介绍UniApp Vue 3中的网络请求封装&#xff0c;并提供一个简单的用法示例。 创…...

策略模式结合模板方法模式

之前学习了策略模式加模板方法模式 策略模式单独详解 模板方法模式单独详解 这里回忆起完全可以进行策略和模板方法模式的组合。 import java.util.HashMap; import java.util.Map;// 上下文对象&#xff08;解决参数传递问题&#xff09; class OrderContext {private final…...

每日算法-250407

记录一下今天刷的三道 LeetCode 题目。 2389. 和有限的最长子序列 题目 思路 排序 前缀和 二分查找 解题过程 理解题意: 题目要求我们对于 queries 数组中的每个查询值 q&#xff0c;找出 nums 数组中元素和 小于等于 q 的 最长子序列 的长度。注意&#xff0c;是子序列&am…...

【Git “ls-tree“ 命令详解】

本章目录: 1. 命令简介2. 命令的基本语法和用法基本语法常见使用场景示例 1&#xff1a;查看当前提交的文件树示例 2&#xff1a;查看某个分支的文件树示例 3&#xff1a;查看特定路径下的文件树 3. 命令的常用选项及参数常用选项&#xff1a; 4. 命令的执行示例示例 1&#xf…...

Text-to-SQL技术深度解析:从理论突破到工程实践

引言:Text-to-SQL的技术演进与当代价值 在当今数据驱动的商业环境中,结构化数据查询语言(SQL)仍然是访问和分析企业数据的核心工具。然而,SQL的专业性要求构成了数据民主化的主要障碍——据统计,仅约35%的开发人员接受过系统的SQL培训,而超过51%的专业岗位需要SQL技能。T…...

Spring Boot 整合 Servlet三大组件(Servlet / Filter / Listene)

Spring Boot 整合 “Servlet三大组件“ ( Servlet / Filter / Listene ) 目录如下&#xff1a; pom.xml配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.…...

react 18 可中断的理解以及应用

React 的“可中断&#xff08;interruptible&#xff09;”渲染&#xff0c;指的是 React 在执行渲染过程中可以暂停、中断、再继续或放弃更新。这是 React 18 引入的并发特性的一部分&#xff0c;目的是让界面响应更流畅&#xff0c;防止“卡顿”。 &#x1f4d6; 举个例子&am…...

C++使用Qt Charts可视化大规模点集

引言 数据可视化是数据分析和决策过程中的重要环节。随着数据量的不断增长&#xff0c;如何高效地可视化大规模数据集成为了一个挑战。Qt Charts 提供了一个强大的工具集&#xff0c;用于创建直观的数据可视化图表。本文将探讨如何使用 C 和 Qt Charts 可视化大规模点集&#…...

第一部分——Docker篇 第二章 Docker安装

关于系统的改造探索 开篇&#xff1a;系统改造的调研报告 第一部分——Docker篇 第一章 Docker容器 第二章 Docker安装 第三章 构建自定义镜像 第四章 搭建镜像仓库 第五章 容器编排 第六章 容器监控 文章目录 关于系统的改造探索第一部分——Docker篇 前言一、在线环境二、…...

Transformer - 多头自注意力机制复现

一、数学原理 1. 多头注意力机制 多头注意力机制允许模型在不同的表示子空间中关注输入序列的不同部分。它通过并行计算多个注意力头来实现这一点&#xff0c;每个头学习序列的不同部分。 2. 注意力分数计算 3. 掩码机制 掩码机制用于防止模型访问某些位置的信息。例如&…...

SpringCloud-快速通关(一)

本文是基于【雷丰阳老师&#xff1a;尚硅谷2025最新SpringCloud - 快速通关】进行实践操作&#xff0c;并对雷神的笔记做一个更详细的补充&#xff0c;供大家学习参考&#xff0c;一起加油&#xff01; 视频地址&#xff1a;SpringCloud快速通关_教程简介_哔哩哔哩_bilibili …...

Ansible Playbook详解:自动化配置管理的核心

1. 引言 Ansible Playbook是Ansible自动化系统的核心,它使用YAML格式描述一系列要在远程系统上执行的任务。通过Playbook,我们可以将复杂的IT操作转化为可重复、可版本控制的代码。本文将深入探讨Playbook的结构、语法和高级特性,帮助读者掌握编写高效、可维护的Playbook的…...

【实践总结】如何编写“多角色适配”的高质量技术文档?

一份文档想要“一稿多用”?先别急着开写!先读完这篇总结,你将学会如何拆解目标、设计结构、提升可读性,让文档不再顾此失彼。 🔍 背景:一文多用,常常适得其反 在实际的软件项目中,我们往往希望通过一份设计文档,同时完成以下多个目标: ✅ 描述系统结构,便于团队成…...

Ansible 入门教程:从零开始掌握自动化运维

1. 引言 在当今快速发展的IT环境中,自动化运维已成为提高效率、减少人为错误的关键。Ansible作为一个简单yet强大的自动化工具,正受到越来越多DevOps工程师的青睐。本文将带领读者从零开始,逐步掌握Ansible的核心概念和基本用法,为自动化运维之路打下坚实基础。 2. Ansible简…...

WSL2迁移教程:如何备份和转移Ubuntu子系统到新位置

WSL2迁移教程&#xff1a;如何备份和转移Ubuntu子系统到新位置 文章目录 WSL2迁移教程&#xff1a;如何备份和转移Ubuntu子系统到新位置前言环境准备迁移步骤详解1. 查看当前WSL发行版状态2. 关闭所有WSL实例3. 导出WSL发行版4. 注销原有WSL发行版5. 导入WSL发行版到新位置6. 验…...

【备赛】eeprom

简介 EEPROM即电可擦可编程只读存储器&#xff0c;属于非易失存储芯片。 它能电擦除、多次编程&#xff0c;支持字节级操作。 掉电后数据不丢失。 蓝桥杯嵌入式的eeprom使用AT24C02&#xff0c;使用IIC通信协议。 驱动的函数官方已经写好&#xff0c;我们只需要移植并使用就…...

Pytorch torch.utils.data.dataloader.default_collate 介绍

torch.utils.data.dataloader.default_collate 是 PyTorch 中 DataLoader 默认的 collate_fn 函数&#xff0c;用于将一个批次的样本数据合并成张量&#xff08;Tensor&#xff09;或其他结构化数据格式。以下是关于 default_collate 的详细介绍&#xff1a; 1. 功能 default…...

Github最新AI工具汇总2025年4月份第2周

根据GitHub官方动态及开发者生态最新进展&#xff0c;以下是2025年4月第二周&#xff08;截至4月7日&#xff09;值得关注的AI工具与技术更新汇总&#xff1a; 1. GitHub Copilot Agent Mode全量发布 核心功能&#xff1a;在VS Code中启用Agent模式后&#xff0c;Copilot可自主…...

2013年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析

2013年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...

LabVIEW 开发如何降本增效

在 LabVIEW 开发领域&#xff0c;如何在确保项目质量的同时降低开发成本&#xff0c;是众多企业和开发者共同关注的焦点。这不仅关乎资源的高效利用&#xff0c;更影响项目的投资回报率和市场竞争力。下面&#xff0c;我们将从多个维度深入剖析降本策略&#xff0c;并结合具体案…...

云存储服务器的作用都有哪些?

云存储服务器是一种用来存储和管理企业数据信息的服务器&#xff0c;可以为企业与组织提供一个可靠、安全和可扩展的存储平台&#xff0c;能够帮助个人和企业将数据信息存储在云端&#xff0c;以此来实现数据信息的备份、共享和访问功能。 云存储服务器支持多个用户共同访问和共…...

可编辑33页PPT | AI智能智慧工厂厂区完全整体解决方案

荐言摘要&#xff1a;AI智能智慧工厂厂区完全整体解决方案是一种集成了先进的人工智能技术、工业自动化系统和创新管理理念的综合性方案&#xff0c;旨在提升生产效率、降低成本、实现灵活生产&#xff0c;并推动工厂的智能化发展。 随着技术的不断进步&#xff0c;工厂架构经…...

vmware虚拟机上Ubuntu或者其他系统无法联网的解决方法

一、检查虚拟机是否开启了网络服务 打开方式&#xff1a;控制面板->-管理工具--->服务 查找 VMware DHCP Service 和VMware NAT Service &#xff0c;确保这两个服务已经启动。如下图&#xff0c;没有启动就点击启动。 二、设置网络类型 我们一般使用前两种多一些&…...

python中pyside6多个py文件生成exe

网上见到的教程大多数都是pyinstaller安装单个py文件,针对多个py文件的打包,鲜有人提及;有也是部分全而多的解释,让人目不暇接,本次记录自己设置一个声波捕捉界面的打包过程。 1.pycharm中调用pyinstaller打包 参考链接:https://blog.csdn.net/weixin_45793544/articl…...

P1006 [NOIP 2008 提高组] 传纸条 题解

题目传送门 前言 每次准备摸鱼时都在这道题的界面。 今天有空做做&#xff0c;顺便写一波题解&#xff0c;毕竟估值蹭蹭往下跳。 双倍经验&#xff1a;P1004 [NOIP 2000 提高组] 方格取数&#xff0c;P1006 [NOIP 2008 提高组] 传纸条。 题意简述 现有一个 m m m 行 n …...

linux下编译Websocketpp,适用x86和armv8

编译boost库 下载源文件&#xff1a;Version 1.79.0 编译&#xff1a; sudo ./bootstrap.sh sudo ./b2 install 安装websocketpp git clone https://github.com/zaphoyd/websocketpp.git cd websocketpp #进入目录 mkdir build cd build cmake .. make sudo make ins…...

skynet.dispatch 使用详解

目录 skynet.dispatch 函数详解1. 函数定义与参数2. 消息处理流程3. 使用示例示例 1&#xff1a;处理 Lua 协议消息示例 2&#xff1a;处理自定义协议消息 4. 关键机制(1) 协程与阻塞操作(2) 消息响应 5. 与 skynet.register_protocol 的协作6. 注意事项7. 典型应用场景 总结 s…...

CondaError: Run ‘conda init‘ before ‘conda activate‘

CondaError: Run conda init before conda activate&#xff0c;表明 Conda 环境未正确初始化&#xff0c;导致无法激活目标环境。以下是具体解决方案&#xff1a; 1. 初始化 Conda Conda 需要先初始化才能使用 activate 命令。根据Linux系统&#xff0c;运行以下命令初始化 B…...

从代码学习深度学习 - 序列到序列学习数据预处理 PyTorch 版

文章目录 前言一、数据读取二、文本预处理三、词元化四、构建词表五、截断和填充六、转换为张量七、数据迭代器总结前言 在深度学习领域,序列到序列(Seq2Seq)模型是一种非常重要的架构,广泛应用于机器翻译、文本摘要和对话生成等任务。在实现 Seq2Seq 模型时,数据的预处理…...

SQL:Primary Key(主键)和Foreign Key(外键)

目录 1. Key&#xff08;键&#xff09; 2. Index&#xff08;索引&#xff09; 3.Key和Index的区别 4. Primary Key&#xff08;主键&#xff09; 5. Foreign Key&#xff08;外键&#xff09; 6.主键和外键的关系 温馨提示&#xff1a; 闪电按钮不同的执行功能 首先&…...

ClickHouse接入prometheus监控

ClickHouse接入prometheus监控 在 ClickHouse 集群环境下&#xff08;假设你有 3 台服务器&#xff09;&#xff0c;使用自带的 Prometheus 端点来监控是完全可行的。集群部署意味着你需要为每台服务器配置 Prometheus 端点&#xff0c;并确保 Prometheus 能够从所有节点采集数…...

轻量级UDP流量重放工具的技术实现与场景应用(C/C++代码实现)

在网络协议测试、安全攻防演练、性能调优等领域&#xff0c;精确控制数据包传输行为是核心需求。udp_replay作为一款专注于UDP流量的开源工具&#xff0c;通过简洁的设计实现了对pcap文件中UDP数据流的灵活重放。本文将从技术实现原理、核心功能亮点及典型应用场景三个维度展开…...

时序数据库 TDengine × Excel:一份数据,两种效率

在日常工作中&#xff0c;很多人都离不开 Excel。不论是设备运维工程师、数据分析师&#xff0c;还是业务人员&#xff0c;一份熟悉的电子表格往往就是他们的“第一张报表”。 现在&#xff0c;TDengine 也可以与 Excel 实现无缝连接&#xff0c;用户可以直接在 Excel 中查询时…...

video自动播放

文章目录 前言在iOS系统中&#xff0c;H5页面的自动播放功能受到了一些限制&#xff0c;为了提升用户体验和保护用户隐私&#xff0c;Safari浏览器对于自动播放的行为做了一些限制。 一、自动播放的限制二、解决方案 前言 在iOS系统中&#xff0c;H5页面的自动播放功能受到了一…...

如何利用AI智能生成PPT,提升工作效率与创意表现

如何利用AI智能生成PPT&#xff0c;提升工作效率与创意表现&#xff01;在这个信息爆炸的时代&#xff0c;制作一份既专业又富有创意的PPT&#xff0c;已经不再是一个简单的任务。尤其是对于每天都需要做报告、做展示的职场人士来说&#xff0c;PPT的质量直接影响着工作效率和个…...

Java8+Spring Boot + Vue + Langchain4j 实现阿里云百炼平台 AI 流式对话对接

1. 引言 在本文中&#xff0c;我们将介绍如何使用 Spring Boot、Vue.js 和 Langchain4j&#xff0c;实现与 阿里云百炼平台 的 AI 流式对话对接。通过结合这些技术&#xff0c;我们将创建一个能够实时互动的 AI 聊天应用。 这是一个基于 Spring Boot Vue.js Langchain4j 的智…...

【scikit-learn基础】--『数据加载』之外部数据集

这是scikit-learn数据加载系列的最后一篇&#xff0c;本篇介绍如何加载外部的数据集。 外部数据集不像之前介绍的几种类型的数据集那样&#xff0c;针对每种数据提供对应的接口&#xff0c;每个接口加载的数据都是固定的。 而外部数据集加载之后&#xff0c;数据的字段和类型是…...

Redis原理:keys命令

语法&#xff1a; keys pattern 返回所有符合pattern的key 支持 glob-style patterns: h?llo matches hello, hallo and hxlloh*llo matches hllo and heeeelloh[ae]llo matches hello and hallo, but not hilloh[^e]llo matches hallo, hbllo, ... but not helloh[a-b]llo ma…...