【C2】文件,时间,多线程,动静态库

news2024/11/13 8:04:30

文章目录

  • 1.文件:fprint/fgets/fwrite/fread,ftell/rewind/fseek/fflush
    • 1.1 文本文件:FILE结构体
    • 1.2 二进制文件:没有行概念
    • 1.3 文件定位:linux下文本文件模式和二进制文件模式没有区别。fgets和fprintf以行方式读写文本文件,但不能读写二进制文件。用fread和fwrite可以读写文本文件和二进制文件
  • 2.时间:time.h文件
    • 2.1 /etc/ntp.conf:restrict (什么可访问我并可修改我的时间)10.75.92.0 mask 255.255.255.0 nomodify(nomodify不能修改我,只能访问同步走)
  • 3.多线程:pthread_create(),查看线程top -H,ps -xH | grep
    • 3.1 子线程未执行:join
    • 3.2 线程传参区分线程:"th1"
    • 3.3 两子线程数字相加:分别加到自己线程变量中
    • 3.4 两个线程同时加到一个全局变量s中:5000数字小不会影响
      • 全局变量S++要加锁:数字大出现race condition
    • 3.5 假共享:两线程分别加到自己result数组中,0和1两个线程,两个result数组(一个数字累加)
  • 4.动静态库:.a,指定.so,LD_
    • 4.1 静态库:链接库的文件名是libpublic.a,链接库名是public,缺点使用的静态库发生更新改变,程序必须重新编译
    • 4.2 动态库:动态库发生改变,程序不需要重新编译,动态库升级方便
    • 4.3 libc(标准):gnu libc(glibc)(实现)
    • 4.4 编译时为什么要加上 –lm ?:man exp:Link with -lm


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

1.1 文本文件:FILE结构体

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

1.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;
}

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

1.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);

2.时间:time.h文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
time_t只是一个长整型,不符合使用习惯,需转成方便表示时间的结构体即tm结构体,tm结构体在time.h中声明。

struct tm
{
  int tm_sec;          /* 秒,范围从 0 到 59    */
  int tm_min;          /* 分,范围从 0 到 59    */
  int tm_hour;         /* 小时,范围从 0 到 23  */
  
  int tm_mday;         /* 一月中的第几天,范围从 1 到 31  */
  int tm_mon;          /* 月,范围从 0 到 11,  0代表1月*/
  int tm_year;         /* 自 1900 年起的年数   */
  
  int tm_wday;         /* 一周中的第几天,范围从 0 到 6,0代表星期天 */
  int tm_yday;         /* 一年中的第几天,范围从 0 到 365,0代表1月1日 */
  int tm_isdst;        /* 夏令时 */
  long int tm_gmtoff;  /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
  const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
};

localtime将时间戳转为北京时间的结构体(mktime也是北京时间),gmtime将时间戳转为世界时的结构体。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

root@sr6115:~# date +"%Y %m %d %H %M %S" (加号前面有空格,后面没有)
2022(年) 08(月) 05(日)  02(小时) 43(分) 56(秒)

root@sr6115:~# date +"%s"
1659667469(转换时间时注意选择转成北京时还是标准时)

root@sr6115:~# date(date命令默认将时间戳转为UTC显示, 所以我们设置完时间后要将时间戳+8小时,date命令才和我们设置一致)
Fri Aug  5 03:32:55 UTC 2022 (显示UTC,前面时间就是世界标准时)

# UTC【比GMT正式】和GMT都是世界标准时(0经度线【竖】),北京时间(CST)位于东八区 = 世界时+8小时

mv /etc/localtime /etc/localtime.bak
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改为CST,hwclock -w更新硬件时间

在这里插入图片描述

#include<stdio.h>
#include<time.h>

int main()
{
    struct tm *info;
    time_t curtime;

    time( &curtime ); //返回当前时间戳
    printf("时间戳: %ld\n",curtime);

    info = localtime( &curtime );  //时间戳转为tm结构体指针
    printf("结构体:时:%d\n",info->tm_hour);

    char tmp[64];
    strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",info); //将tm结构体转换为时间字符串
    printf("时间字符串:%s\n",tmp);

    struct tm mytm;
    char tmp1[50] = "2022-02-16 15:20:00";
    // strptime:将时间字符串转换为tm结构体  //如果不匹配,"%Y%m-%d %H:%M:%S" ,返回0。
    int ret=strptime(tmp1, "%Y-%m-%d %H:%M:%S", &mytm); 
    printf("strptime返回值: %d\n",ret);
    printf("结构体:时:%d\n",mytm.tm_hour);
}

在这里插入图片描述

// time.cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

void GetSystemTime(char *buffer)
{
	struct tm *td;
	struct tm tdres;
	struct timeval now;
	gettimeofday(&now, 0);
	td = localtime_r((time_t *)&(now.tv_sec), &tdres);
	if(td == NULL)
	{
		return;
	}
	sprintf(buffer, "%2.2d—%2.2d—%2.2d %2.2d:%2.2d:%2.2d:3.3d", (td->tm_year+1900), (td->tm_mon+1), td->tmday, td->tm_hour, td->tm_min, td->tm_sec, (long)(now.tv_usec/1000));
}

int main()
{
	while(1) 
	//每隔一秒打印一次当前时间
	//只是为了方便测试,不建议做定时器
	{
		char dataTime[1024] = {0};
		GetSystemTime(dataTime);
		printf("dataTime:%s\n", dataTime);
		sleep(1);
    }
	return 0;
}

在这里插入图片描述

void writeTimestampToBuffer(bufStore *buf) {
  struct tm *info;
  time_t cur_time;
  int years;
  char dateBuff[10];

  time(&cur_time);
  info = localtime( &cur_time );
  years = 1900 + info->tm_year;
  sprintf(dateBuff, "%d ", years);
  
  writeData(buf->buf_fd, dateBuff, strlen(dateBuff), "buffer");
}

2.1 /etc/ntp.conf:restrict (什么可访问我并可修改我的时间)10.75.92.0 mask 255.255.255.0 nomodify(nomodify不能修改我,只能访问同步走)

ntp.conf修改后隔10分钟才去同步一次,重启ntp进程立马同步。
在这里插入图片描述

root@bmc-oob:/home/admin# date -s 2022.05.05-09:47:00        
Thu May  5 09:47:00 CST 2022
root@bmc-oob:/home/admin# date +"%Y-%m-%d %H:%M.%S"
2022-05-05 09:47.09
server 10.75.158.20 iburst  # 在/etc/ntp.conf自动,重启ntp服务
root@bmc:/lib/systemd/system# ls *.service

ntpstat查看每次更新间隔,NTP一般只会同步system clock,但要同步RTC(hwclock)的话需把/etc/sysconfig/ntpd中SYNC_HWCLOCK=yes。
在这里插入图片描述
在这里插入图片描述

# Synchronize NTP time to RTC
write_rtc()
{
    if [ ! -d /etc/cron/crontabs ];then
        mkdir -p /etc/cron/crontabs
    fi
    echo "0 0 * * * hwclock --systohc" >> /etc/cron/crontabs/root
    /usr/sbin/crond -c /etc/cron/crontabs &
}
write_rtc

root@bmc:~# timedatectl
      Local time: Mon 2023-05-22 11:23:47 CST
  Universal time: Mon 2023-05-22 03:23:47 UTC
        RTC time: Mon 2023-05-22 03:23:49
       Time zone: Asia/Shanghai (CST, +0800)
 Network time on: yes
 NTP synchronized: no
 RTC in local TZ: no
# hwclock查看硬件时间
# hwclock --systohc和hwclock -w一样将系统时间写入硬件时间

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

3.1 子线程未执行:join

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

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

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

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

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

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

在这里插入图片描述

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

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

3.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-50
    sleep(5);
    b+=50; //b=b+50
    printf("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

4.动静态库:.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
我心匪石,不可转也。我心匪席,不可卷也。威仪棣棣,不可选也。

4.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
我心匪石,不可转也。我心匪席,不可卷也。威仪棣棣,不可选也。

4.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
生活美好如鲜花,不懂享受是傻瓜;

4.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库。
在这里插入图片描述

4.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建软链接。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter】Flutter 国际化入门 使用 intl 包 格式化日期

文章目录 一、 前言二、 版本信息三、 什么是 intl 包四、 如何安装和使用 intl 包1. 安装 intl 包2. 使用 intl 包进行基本的日期和数字格式化3. 使用 intl 包进行消息翻译 五、 一个简单的使用示例六、 总结 一、 前言 在全球化的今天&#xff0c;为你的 Flutter 应用添加国…

快速上手MATLAB图像处理:100种项目全覆盖

本教程涵盖了MATLAB图像处理的广泛内容。我们学习了图像读取、显示和保存,图像的基本操作(如缩放、裁剪、旋转和翻转),以及图像的基本增强(如亮度调整、对比度调整和颜色空间转换)。本教程还介绍了常见的图像滤波技术(如均值滤波、中值滤波和高斯滤波),图像的直方图均…

JAVA临时文件的使用

目录 什么是临时文件&#xff1f; 临时文件在编程中有各种妙用 java在缓存目录创建临时文件的方式 1 按照指定文件名随机数字共同作为文件名创建 2 按照指定文件名创建 3 通过获取临时文件夹的真实路径 什么是临时文件&#xff1f; 临时文件是在计算机系统中用于临时存储数…

Spring Cloud - Gateway统一网关、断言工厂、过滤器工厂、全局过滤器、跨域问题

目录 一、什么是网关&#xff1f;为什么选择 Gateway? 二、Gateway 网关 2.1、搭建网关服务 1.创建新的module&#xff0c;引入SpringCloudGateway的依赖和nacos的服务发现依赖 2.编写nacos地址和路由配置 2.2、路由断言工厂PredicateFactory 2.3、路由过滤器 GatewayF…

2015年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

如何删除Git仓库中的敏感文件及其历史记录

本文主要介绍如何使用 git filter-branch 命令删除 Git 仓库中的敏感文件及其历史记录。在 Git 中&#xff0c;我们通常会将敏感信息(如密码、私钥等)存储在 .gitignore 文件中&#xff0c;以防止这些信息被意外提交到仓库。有时候&#xff0c;因为疏忽或私有仓库转公开仓库&am…

SQL15 查看学校名称中含北京的用户

SELECT device_id,age,university FROM user_profile WHERE university LIKE %北京%下划线 代表匹配任意一个字符&#xff1b; % &#xff1a;百分号 代表匹配0个或多个字符&#xff1b; []: 中括号 代表匹配其中的任意一个字符&#xff1b; [^]: ^尖冒号 代表 非&#xff0c;取…

CRM系统通过哪三步增加销售团队协作?

销售团队的协作是企业成功的重要保障。协调一致的销售团队能够提升销售效率&#xff0c;提高销售转化&#xff0c;获得更多业绩收入。那么企业要如何增加销售团队的协作&#xff1f;可以用CRM销售管理系统。 CRM系统如何增加销售团队协作&#xff1a; 1、建立统一的客户数据库…

SAP ABAP 如果某字段没有参数ID,如自开发程序使用的自建表 新建参数ID

1&#xff09;新建参数ID sm30 TPARA 维护 输入ID和描述 2&#xff09; 参数ID和Se11数据元素 绑定

【EasyX】扫雷

目录 扫雷1. 主体功能描述2、主要实现步骤3、效果图 扫雷 本博客介绍利用EasyX加上图片、音乐素材实现一个传统的扫雷小游戏。 1. 主体功能描述 1、全局变量&#xff1a;时间、地图、图片资源、状态&#xff1b; 2、绘图初始化函数drawinit&#xff1a;载入图片资源&#xf…

力扣 701. 二叉搜索树中的插入操作

题目来源&#xff1a;https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路&#xff1a;只要根据二叉搜索树的特性&#xff0c;将新插入节点的值不断地与树节点值进行比较&#xff0c;然后找到新节点所属的叶子节点位置&#xff0c;插入即好&…

Jetson Nano供电

1.Jetson Nano供电 Jetson Nano开发板有5种供电方式&#xff1a; 5V 2A(micro USB) 5V 3A(GPIO引脚) 5V 4A(DC接口) 5V 6A(所有电源IO反向供电) POE供电 其中&#xff0c; 5V 2A是受限于USB自身&#xff0c;强烈推荐DC 4A供电&#xff0c;满足Jetson Nano大部分使用场景&…

Linux基础_2

目录 一、获取帮助 1、whatis 2、查看命令的帮助 内部命令 外部命令 3、man命令 作用&#xff1a;提供命令帮助的文件 4、info命令 作用&#xff1a;常用于命令参考&#xff0c;GNU工具&#xff0c;适合通用文档参考 5、Linux安装提供的本地文档获取帮助 Applicatio…

ES6的类 vs TypeScript的类:解密两种语言中的面向对象之争

文章目录 ES6 类ES6 类的常见特性1. 构造函数2. 实例方法3. 静态方法4. 继承 TypeScript 类TypeScript 类的特性1. 类型注解2. 访问修饰符3. 类型推断4. 接口实现 ES6 类 ES6&#xff08;ECMAScript 2015&#xff09;引入了类的概念&#xff0c;为 JavaScript 增加了面向对象编…

费马原理与光的反射折射

费马原理&#xff1a;光传播的路径是光程取极值的路径 光的反射 如上图所示&#xff0c;光从P点出发射向x点&#xff0c;反射到Q点。 P 点到 x 点的距离 d 1 x 2 a 2 d1 \sqrt{x^2 a^2} d1x2a2 ​ Q 点到 x 点的距离 d 2 b 2 ( l − x ) 2 d2 \sqrt{b^2 (l-x)^2} d2…

WebAPIs-DOM操作元素属性/自定义属性

Web APIs web APIs 操作页面元素做出各种效果 DOM 文档对象模型 使用js操作页面文档 BOM 浏览器对象模型 使用js操作浏览器 API 应用程序接口 接口&#xff1a;无需关心内部如何实现&#xff0c;只需要调用就可以很方便实现某些功能 作用&#xff1a;使用js提供的接口来操…

SQL事务与隔离

事务 事务的定义 事务是完成一个任务的多条语句,这些语句中,只要有一条语句失败,那么整个事务就会失败,即使之前的语句已经执行完毕也会被撤回 举个例子: 我去银行给王哥转钱,这个转钱呢分两个步骤,第一步先把我的钱拿出来,第二步把钱给王哥,那万一刚把我钱拿出来但是没到王…

大数据分析案例-基于LightGBM算法构建公司破产预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

1.网络基础

什么是网络&#xff1f; 信息传递&#xff0c;资源共享 计算机—1946年2月14日—电脑 电流—二进制— 1001—人类语言&#xff08;抽象语言&#xff09;—应用程序—编译—编码—应用层 把人类语言转化为二进制—表示层&#xff08;编码表&#xff09; 网路层——路由器&#x…