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

【c2】编译预处理,gdb,makefile,文件,多线程,动静态库

文章目录

  • 1.编译预处理:C源程序 - 编译预处理【#开头指令和特殊符号进行处理,删除程序中注释和多余空白行】- 编译
  • 2.gdb调试:多进/线程中无法用
  • 3.makefile文件:make是一个解释makefile中指令的命令工具
  • 4.文件:fprint/fgets/fwrite/fread,ftell/rewind/fseek/fflush
    • 4.1 文本文件:FILE结构体
    • 4.2 二进制文件:没有行概念
    • 4.3 文件定位:linux下文本文件模式和二进制文件模式没有区别。fgets和fprintf以行方式读写文本文件,但不能读写二进制文件。用fread和fwrite可以读写文本文件和二进制文件
  • 5.多线程:pthread_create(),查看线程top -H,ps -xH | grep
    • 5.1 子线程未执行:join
    • 5.2 线程传参区分线程:"th1"
    • 5.3 两子线程数字相加:分别加到自己线程变量中
    • 5.4 两个线程同时加到一个全局变量s中:5000数字小不会影响
      • 全局变量S++要加锁:数字大出现race condition
    • 5.5 假共享:两线程分别加到自己result数组中,0和1两个线程,两个result数组(一个数字累加)
  • 6.动静态库:.a,指定.so,LD_
    • 6.1 静态库:链接库的文件名是libpublic.a,链接库名是public,缺点使用的静态库发生更新改变,程序必须重新编译
    • 6.2 动态库:动态库发生改变,程序不需要重新编译,动态库升级方便
    • 6.3 libc(标准):gnu libc(glibc)(实现)
    • 6.4 编译时为什么要加上 –lm ?:man exp:Link with -lm


1.编译预处理:C源程序 - 编译预处理【#开头指令和特殊符号进行处理,删除程序中注释和多余空白行】- 编译

在这里插入图片描述
条件编译:最常用的两种格式#ifdef和#ifndef 。#undef :取消已定义的标识符
在这里插入图片描述
在这里插入图片描述
如下book145.c和_public.c都有 #include"_public.h",会重复包含。
在这里插入图片描述
在_public.c中如下这样写,_public.h就不会被重复包含。
在这里插入图片描述

2.gdb调试:多进/线程中无法用

root 用户:yum -y install gdb,gdb -v。
在这里插入图片描述
在这里插入图片描述

3.makefile文件:make是一个解释makefile中指令的命令工具

vi gcc.sh 如下,sh gcc.sh。gcc -o 目标 依赖1 依赖2。makefile命令能被执行条件有两个:1.目标不存在,2.依赖已更新。
在这里插入图片描述
如上若只需要编译book2,单个文件改变不重复编译其他文件即增量编译。vi makefile,$前一个tab键不能8个空格。make默认是make all,如果将all这行book3删除,则make不会编译book3,可指定make book3,book3相当于标签。-欧2是让编译效率最高,一般正式发布用。gcc命令选项 :-c编译不链接。
在这里插入图片描述

4.文件:fprint/fgets/fwrite/fread,ftell/rewind/fseek/fflush

4.1 文本文件:FILE结构体

在这里插入图片描述
在这里插入图片描述
vi /tmp/test1.txt,可见有5行记录,不管执行多少次都是5行记录,因为文件打开方式是w,每次打开文件时都会清空原文件中的记录。
在这里插入图片描述
在这里插入图片描述

int main() {int fd;char buffer[5] = {0};ssize_t bytesRead;fd = open("/home_a/abcd", O_RDONLY, 0444);bytesRead = read(fd, buffer, 4);if (bytesRead == -1) {printf("read error");return 1;}printf("Read %zd bytes: %s\n", bytesRead, buffer);  //Read 4 bytes: 0xffreturn 0;
}

4.2 二进制文件:没有行概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
int main()
{char *filename = "Shanghai";FILE *fp = fopen(filename, "rb");if (fp == NULL){printf("打开%s文件错误", filename);return -1;}int n;for (int i = 0; i < 10000; i++){fread(&n, sizeof(int), 1, fp);printf("%d\n ", n);}fclose(fp);return 0;
}

在这里插入图片描述
在这里插入图片描述

4.3 文件定位:linux下文本文件模式和二进制文件模式没有区别。fgets和fprintf以行方式读写文本文件,但不能读写二进制文件。用fread和fwrite可以读写文本文件和二进制文件

文件内部有一个位置指针,用来指向当前读写的位置,也就是读到第几个字节。在文件打开时,如果打开模式是r和w,位置指针指向文件的第一个字节。如果打开模式是a,位置指针指向文件的尾部,每当从文件里读n个字节或文件里写入n个字节后,位置指针会后移n个字节。

文件位置指针与C中指针不是一回事,位置指针仅仅是一个标志,表示文件读写到的位置即读写到第几个字节,不表示地址。文件每读写一次,位置指针就会移动一次,不需要你在程序中定义和赋值,由系统自动设置。
在这里插入图片描述

#include <stdio.h>
int main(int argc, char **argv) 
{FILE *fp=fopen("/sys/bus/i2c/devices/20-0048/hwmon/hwmon1/in0_input","w");if(!fp){puts("fail");}fclose(fp);
}FILE *fptime;
fptime=fopen("/tmp/time","w");
time_t time_log = time(NULL);
struct tm* tm_log = localtime(&time_log);
fprintf(fptime, "flag[%d]  LINE[%d]    %04d-%02d-%02d %02d:%02d:%02d\r\n",sensor_flag, __LINE__, tm_log->tm_year + 1900, tm_log->tm_mon + 1, tm_log->tm_mday, tm_log->tm_hour, tm_log->tm_min, tm_log->tm_sec);
fflush(fptime);
fclose(fptime);if(rc<0)
{FILE *fpLedLog=fopen("/tmp/error","a");fprintf(fpLedLog,"error__%u__\r\n",__LINE__);fclose(fpLedLog);goto err;
}FILE *fpLedColor=fopen(led_color,"w");
fseek(fpLedColor,0,SEEK_SET);
fprintf(fpLedColor,"%s",sensor_flag?LED_GREEN_CODE:LED_YELLOW_CODE);
fflush(fpLedColor);
fclose(fpLedColor);int main(int argc, char **argv) 
{if(2 == argc){FILE *fpLedCtrl=fopen("/sys/bus/i2c/devices/0-000d/sys_led_ctrl","w");FILE *fpLedColor=fopen("/sys/bus/i2c/devices/0-000d/sys_led_color","w");FILE *fpLedLog=fopen("/var/log/sensorMon.log","w");    fprintf(fpLedCtrl,"0x1");fprintf(fpLedColor,"%s",argv[1]);fprintf(fpLedLog,"%s\r\n",argv[1]);    fclose(fpLedCtrl);fclose(fpLedLog);fclose(fpLedColor);}
}int mysprintf(char *outBuffer, char *format, ...)
{va_list aptr;int ret;va_start(aptr, format);ret = vsprintf(outBuffer, format, aptr);va_end(aptr);return(ret);
}if( realvalue >= 0 )
{CompareValueThreshold(realvalue,&node[i]);strcat(node[i].path,node[i].node);if(0==strcmp("P1V8_VDDO(SWITCH)",node[i].name) || 0==strcmp("P1V2(SWITCH)",node[i].name))RecordEventLog(LOG_ERR,"\n [%d] throw a %s\n",i,sta?"SENSOR_ABNORMAL":"SENSOR_NORMAL");
}FILE *fright=fopen("/tmp/right","w");
for(i=0;i<arraysize;i++)
{fprintf(fright,"[%d] %s (%s)\r\n",i,node[i].path,node[i].desc);
}
fclose(fright);

5.多线程:pthread_create(),查看线程top -H,ps -xH | grep

5.1 子线程未执行:join

如下线程thread进程process区别:process不能共享内存。
在这里插入图片描述
如下线程主函数void* 。pthread_create的第四个参数是myfunc的参数。
在这里插入图片描述
在这里插入图片描述

5.2 线程传参区分线程:“th1”

在这里插入图片描述
在这里插入图片描述

5.3 两子线程数字相加:分别加到自己线程变量中

在这里插入图片描述
在这里插入图片描述
如下解决上面代码重复太多问题,将0-2500和2500-5000当参数传进来。
在这里插入图片描述
在这里插入图片描述

5.4 两个线程同时加到一个全局变量s中:5000数字小不会影响

在这里插入图片描述

全局变量S++要加锁:数字大出现race condition

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5 假共享:两线程分别加到自己result数组中,0和1两个线程,两个result数组(一个数字累加)

在这里插入图片描述
在这里插入图片描述
如下定义s为局部变量 = 结构体取出result,比上面要快。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
time ./example6始终比example5快,将50000000多加一个0,快的更多。为什么 ? 因为假共享false sharing,如下是一个框即单核cpu不会false sharing。
在这里插入图片描述
如下多核+运算结果距离近:example5里result变量在线程主函数外,cpu线程计算要从RAM中拉取。example6里的s为局部变量放在两个线程主函数里即cpu缓存里做计算,cpu两个核里两个缓存不会互相影响。所以example6不会falsing sharing,速度快。
在这里插入图片描述
如下解决假共享:cpu的cache短,RAM里很长,第一个线程结果保存在0位置,第二个线程结果保存在100位置,cache只更新自己长度的一小段如下4段(空间换时间)。
在这里插入图片描述

#if 0
int a=200;
int b=100;
pthread_mutex_t lock; //互斥锁的宏
void ThreadA(void)
{printf("线程A.....\n");pthread_mutex_lock(&lock);a-=50; //a=a-50sleep(5);b+=50; //b=b+50printf("a:%d,b:%d\n",a,b);pthread_mutex_unlock(&lock);
}
void ThreadB(void)
{printf("线程B.....\n");sleep(1);pthread_mutex_lock(&lock);//加锁printf("%d\n",a+b);pthread_mutex_unlock(&lock);//解锁
}
int main(void)
{pthread_t tida,tidb;pthread_mutex_init(&lock,NULL);//建立一个互斥锁pthread_create(&tida,NULL,(void *)ThreadA,NULL); //创建一个线程,1.句柄,2.线程属性,3.线程函数,4.函数的参数pthread_create(&tidb,NULL,(void *)ThreadB,NULL);pthread_join(tida,NULL);//等待一个线程结束pthread_join(tidb,NULL);pthread_mutex_destroy(&lock);return 1;
}
// -server:~/bak$ gcc test.c -lpthread
// -server:~/bak$ ./a.out 
// 线程A.....
// 线程B.....
// a:150,b:150
// 300
#endif

6.动静态库:.a,指定.so,LD_

公用函数库的public.cpp是源代码,对任何人可见,实际开发出于保密并不希望提供公用函数库源代码。C/C++提供了一个保证代码安全性方法,public.cpp编译成库(静态库与动态库)。

// public.h
#ifndef PUBLIC_H
#define PUBLIC_H 1
#include <stdio.h>
void func();   // 自定义函数的声明
#endif
// public.cpp
#include "public.h"
void func()   // 自定义函数的实现
{printf("我心匪石,不可转也。我心匪席,不可卷也。威仪棣棣,不可选也。\n");
}
// book265.cpp
#include "public.h"  // 把public.h头文件包含进来
int main()
{func();
}
g++ -o book265 book265.cpp public.cpp
./book265
我心匪石,不可转也。我心匪席,不可卷也。威仪棣棣,不可选也。

6.1 静态库:链接库的文件名是libpublic.a,链接库名是public,缺点使用的静态库发生更新改变,程序必须重新编译

gcc -c -o libpublic.a public.cpp

使用静态库的方法一,直接把调用者源代码和静态库文件名一起编译:

g++ -o book265 book265.cpp libpublic.a

使用静态库的方法二,用L参数指定静态库文件的目录,-l参数指定静态库名:如果要指定多个静态库文件的目录,用法是“-L/目录1 -L目录2 -L目录3”;如果要指定多个静态库,用法是“-l库名1 -l库名2 -l库名3”

g++ -o book265 book265.cpp -L/home/w/demo -lpublic
./book265
我心匪石,不可转也。我心匪席,不可卷也。威仪棣棣,不可选也。

6.2 动态库:动态库发生改变,程序不需要重新编译,动态库升级方便

g++ -fPIC -shared -o libpublic.so public.cpp

使用动态库的方法与使用静态库的方法相同。如果在动态库文件和静态库文件同时存在,优先使用动态库编译:

g++ -o book265 book265.cpp -L/home/w/demo -lpublic

执行程序./book265时,出现以下提示:/book265: error while loading shared libraries: libpublic.so: cannot open shared object file: No such file or directory,因为采用了动态链接库的可执行程序在运行时需要指定动态库文件的目录,Linux系统中采用LD_LIBRARY_PATH环境变量指定动态库文件的目录。采用以下命令设置LD_LIBRARY_PATH环境变量。

export LD_LIBRARY_PATH=/home/w/demo:.

如果要指定多个动态库文件的目录,用法是“export LD_LIBRARY_PATH=目录1:目录2:目录3:.”,目录之间用半角的冒号分隔,最后的圆点指当前目录。接下来修改动态库中func函数的代码:

// printf("我心匪石,不可转也。我心匪席,不可卷也。威仪棣棣,不可选也。\n");
printf("生活美好如鲜花,不懂享受是傻瓜;\n");

如下重新编译动态库,无需重新编译book265,直接执行程序。

g++ -fPIC -shared -o libpublic.so public.cpp
./book265
生活美好如鲜花,不懂享受是傻瓜;

6.3 libc(标准):gnu libc(glibc)(实现)

编译【预处理(语法检查),编译(.c->.s汇编文件),汇编(.s->.o二进制文件),链接(多个.o合并成1个执行文件)】的最后阶段将依赖引入过程叫链接:so文件通过mmap加载进内存,动态链接的a.out文件小且内存占用小,此外动态链接在so库更新后不需重新编译,一般首选。很多进程用到C语言libc.so里stdio.h里打印函数,如果通过静态链接,这样占用的内存多。
在这里插入图片描述
在这里插入图片描述
static指定静态链接。gcc是gnu的编译工具集合,gcc不光编译c语言且支持很多平台
在这里插入图片描述
如下系统没有glibc库。
在这里插入图片描述

6.4 编译时为什么要加上 –lm ?:man exp:Link with -lm

// 代码一
#include <stdio.h>
#include <math.h> //exp
int main(int argc, char const *argv[]){printf("The exponential value of %lf is %lf\n", 0, exp(0));printf("The exponential value of %lf is %lf\n", 0+1, exp(0+1)); //e的1次幂printf("The exponential value of %lf is %lf\n", 0+2, exp(0+2));return(0);
}

在这里插入图片描述

// 代码二
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[]){double x = 0;printf("The exponential value of %lf is %lf\n", x, exp(x));printf("The exponential value of %lf is %lf\n", x+1, exp(x+1));printf("The exponential value of %lf is %lf\n", x+2, exp(x+2));return(0);
}

在这里插入图片描述
在这里插入图片描述
代码一调用exp传入的参数是常量为0 。代码二调用exp传入的参数是变量 x,代码一会不会在运行之前就计算好了呢?如下代码一没有看到调用exp的身影,当传入参数为常量时就已计算好了值,最后不需调用exp函数。代码二通过如下main.s汇编代码可见多次调用call函数。
在这里插入图片描述
math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,程序中用到的数学函数要到这个库文件里找。

gcc a.c -o a.outarm-linux-gcc a.c -o b.out,如果执行out文件出现No such file or directory,则将如下两个so文件互相ln -s建软链接。
在这里插入图片描述

相关文章:

【c2】编译预处理,gdb,makefile,文件,多线程,动静态库

文章目录 1.编译预处理&#xff1a;C源程序 - 编译预处理【#开头指令和特殊符号进行处理&#xff0c;删除程序中注释和多余空白行】- 编译2.gdb调试&#xff1a;多进/线程中无法用3.makefile文件&#xff1a;make是一个解释makefile中指令的命令工具4.文件&#xff1a;fprint/f…...

c++结构体用构造函数进行初始化

结构体能自由组装数据&#xff0c;是一种很常见的数据打包方法。 当我们定义一个结构体后&#xff0c;没有初始化就使用&#xff0c;就会使用到垃圾数据&#xff0c;而且这种错误很难发现。 在编程时对于定义的任何变量&#xff0c;我们最好都先初始化。 常见的操作是每定义…...

2024年五一数学建模C题完整解题思路代码

2024年第二十一届五一数学建模竞赛题目 C题 煤矿深部开采冲击地压危险预测 煤炭是中国的主要能源和重要的工业原料。然而&#xff0c;随着开采深度的增加&#xff0c;地应力增大&#xff0c;井下煤岩动力灾害风险越来越大&#xff0c;严重影响着煤矿的安全高效开采。在各类深…...

0018__GTK+:GTK+的简介、安装、使用方法之详细攻略

GTK&#xff1a;GTK的简介、安装、使用方法之详细攻略-CSDN博客...

环保访谈|浙江双视专注红外机器视觉及智能化应用,保障安全生产

近期&#xff0c;中联环保圈希姐采访了浙江双视科技股份有限公司环保行业销售总监孙波&#xff0c;深入了解了双视科技的发展历程、产品和解决方案、合作流程、核心竞争力以及未来规划。 双视于2014年创立&#xff0c;专注于红外机器视觉、人工智能技术与应用开发&#xff0c;…...

​Web服务器

代码: WebServer 介绍 HTTP层 POST请求一般会包含Content-Length字段, 告诉服务器请求主体的长度GET请求一般不会包含Content-Length字段, 它一般不含请求正文POST响应: Content-Type字段, 根据请求资源的后缀填写 编写 1.读取请求与分析请求 2.根据不同请求方法构建不同的响…...

linux的firmware和hal层

linux的firmware和hal层 在Linux中&#xff0c;固件&#xff08;firmware&#xff09;和硬件抽象层&#xff08;Hardware Abstraction Layer&#xff0c;HAL&#xff09;是两个不同的概念。固件是运行在硬件设备上的程序&#xff0c;它们通常被用来控制硬件的操作。而HAL是一种…...

从ETL与ELT谈起,理解数仓的任务

最近有个朋友&#xff0c;有几十 PB 的异构数据&#xff0c;数据源包括 MySQL、DB2、Oracle、CSV、磁带机&#xff0c;等等&#xff0c;然后他需要把这些数据中的一些信息做关联整合&#xff0c;从这几十 PB 的数据中提取出若干业务字段到数据仓库&#xff0c;做统一分析。 数…...

esp32-cam 2. python opencv 拉取摄像头内容

0. 环境 - win10 python3 - pycharm - esp32-cam http://192.168.4.1 1. 创建工程 File -> Create Project -> -> Location: E:\Workspaces\PycharmProjects\esp32cam_opencv -> Create 2. opencv hello 2.1 添加脚本 File -> New -> Python f…...

js之遍历方法

先创建一个数组&#xff0c;然后使用for.in进行遍历&#xff0c;如下图所示sub代表下标并且遍历几次&#xff0c;arr代表数组 <script>let arr [1, 2, 3, 4, 5, 6];for (let sub in arr) {console.log(arr);}</script> 第二种方法则是for循环遍历&#xff0c;根据…...

Elementui的el-footer标签使用报错

Elementui的el-footer标签使用报错 其余标签的使用没有报错信息 el-footer的报错信息 原因: ​ 警告信息表示 Vue 不识别 <el-footer> 解决方式: 在组件中进行引入和暴露...

Ubuntu24.04安装中文输入法

Ubuntu24.04安装中文输入法 为了更好的体验&#xff0c;请访问个人博客 www.huerpu.cc:7000 一、添加中文语言支持 在安装中文输入法之前&#xff0c;首选要添加中文语言支持。选择System&#xff0c;点击Region & Language。 点击Manage Install Languages。 点击Insta…...

八股kafka(一)

目录 1、面试官&#xff1a;Kafka是如何保证消息不丢失 2、面试官&#xff1a;Kafka中消息的重复消费问题如何解决的 3、面试官&#xff1a;Kafka是如何保证消费的顺序性 4、面试官&#xff1a;Kafka的高可用机制有了解过嘛 5、面试官&#xff1a;解释一下复制机制中的ISR 6、面…...

SemCity: 一个应用于真实户外环境场景生成的3D Diffusion模型

论文标题&#xff1a; SemCity: Semantic Scene Generation with Triplane Diffusion 论文作者&#xff1a; Jumin Lee1, Sebin Lee1, Changho Jo, Woobin Im, Juhyeong Seon, Sung-Eui Yoon 项目地址&#xff1a;https://sglab.kaist.ac.kr/SemCity/ 前言&#xff1a; 该论…...

鸿蒙内核源码分析(互斥锁篇) | 互斥锁比自旋锁丰满多了

内核中哪些地方会用到互斥锁?看图: 图中是内核有关模块对互斥锁初始化,有文件,有内存,用消息队列等等,使用面非常的广.其实在给内核源码加注的过程中,会看到大量的自旋锁和互斥锁,它们的存在有序的保证了内核和应用程序的正常运行.是非常基础和重要的功能. 概述 自旋锁 和…...

MySQL之查询 拿下 * 。*

DQL数据查询语言 对上述的的查询操作进行代码演示&#xff08;续上一篇学生表代码进行处理&#xff09; 下面是上一篇的代码分享 下面进行简单的查询操作 字符串如果强行进行算数运算默认只为0 查询时常用的单行函数列举 未完待续...

目标检测(二阶段)领域,常见词汇

1、Backbone&#xff08;主干网络&#xff09; 定义: Backbone是目标检测模型的基础部分&#xff0c;通常是一个预训练的卷积神经网络&#xff08;如ResNet、VGG、MobileNet等&#xff09;&#xff0c;负责从输入图像中提取多层特征图。这些特征图包含了不同尺度和抽象级别的信…...

区块链与人工智能哪个更有前景?

一、引言 随着科技的飞速发展&#xff0c;区块链技术和人工智能&#xff08;AI&#xff09;无疑是两大热门领域&#xff0c;各自以其独特的魅力吸引着全球的关注。两者虽源自不同的技术基础&#xff0c;却都预示着未来技术发展的无限可能。本文旨在探讨区块链与人工智能各自的前…...

计算机网络【应用层】邮件和DNS

文章目录 电子邮件DNSDNS提供的服务&#xff1a;域名分级域名解析流程DNS资源记录DNS服务器类型 电子邮件 使用SMTP协议发送邮件之前&#xff0c;需要将二进制多媒体数据编码为ASCII码SMTP一般不使用中间邮件服务器发送邮件&#xff0c;如果收件服务器没开机&#xff0c;那么会…...

js遍历数组将数组中属性名相同的属性值组成新的数组再转化成字符串并换行(js换行和html换行不同)

{label: 告警结果,display:true, html:true,formatter:(row)>{let list ""if(row.funRes&&row.funRes.length){let propName value; list row.funRes.map(obj > {return <span style"vertical-align: text-top;padding-right: 2px;">…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...