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

嵌入式八股文面试题(一)C语言部分

1. 变量/函数的声明和定义的区别?

(1)变量

        定义不仅告知编译器变量的类型和名字,还会分配内存空间。

int x = 10;  // 定义并初始化x
int x;   //同样是定义

         声明只是告诉编译器变量的名字和类型,但并不为它分配内存空间。使用extern来修饰。告诉编译器这个变量的定义在其他地方,这里使用此变量。

extern int x;  // 声明x是一个整型变量

(2)函数

        函数定义提供了函数的具体实现,它包括了函数的返回类型、函数名、参数类型以及函数体的内容。

int add(int a, int b) {return a + b;  // 函数体
}

        函数声明告知编译器函数的返回类型、函数名及其参数类型,但并不提供函数的具体实现。

int add(int a, int b);  // 声明add函数

 2. sizeof和strlen的区别?

(1) sizeof 是一个操作符(与<、>类似),而 strlen 是一个库函数(在#inlcude <string>中)。

(2)sizeof 的参数可以是任何数据类型或变量,而strlen 只能是以‘ \0 ’结尾的字符串作为参数。

(3)编译器在编译时就计算出了sizeof的结果,而strlen 函数必须要在运行时才会被计算出来,其核心是因为strlen 是通过遍历字符串,在遇到 ‘\0’ 就会结束(结果大小不包含‘\0’),而sizeof 则会将其包含在内计算大小。

char str[] = "Hello";
printf("sizeof(str) = %zu\n", sizeof(str));  // 输出6(包括'\0')
printf("strlen(str) = %zu\n", strlen(str));  // 输出5(不包括'\0')

 3. &的用法:引用和取地址。

(1)& 用作取地址符号:表示获取变量的内存地址。

int x = 10;
int *ptr = &x;  // 使用 & 获取 x 的地址,并赋给指针 ptrprintf("x 的地址:%p\n", (void*)&x);  // 输出 x 的内存地址

(2)& 用作引用符号:表示一个变量的引用,即该变量的别名。创建一个引用,引用是变量的别名,它不会创建新的内存空间,而是直接使用原变量的内存。

int x = 10;
int& ref = x;  // ref 是 x 的引用,两个变量共享相同的内存地址ref = 20;  // 通过引用修改 x 的值
printf("x = %d\n", x);  // 输出 x = 20,引用修改了原变量

 4. static关键字。

        static关键字可以修饰变量和函数,对此有着不同给功能。static修饰的变量默认初始化值为0。

变量

(1)在函数内部定义的变量。

        当 static 用于函数内部的局部变量时,它表示该变量的生命周期改变。

        局部变量通常在每次函数调用时被创建并销毁,但使用 static 关键字后,局部变量在函数调用结束后不会销毁,而是保留其值,直到下一次函数调用时继续使用上一次的值。直到程序结束后销毁。

void count_calls() {static int count = 0;  // 静态变量,只初始化一次count++;printf("This function has been called %d times.\n", count);
}int main() {count_calls();  // 输出: This function has been called 1 times.count_calls();  // 输出: This function has been called 2 times.return 0;
}

(2)在函数外部定义的变量。

        当 static 用于函数外部的变量或函数时,它限制了该变量或函数的作用域,使得它只能在当前文件中使用,无法被其他文件访问。对于被static修饰全局变量来说,其他文件无法通过 extern 来引用它。

函数

         当 static 用于函数时,它限制了该函数的作用域,使得它只能在当前文件中使用,无法被其他文件访问。(即只能在当前的C文件中使用,其他文件中无法调用该函数)

        注意:在多线程程序中,使用 static 变量时要小心,因为它们的值会在多个线程之间共享,可能会引发竞态条件。为了保证线程安全,通常需要使用同步机制(如互斥锁)来访问这些静态变量。

5. volatile关键字。

        在 C 和 C++ 中,volatile 是一个非常重要的关键字,它告诉编译器不要优化该变量的读取或写入操作。例如,减少不必要的变量读取或写入,以提高程序的效率。但是,对于某些变量,如硬件寄存器或多线程共享变量,编译器优化可能导致程序行为不符合预期。因此,volatile 被用来告诉编译器:不要对该变量进行优化,每次访问该变量时,都必须从内存中读取最新的值。

        场景:对硬件寄存器进行访问时,都要加上此关键字。

#define STATUS_REGISTER (volatile int*)0x40001000int main() {int status = *STATUS_REGISTER;  // 硬件寄存器的读取,每次都要从内存重新读取// 其他代码
}

6. const关键字。 

        在 C 和 C++ 中,const 关键字用于声明常量或表示某个对象的值不能被修改。const 提供了一种有效的方式来增强程序的可读性、可维护性以及避免意外的修改。常见的有限制常量、指针、数组、函数参数等的修改性。

(1)常量

const int x = 10;  // x 是常量,值不能被修改
x = 20;  // 错误:无法修改常量变量 x

(2)指针

        常量指针:指向常量数据的指针,const 放在 * 之前,表示指向的数据是常量。

        作用:即通过这个指针你不能修改它所指向的数据,但指针本身可以指向其他内存位置。

const int *ptr = &x;  // ptr 是指向常量 int 的指针,不能通过 ptr 修改 x 的值
*ptr = 20;  // 错误:不能通过 ptr 修改值
ptr = &y;   // 合法:可以让 ptr 指向其他位置

        指针常量:指的是指针本身是常量,const 放在 * 之后,表示指针本身是常量。

        作用:即你不能改变指针指向的地址,但指针所指向的数据可以被修改。

int x = 5;
int y = 10;
int *const ptr = &x;  // ptr 是常量指针,指向 x*ptr = 20;  // 合法:可以通过 ptr 修改 x 的值
ptr = &y;   // 错误:不能改变 ptr 的值(即不能让 ptr 指向 y)

        常量指针指向常量:既不允许修改指针的值(即指针常量),也不允许修改指针所指向的数据(即指向常量的数据)。

const int *const ptr;  // ptr 是常量指针,指向常量 int

(3)数组

        使用 const 可以确保数组中的元素在程序执行过程中保持不变。

const int arr[] = {1, 2, 3, 4};  // arr 中的元素是常量,不能修改
arr[0] = 10;  // 错误:不能修改 arr 中的元素

(4)函数参数

        在函数参数中使用 const,可以确保函数不会意外修改传入的参数,特别是对于指针或引用类型的参数。这有助于增加代码的可维护性和安全性。

void print(const int &x) {printf("%d", x);  // 不能修改 x
}void foo(const int *ptr) {*ptr = 10;  // 错误:不能修改 ptr 指向的数据
}

7. inline关键字。 

        在 C/C++ 中,inline 关键字用于请求编译器将函数的代码插入到调用该函数的地方,而不是通过传统的函数调用机制(即通过栈保存返回地址、传递参数等)。它的目的是提高代码的执行效率,特别是对于那些调用频繁且函数体较小的函数。递归函数不能内联。

#include <iostream>inline int square(int x) {return x * x;
}int main() {int a = 5;int result = square(a);  // 在这里会将 square(a) 展开为 a * astd::cout << result << std::endl;  // 输出 25return 0;
}

        编译器会尽可能地将内联函数的代码嵌入到调用点。但是如果内联函数太复杂,编译器可能不会进行内联优化,尽管我们声明了 inline。编译器有最终决定权,可能会忽略 inline 关键字的请求。 

    8. C中的 malloc 和C++中的 new 有什么区别?

    在 C 和 C++ 中,mallocnew 都用于动态内存分配,但它们有一些重要的区别。

    (1)new、delete是操作符,可以重载,只能在C++中使用。而 malloc、函数 free是函数,在C++和C中都可以使用,在stdlib头文件中。

    (2)new 在 C++ 中它不仅分配内存,还会调用类的构造函数,delete调用类的析构函数(如果是类类型的话)。而 malloc 和 free 函数仅仅是分配内存和释放内存,并不执行构造和析构函数。

    (3)new、delete返回的是某种数据类型的指针,而malloc和free返回的是void类型的指针(因此需要强制类型转换)。

    (4)malloc申请的内存要使用free来释放,new申请的内存要使用delete来释放,两者不能混用,因为底层实现原理不同。

    (5)malloc申请内存失败时会返回NULL,所以判断返回值来判断内存是否申请成功。而new申请内存失败时会抛出异常。

    int* arr = (int*)malloc(10 * sizeof(int));  // 分配 10 个整数的空间
    free(arr);  // 释放内存int* arr = new int[10];  // 分配 10 个整数的数组,自动初始化
    delete[] arr;            // 释放数组,自动调用析构函数

    9. 程序中的内存分配方式。

    (1)栈区:对于所有的局部变量(除了局部静态变量),都存储在栈区中,栈内存的分配和释放由编译器自动管理,不需要程序员显式调用。

    (2)堆区:使用malloc/new创建的内存都存储在堆区,需要程序员手动创建和释放。如果分配的内存,使用完成后就必须要记得释放,不然会造成内存泄漏的风险!

    (3)静态存储区:用于存放全局变量和静态变量,内存在程序编译时就已经分配好了,这块内存在程序整个运行期间都存在。

     10. 什么是野指针,如何避免?

            野指针(Dangling Pointer)是指指向已经被释放或未初始化的内存位置的指针。野指针是指针操作中常见的错误之一,它会导致程序崩溃、内存泄漏或者不预期的行为。平时使用时一定要避免野指针的情况。如下所示:

    // 1. 使用销毁的指针
    int *ptr = new int(10);  // 在堆上分配内存
    delete ptr;               // 释放内存
    // ptr 现在是一个野指针,因为它指向已释放的内存//第二种情况:
    int* createPointer() {int x = 10;  // 局部变量 xreturn &x;  // 返回指向 x 的指针
    }
    int main() {int* p = createPointer();  // p 指向局部变量 xprintf("%d\n", *p);  // 试图访问已超出作用范围的变量return 0;
    }
    /* 原因:局部变量在函数执行完毕后销毁,指针p获取到的是销毁空间的变量,会导致崩溃*/// 2. 使用未初始化的指针
    int *ptr;  // 未初始化的指针
    *ptr = 10; // 访问未初始化的指针,导致未定义行为// 3. 超过作用域。
    

    野指针的产生原因及解决办法如下:

    (1)指针变量未初始化。解决办法:指针声明时初始化,可以是具体位置,也可以指向NULL。

    int *ptr = NULL;  // C语言中使用NULL初始化
    

    (2)使用被free或delete释放的指针。解决办法:指针指向的内存空间被释放后,应该指向NULL。

    int *p=(int *)malloc(sizeof(int));
    free(p);p=NULL;
    

    (3)指针越界。解决办法:在变量的作用域结束前释放掉变量的地址空间并且指向NULL。

     11. 什么是函数指针和指针函数?

    (1)函数指针

            是指向函数的指针。可以通过它调用函数,使得程序在运行时能够动态地决定调用哪个函数。这在实现回调函数、函数数组等情况下非常有用。

    定义一个函数指针:

    返回类型 (*指针变量名)(参数类型1, 参数类型2, ...);
    

    使用举例: 

    #include <iostream>// 定义一个普通函数
    int add(int a, int b) {return a + b;
    }int main() {// 声明一个指向函数的指针int (*func_ptr)(int, int);// 将指针指向 add 函数func_ptr = &add;// 通过函数指针调用函数int result = func_ptr(3, 4);  // 调用 add(3, 4)std::cout << "Result: " << result << std::endl;  // 输出 7return 0;
    }
    

    (2)指针函数

            指返回指针的函数。它是一个普通的函数,只是返回值类型是一个指针。

    返回类型 *函数名(参数类型1, 参数类型2, ...);
    

    12. 指针的大小。

            在 C/C++ 中,指针的大小是由编译器和系统架构决定的。指针本身的大小与它所指向的数据类型(intdoublechar 等)无关,而是与计算机的位数有关。在 32 位系统中,指针通常占 4 字节(32 位),在 64 位系统中,指针通常占 8 字节(64 位)。

    13. 内存对齐。

            内存对齐指计算机中数据在内存中的存储方式,确保数据结构的成员按照特定规则排列,以提高访问效率。 

    (1)为什么要进行内存对齐?

            CPU访问内存时,如果数据地址是对齐的(比如4字节对齐),那么访问速度会更快。如果数据没有对齐,可能需要多次访问内存,甚至导致错误。尤其是在不同的硬件平台上,对齐要求可能不同,所以编译器会自动进行内存对齐优化。

    (2)对齐规则。

           通常,每个数据类型的对齐要求是其自身的大小。比如,int通常是4字节,所以它需要4字节对齐;double是8字节,需要8字节对齐。结构体的对齐要求则是其成员中最大的对齐值。结构体的总大小需要是对齐值的整数倍,所以在成员之间可能会插入填充字节。

    (3)如何减少填充?

            对于结构体而言,调整成员顺序可以优化结构体大小。如下所示:

    //字节大小为24
    struct MyStruct {int a;      // 4 字节,对齐值 4double b;   // 8 字节,对齐值 8char c;     // 1 字节,对齐值 1
    };//字节大小为16
    struct OptimizedStruct {double b;   // 8 字节,对齐值 8int a;      // 4 字节,对齐值 4char c;     // 1 字节,对齐值 1
    };

    14. 结构体和联合体中成员所占内存大小。 

    (1)内存分配。

            结构体中的每个成员都有自己的内存空间,所有成员的内存是按顺序排列的。

            联合体中的所有成员共享同一块内存空间。

    (2)内存所占大小。

            结构体的总大小是各个成员大小的总和(可能会有填充字节以保证字节对齐,结构体的对齐方式通常由其最大成员的对齐要求决定。)。

            联合体无论定义了多少个成员,内存大小总是等于其最大成员的大小。

    举例:

    #include <iostream>
    //结构体
    struct MyStruct { int a;      // 4 bytesdouble b;   // 8 byteschar c;     // 1 byte
    };struct MyStruct2 { int a;      // 4 byteschar c;     // 1 bytedouble b;   // 8 bytes    
    };//联合体
    union MyUnion {int a;      // 4 bytesdouble b;   // 8 byteschar c;     // 1 byte
    };int main() {MyStruct  s1 = {1, 3.14, 'A'};MyStruct2 s2 = {1, 3.14, 'A'};MyUnion u={10,2.2,'C'};std::cout << "Size of struct: " << sizeof(s1) << " bytes" << std::endl;  //大小为24字节。std::cout << "Size of struct: " << sizeof(s2) << " bytes" << std::endl;  //大小为16字节。std::cout << "Size of union: " << sizeof(u) << " bytes" << std::endl;   //大小为8字节。return 0;
    }
    

    结构体大小分析:以使得结构体的总大小是 8最大成员所占字节的倍数。

    • int a 占用 4 字节。插入 4 字节填充,使 double b 从 8 字节边界开始。

    • double b 占用 8 字节。

    • char c 占用 1 字节。插入 7 字节填充,使结构体总大小为 8 的倍数。 

    • 大小:4+4+8+1+7=24。

    15. 数组和链表的区别。

    (1)数组的地址空间是连续的,而链表的地址空间不是连续的。

    (2)数组大小固定,而链表的大小不固定。

    (3)数组的访问速度更快。数组直接可以使用下标进行访问,而链表则需要遍历访问。

    (4)链表增删改查的速度更快。

    (5)数组适用于数据量固定或变化不大,且需要频繁随机访问的场景。链表适合需要频繁插入和删除,不需要随机访问的场景。

    16. define和typedef的区别。 

    (1)#define 是 C/C++ 中的预处理指令,它在编译之前由预处理器处理,进行简单的文本替换。适合定义常量、宏或代码片段,但不安全且难以调试。

    ●特点:不进行类型错误检查,只是简单的文本替换。可以定义常量、函数宏或代码片段。

    #define PI 3.14159          // 定义常量
    #define MAX(a, b) ((a) > (b) ? (a) : (b))  // 定义函数宏int main() {double radius = 5.0;double area = PI * radius * radius;  // 替换为 3.14159 * radius * radiusint max_value = MAX(10, 20);         // 替换为 ((10) > (20) ? (10) : (20))return 0;
    }

    (2)typedef 是 C/C++ 中的关键字,用于为现有类型定义别名。类型安全且易于调试,适合提高代码可读性和维护性。

    ●特点:进行类型检查,是类型安全的。只能用于定义类型别名,不能定义常量或宏。

    typedef unsigned int uint;  // 定义 uint 为 unsigned int 的别名
    typedef int* IntPtr;        // 定义 IntPtr 为 int* 的别名int main() {uint x = 10;            // 等价于 unsigned int x = 10;IntPtr p = &x;          // 等价于 int* p = &x;return 0;
    }

           如果需要类型安全或定义复杂类型别名,优先使用 typedef;如果需要定义常量或宏函数,可以使用 #define

    17. 程序分为几个段?

             通常,程序分为代码段(text)、数据段(data)、BSS段、堆(heap)和栈。具体详情查看本文内容第二章节。

    ●代码段:存储可执行指令(编译后的机器码)。

    ●数据段:通常包括已初始化的全局变量和静态变量。

    ●BSS段:存放未初始化的全局变量和静态变量,或者初始化为0的变量。 

    堆:动态分配的内存(如 malloc)。

    ●栈:局部变量。

    18. 栈和队列的区别?

    (1)核心规则

     

    (2)基本操作

     (3)结构特点

    (4)示例

    19. c文件是如何转为可执行文件的?

    具体详情查看文章:Linux环境下的编译和调试。

    相关文章:

    嵌入式八股文面试题(一)C语言部分

    1. 变量/函数的声明和定义的区别&#xff1f; &#xff08;1&#xff09;变量 定义不仅告知编译器变量的类型和名字&#xff0c;还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型&#xff0c;但并不为它分配内存空间…...

    FPGA的IP核接口引脚含义-快解

    疑问 手册繁琐&#xff0c;怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌&#xff0c;手册确实比较详细但繁琐&#xff0c;如何快速知晓该部分信息&#xff0c;涛tao道长给你们说&#xff0c;简单得很&#xff0c;一般新入门的道友有所不知&#xff0c;往往后面…...

    Web3技术详解

    Web3技术代表着互联网技术的最新进展&#xff0c;它致力于打造一个去中心化的互联网生态系统。以下是对Web3技术的详细解析&#xff1a; 一、Web3技术的核心概念 Web3是第三代互联网技术的代名词&#xff0c;代表着去中心化、区块链驱动和用户自有控制的理念。在Web3的世界中…...

    计算机网络之物理层通信基础(电路交换、报文交换与分组交换)

    一、电路交换 工作原理&#xff1a; 电路交换是在数据传输期间&#xff0c;源结点与目的结点之间建立一条由中间结点构成的专用物理连接线路&#xff0c;并在数据传输结束之前保持这条线路。整个报文的比特流连续地从源点直达终点&#xff0c;好像在一个管道中传送。 特点&am…...

    Linux firewalld开启日志审计功能(2)

    在Firewalld防火墙中启用和配置logdenied选项&#xff0c;记录被拒绝的数据包&#xff08;等同于开启日志功能&#xff09; 效果展示&#xff1a; 1.开启日志记录功能 firewall-cmd --set-log-deniedunicast #重新加载生效配置 firewall-cmd --reload 2.配置rsyslog捕获日志…...

    线程池如何知道一个线程的任务已经执行完成

    一、线程池内部任务执行状态监控 在线程池内部&#xff0c;当我们提交一个任务后&#xff0c;线程池会调度一个工作线程来执行该任务的run方法。确实&#xff0c;当run方法正常结束时&#xff0c;意味着任务已经完成。线程池中的工作线程是同步调用任务的run方法&#xff0c;并…...

    09网络深入连贯篇(D1_彻底理解长连接 短连接(一))

    目录 讲解一&#xff1a;长连接 & 短连接 一、初次见证长连接和短连接 1. 长连接 2. 短连接 二、如何区分当前连接是长连接还是短连接&#xff1f; 三、如何查询长连接和短连接&#xff1f; 四、那么长连接与短连接操作过程又是如何呢&#xff1f; 五、各自优缺点 …...

    ElasticSearch学习笔记-解析JSON格式的内容

    如果需要屏蔽其他项目对Elasticsearch的直接访问操作&#xff0c;统一由一个入口访问操作Elasticsearch&#xff0c;可以考虑直接传入JSON格式语句解析执行。 相关依赖包 <properties><elasticsearch.version>7.9.3</elasticsearch.version><elasticsea…...

    网络计算机的五个组成部分

    单个计算机是无法进行通信的。所以需要借助网络。 下面介绍一些在网络里常见的设备。 一、服务器 服务器是在网络环境中提供计算能力并运行软件应用程序的特定IT设备 它在网络中为其他客户机&#xff08;如个人计算机、智能手机、ATM机等终端设备&#xff09;提供计算或者应用…...

    责任链模式(Chain Responsibility)

    一、定义&#xff1a;属于行为型设计模式&#xff0c;包含传递的数据、创建处理的抽象和实现、创建链条、将数据传递给顶端节点&#xff1b; 二、UML图 三、实现 1、需要传递处理的数据类 import java.util.Date;/*** 需要处理的数据信息*/ public class RequestData {priva…...

    在游戏本(6G显存)上本地部署Deepseek,运行一个14B大语言模型,并使用API访问

    在游戏本6G显存上本地部署Deepseek&#xff0c;运行一个14B大语言模型&#xff0c;并使用API访问 环境说明环境准备下载lmstudio运行lmstudio 下载模型从huggingface.co下载模型 配置模型加载模型测试模型API启动API服务代码测试 deepseek在大语言模型上的进步确实不错&#xf…...

    web-JSON Web Token-CTFHub

    前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…...

    CTF-web: fs.readFileSync特殊利用

    URL类 URL 类是 JavaScript 的内置类&#xff08;或对象&#xff09;&#xff0c;它用于处理和解析 URL&#xff08;统一资源定位符&#xff09;。URL 是 Web API 的一部分&#xff0c;广泛应用于浏览器环境和 Node.js 中。 特性 构造函数: URL 类的构造函数可以接受一个 URL…...

    深入探索 C++17 特征变量模板 (xxx_v)

    文章目录 一、C++类型特征的前世今生二、C++17特征变量模板闪亮登场三、常见特征变量模板的实际应用(一)基本类型判断(二)指针与引用判断四、在模板元编程中的关键作用五、总结与展望在C++的持续演进中,C++17带来了许多令人眼前一亮的特性,其中特征变量模板(xxx_v)以其…...

    时间序列分析(一)——基础概念篇

    一、时间序列的相关概念 定义&#xff1a;时间序列是按时间顺序排列的一系列观测值&#xff0c;通常以固定间隔&#xff08;如秒、天、年&#xff09;记录。而时间序列分析是一种研究按时间顺序排列的数据点的统计方法&#xff0c;发现趋势、季节性波动、周期性和异常等模式&a…...

    贪心与单调栈的艺术:从三道 LeetCode 题看最小字典序问题(316/402/1081)

    前言 欢迎来到我的算法探索博客&#xff0c;在这里&#xff0c;我将通过解析精选的LeetCode题目&#xff0c;与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验&#xff0c;旨在帮助每一位读者提升编程技能&#xff0c;领略算法之美。 &#x1f449;更多高频有趣Lee…...

    rabbitMQ消息转换器

    消息转换器 Spring的消息发送代码接收的消息体是一个Object&#xff1a; 而在数据传输时&#xff0c;它会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象。 只不过&#xff0c;默认情况下Spring采用的序列化方式是J…...

    力扣-字符串-541 反转字符串Ⅱ

    思路 和《反转字符串》的代码类似&#xff0c;只是每次处理2k个 代码 class Solution { public:string reverseStr(string s, int k) {int length s.length();int reverse 0;while(reverse < length){int left, right;if(reverse k < length){left reverse, right…...

    CSS(三)less一篇搞定

    目录 一、less 1.1什么是less 1.2Less编译 1.3变量 1.4混合 1.5嵌套 1.6运算 1.7函数 1.8作用域 1.9注释与导入 一、less 1.1什么是less 我们写了这么久的CSS,里面有很多重复代码&#xff0c;包括通配颜色值、容器大小。那我们能否通过js声明变量来解决这些问题&…...

    GT 接口时钟

    每个 GT 接口需要几个时钟&#xff0c;包括一些共享时钟&#xff0c;这些时钟在位于一个或多个 GT quad 中的绑定 GT*_CHANNEL 单元之间共享。 UltraScale 器件提供高达 128 个 GT*_CHANNEL site 位置&#xff0c;这可能导致在设计中使用几百个时钟。大多数 GT 时钟具…...

    算法日记13:SC41树状数组(区间修改)

    一、题目&#xff1a; 二、题解&#xff1a; 在单点修改中&#xff0c;我们用t[i]来维护原数组2.1:在区间修改中&#xff0c;我们将维护原数组的差分数组 接下来&#xff0c;让我们来回顾一些差分的性质 此时&#xff0c;假设我们需要求 a 1 a 2 a 3 a 4 a1a2a3a4 a1a2a3a…...

    【STM32】串口原理

    单片机有自己的RX&#xff08;接收端&#xff09;&#xff0c;TX&#xff08;发送端&#xff09;&#xff0c;有的需要再共同接一个底线&#xff0c;为了保证有相同的参考电势&#xff0c;数据如果是高电平的话&#xff0c;发送过去也是高电平 1.轮询方式 CPU需要时刻注意发送…...

    libdrm移植到arm设备

    一、环境资源要求 下载libdrm Index of /libdrm 这边使用的是2.4.114版本&#xff0c;版本太高对meson版本要求也很高&#xff0c;为了省事用apt安装meson就不用太高版本了&#xff0c;1.x版本虽然使用makefile编译方便但是太老&#xff0c;对应用支持不太好。 https://dri…...

    【PyTorch】解决Boolean value of Tensor with more than one value is ambiguous报错

    理解并避免 PyTorch 中的 “Boolean value of Tensor with more than one value is ambiguous” 错误 在深度学习和数据科学领域&#xff0c;PyTorch 是一个强大的工具&#xff0c;它允许我们以直观和灵活的方式处理张量&#xff08;Tensor&#xff09;。然而&#xff0c;即使…...

    CS 与 BS 架构的差异

    在数字化的今天&#xff0c;选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式&#xff0c;了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现&#xff0c;当时用户直接从主机获取数据。随着客户端和服务端…...

    一款由 .NET 官方团队开源的电子商务系统 - eShop

    项目介绍 eShop是一款由.NET官方开源的&#xff0c;基于.NET Aspire构建的用于参考学习的服务架构电子商务系统&#xff0c;旨在展示如何利用.NET框架及其相关技术栈构建一个现代化的电子商务网站。该项目采用服务架构&#xff0c;将应用程序分解为多个独立的服务&#xff0c;…...

    项目顺利交付,几个关键阶段

    年前离放假还有10天的时候&#xff0c;来了一个应急项目&#xff0c; 需要在放假前一天完成一个演示版本的项目&#xff0c;过年期间给甲方领导看。 本想的最后几天摸摸鱼&#xff0c;这么一来&#xff0c;非但摸鱼不了&#xff0c;还得加班。 还在虽然累&#xff0c;但也是…...

    springboot简单应用

    快速开发Springboot项目实现简单的增删改查&#xff0c;前期需要准备&#xff1a;idea与postman安装 Maven&#xff0c;MySQL&#xff08;8&#xff09;&#xff0c;JDK(21) 目录 前言 springboot 使用3.0版本&#xff0c;JDK使用21,MySQL使用8版本 开发环境IDEA使用2024版本 …...

    lock 和 synchronized 区别

    一、功能 Lock和Synchronized都是Java中用来解决线程安全问题的工具&#xff0c;它们能够确保多个线程在访问共享资源时的正确性和一致性。 二、特性 基本定义与实现&#xff1a; Synchronized是Java中的一个同步关键字&#xff0c;由JVM实现。Lock是Java中的一个接口&#x…...

    inquirer介绍及配合lerna在Vue中使用示例

    目录 安装基本用法使用多个提示框动态选择&#xff08;动态选项&#xff09;表单式输入配合lerna在Vue中使用示例 Inquirer 是一个用于创建交互式命令行工具的 Node.js 库&#xff0c;常用于收集用户输入。它提供了多种类型的提示框&#xff0c;可以用于创建交互式应用程序&…...

    System类

    作用&#xff1a;有标准输入、标准输出和错误输出流&#xff0c;对外部定义的属性和环境变量的访问&#xff0c;加载文件和库的方法&#xff0c;还有快速复制数组的一部分的实用方法 java.lang.Object继承者 java.lang.System字段摘要 主要常用的是方法 构造方法摘要 Syste…...

    MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)

    MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR) MySQL官方文档&#xff1a; https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html 一. 对比&#xff1a; 在 MySQL 中&#xff0c;处理时间相关的数据类型主要有以下几种&#xff1a;DATE、TIME、…...

    为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?

    为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同&#xff0c;实参前会加前缀&#xff0c;尤其参数很多的情况&#xff0c;可读性很强。例如&#xff1a; [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意&#xff0…...

    Macos安装APOC拓展库

    文章目录 说明错误提示原因分析解决方法 说明 Macos安装APOC核心库 错误提示 There is no procedure with the name apoc.generate.ba registered for this database instance. Please ensure youve spelled the procedure name correctly and that the procedure is prope…...

    用NeuralProphet预测股价:AI金融新利器(附源码)

    作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;我用NeuralProphet模型预测了股票价格&#xff0c;发现其通过结合时间序列分析和神经网络算法&#xff0c;确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优…...

    go-zero学习笔记(三)

    利用goctl生成rpc服务 编写proto文件 // 声明 proto 使用的语法版本 syntax "proto3";// proto 包名 package demoRpc;// golang 包名(可选) option go_package "./demo";// 如需为 .proto 文件添加注释&#xff0c;请使用 C/C 样式的 // 和 /* ... */…...

    【ABB阀门定位器EDP300如何进行自整定】

    ABB阀门定位器EDP300如何进行自整定 自整定前准备 检查安装与连接 确保阀门和定位器安装正确&#xff0c;机械连接牢固&#xff0c;无卡阻或松动。 确认气源压力符合要求&#xff08;通常为1.4~7 bar&#xff09;&#xff0c;气路无泄漏。 确保4~20mA输入信号稳定且接线正确。…...

    Day48_20250130【回校继续打卡】_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II

    Day48_20250130_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II 20250130补完 739.每日温度 题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0…...

    使用 Let‘s Encrypt 和 OpenResty 实现域名转发与 SSL 配置

    在搭建网站或服务时&#xff0c;确保域名的安全性和正确的流量转发是非常重要的。本文将介绍如何使用 Let’s Encrypt 获取免费的 SSL 证书&#xff0c;并将其配置到 OpenResty 中&#xff0c;同时实现特定的域名转发规则。这不仅可以提升网站的安全性&#xff0c;还能优化流量…...

    Spring Boot启动内嵌tocmat原理

    要研究Spring Boot启动内嵌tomcat的原理&#xff0c;就需要先了解一下Spring Boot自动配置的过程&#xff0c;首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时&#xff0c;EnableAutoConfiguration注解被激活&#xff0c;该注解…...

    【系统架构设计师】分布式数据库透明性

    目录 1. 说明2. 分片透明3. 复制透明4. 位置透明5. 逻辑透明&#xff08;局部数据模型透明&#xff09;6.例题6.1 例题1 1. 说明 1.在分布式数据库系统中&#xff0c;分片透明、复制透明、位置透明和逻辑透明是几个重要的基本概念。2.分片透明、复制透明、位置透明和逻辑透明是…...

    MySQL三大日志——binlog、redoLog、undoLog详解

    日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息&#xff0c;能帮助我们进行很多容错及分析工作&#xff0c;其中有三大日志与我们这些开发者息息相关&#xff0c;本文将介绍binlog、redoLog、undoLog三种日志&#xff1a; 1. redoLog 1.1 为什么…...

    ES6 对象扩展:对象简写,对象属性 表达式,扩展运算符 ...,Object.assign,Object.is,用法和应用场景

    1. 对象属性简写 1.1 基本语法 // 传统写法 const name John; const age 25; const user {name: name,age: age };// ES6 简写语法 const user {name,age };1.2 实际应用场景 // 1. 函数返回对象 function createUser(name, age, email) {return {name,age,email}; }// …...

    Markdown 博客写作图片自动上传到 CSDN 与博客园

    背景 目前大部分的博客都是基于 Typora 软件编写&#xff0c;其中的图片都是本地相对路径&#xff0c;以前都手动逐个复制图片上传到 CSDN&#xff0c;但这个过程很繁琐&#xff0c;故想着使用自动上传图片。 目前有以下特点可利用&#xff1a; dotnet-cnblog 工具可自动把本…...

    大模型—Dify本地化部署实战

    Dify本地化部署实战 系统要求 安装 Dify 之前, 请确保你的机器已满足最低安装要求: CPU >= 2 CoreRAM >= 4 GiB本地部署 开始前先简单介绍下部署Dify需要用到的组件,稍微有点多,但放心,有Docker你怕啥? 关系数据库:postgres缓存:Redis向量数据库:支持weaviate…...

    Java抽象类和接口的区别

    一、抽象类 当一个类中没有包含足够的信息以描绘一个具体的对象时&#xff0c;这样的类就是抽象类&#xff1b;“抽象类”是用关键字 abstract 修饰的&#xff0c;抽象类中有一种特殊方法&#xff0c;即用abstract 关键字来修饰的方法&#xff0c;这些方法被称为“抽象方法” …...

    基于YUV的色相调节(二)

    文章目录 量纲范围归一化归一化因子&#xff1a; U m , V m U_m, V_m Um​,Vm​归一化因子&#xff1a; U m a x , V m a x U_{max}, V_{max} Umax​,Vmax​ 接上一篇&#xff1a;基于YUV的色相调节&#xff08;一&#xff09; 量纲范围归一化 正常情况下UV的量纲范围不一样&…...

    【QT笔记】使用QScrollArea实现多行文本样式显示

    目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…...

    【自然语言处理】TextRank 算法提取关键词(Python实现)

    文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法&#xff0c;主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性&#xff0c;类似于 Google 的 PageRank 算法。Tex…...

    八大排序算法细讲

    目录 排序 概念 运用 常见排序算法 插入排序 直接插入排序 思想&#xff1a; 步骤&#xff08;排升序&#xff09;: 代码部分&#xff1a; 时间复杂度&#xff1a; 希尔排序 思路 步骤 gap的取法 代码部分&#xff1a; 时间复杂度&#xff1a; 选择排序 直接选…...