[2-02-02].第59節:功能函數 - 函數基礎

服務器端操作學習大綱


一、函數基礎

需求場景

  • 在shell腳本的編寫過程中,我們經常會遇到一些功能代碼場景:多條命令組合在一起,實現一個特定的功能場景邏輯、一些命令在腳本內部的多個位置頻繁出現。在這些場景的代碼量往往不多,但是頻繁使用的話,會導致腳本的整體邏輯脈絡比較松散和框架散亂,所以我們需要一種腳本邏輯,不僅僅能夠滿足松散代碼的功能目的,還能精簡重復的代碼。函數就是來滿足這種場景的解決方案 – 而函數,也是所謂的面向對象編程的一種表現樣式

什么是函數:

  • 所謂的函數,本質上就是一段能夠滿足特定功能的代碼塊。一旦定義好函數代碼后,我們就可以在腳本的很多位置隨意的使用。
    定義功能代碼塊的動作叫函數定義,使用函數代碼的動作叫函數調用

函數的優勢:

  • 代碼模塊化,調用方便,節省內存
  • 代碼模塊化,代碼量少,排錯簡單
  • 代碼模塊化,可以改變代碼的執行順序

二、定義簡單函數:

2.1.基本語法

  • 樣式1:定義函數:
    function 函數名{		函數體				}	
  • 樣式2:簡約格式
函數名() {		函數體				
}

2.2.注意事項:

  • function 的作用和 () 的作用是一樣的,都是定義一個函數
  • 函數的名稱是自定義的,而且在腳本范圍內必須唯一
  • 函數體內是普通的能夠正常執行的命令,命令的執行流程符合順序邏輯

2.3.函數調用:

  • 函數名
  • 注意:
    • 函數名出現在任何位置,就代表在該位置調用函數內代碼塊的執行
    • 函數名一般在函數定義后調用,否則的話會發生報錯

2.4.簡單實踐:

實踐1-標準函數的實踐

  • 1.簡單函數的定義與調用:
[root@localhost ~]# cat function_simple_test.sh
#!/bin/bash
# 定制一個函數,提示腳本的使用方式
function Usage {echo -e "\e[31m腳本的使用幫助信息: xxx\e[0m"
}# 定制腳本使用邏輯
if [ $# -eq 1 ]
thenecho "您輸入的腳本參數是1個"
elseUsage
fi
腳本執行效果
[root@localhost ~]# /bin/bash function_simple_test.sh
腳本的使用幫助信息: xxx
[root@localhost ~]# /bin/bash function_simple_test.sh aa
您輸入的腳本參數是1個
[root@localhost ~]# /bin/bash function_simple_test.sh aa bb
腳本的使用幫助信息: xxx

實踐2-變種函數的實踐

[root@localhost ~]# cat function_simple_test2.sh
#!/bin/bash
# 功能:簡單函數的定義和調用# 定制一個函數,提示腳本的使用方式
Usage() {echo -e "\e[31m腳本的使用幫助信息: xxx\e[0m"
}# 定制腳本使用邏輯
if [ $# -eq 1 ]
thenecho "您輸入的腳本參數是1個"
elseUsage
fi
腳本執行效果
[root@localhost ~]# /bin/bash function_simple_test2.sh
腳本的使用幫助信息: xxx
[root@localhost ~]# /bin/bash function_simple_test2.sh aa
您輸入的腳本參數是1個
[root@localhost ~]# /bin/bash function_simple_test2.sh aa bb
腳本的使用幫助信息: xxx

實踐3-函數的調用順序和名稱唯一實踐

  • 功能:簡單函數的定義和調用
[root@localhost ~]# cat function_simple_test3.sh
#!/bin/bash# 定制一個函數,提示腳本的使用方式
Usage() {echo -e "\e[31m腳本的使用幫助信息: xxx\e[0m"
}
echo "第一次調用效果: "
Usage# 定制同名的函數,提示腳本的使用方式
Usage() {echo -e "\e[31m腳本的使用幫助信息-------: xxx\e[0m"
}# 定制腳本使用邏輯
if [ $# -eq 1 ]
then# 調用一個后面才會生成的函數func
elseUsage
fi# 定制一個函數
func() {echo "您輸入的腳本參數是1個"
}
  • 2.結果:
[root@localhost ~]# /bin/bash function_simple_test3.sh
第一次調用效果:
腳本的使用幫助信息: xxx
腳本的使用幫助信息-------: xxx
[root@localhost ~]# /bin/bash function_simple_test3.sh a
第一次調用效果:
腳本的使用幫助信息: xxx
function_simple_test3.sh:行18: func: 未找到命令
  • 3.總結:
    • 函數名稱重復的話,會導致同名函數被覆蓋
    • 函數在沒有定義前調用的話,會導致異常報錯

三、定義傳參函數

3.1.簡介

  • 簡單的函數定義和調用的實踐,我們只能實現固定內容的輸出,不具有靈活性。其實函數作為shell腳本內部的小腳本也支持腳本傳參的一系列能力

3.2.定義傳參函數:

a.語法:

函數名() {		函數體	${變量名}			}

b.注意:

  • 注意:函數體內通過 ${變量名} 來實現函數體的功能通用性

3.3.調用傳參函數:

a.語法:

	函數名 參數			

b.注意:

  • 函數在調用的時候,接收一些參數并傳輸到函數體內部

3.4.案例:

實踐1-傳參函數實踐

  • 傳參函數定義和調用
[root@localhost ~]# cat function_arg_input.sh
#!/bin/bash
# 功能:傳參函數定義和調用# 定制數據運算的函數
add_func() {echo $(( $1 + $2 ))
}
sub_func() {echo $(( $1 - $2 ))
}
mul_func() {echo $(( $1 * $2 ))
}
div_func() {echo $(( $1 / $2 ))
}echo -n "4+3="; add_func 4 3
echo -n "4-3="; sub_func 4 3
echo -n "4*3="; mul_func 4 3
echo -n "4/3="; div_func 4 3
  • 2.腳本執行效果
[root@localhost ~]# /bin/bash function_arg_input.sh
4+3=7
4-3=1
4*3=12
4/3=1

3.5.腳本傳參

a.簡介

  • 傳參函數定義和調用的實踐,實現了函數層面的靈活性,但是它受到函數調用本身的參數限制。往往這些參數我們需要在腳本執行的時候傳遞進去,從而實現腳本功能的靈活性。

b.基本語法

  • 定義函數:
    函數名() {		函數體	${函數參數}			}
  • 調用函數:函數名 ${腳本參數}
  • 腳本執行:/bin/bash /path/to/scripts.sh arg

c.注意:

  • 由于腳本內部調用腳本參數和函數體內調用函數參數都遵循位置變量的使用,所以,一般情況下,我們會借助于臨時變量的方式接收各自的參數,從而避免引起誤會

d.實踐1-腳本傳參函數實踐

查看腳本內容
[root@localhost ~]# cat function_arg_scripts.sh
#!/bin/bash
# 功能:腳本傳參函數調用# 定制數據運算的函數
add_func() {echo $(( $1 + $2 ))
}
sub_func() {echo $(( $1 - $2 ))
}
mul_func() {echo $(( $1 * $2 ))
}
div_func() {echo $(( $1 / $2 ))
}[ $# -ne 2  ] && echo "必須傳遞兩個數字參數" && exit
echo -n "$1+$2="; add_func $1 $2
echo -n "$1-$2="; sub_func $1 $2
echo -n "$1*$2="; mul_func $1 $2
echo -n "$1/$2="; div_func $1 $2注意:這種簡單的腳本傳參函數調用,導致大量的位置參數,容易引起混亂,需要改造
  • 2.腳本執行效果
[root@localhost ~]# /bin/bash function_arg_scripts.sh
必須傳遞兩個數字參數
[root@localhost ~]# /bin/bash function_arg_scripts.sh 5 4
5+4=9
5-4=1
5*4=20
5/4=1

e.實踐2-實踐2-腳本傳參函數進階實踐

查看腳本內容
[root@localhost ~]# cat function_arg_scripts2.sh
#!/bin/bash
# 功能:傳參函數定義和調用# 接收腳本傳參
arg1=$1
arg2=$2
# 定制數據運算的函數
add_func() {num1=$1num2=$2echo $(( ${num1} + ${num2} ))
}
sub_func() {num1=$1num2=$2echo $(( ${num1} - ${num2} ))
}
mul_func() {num1=$1num2=$2echo $(( ${num1} * ${num2} ))
}
div_func() {num1=$1num2=$2echo $(( ${num1} / ${num2} ))
}[ $# -ne 2  ] && echo "必須傳遞兩個數字參數" && exit
echo -n "${arg1}+${arg2}="; add_func ${arg1} ${arg2}
echo -n "${arg1}-${arg2}="; sub_func ${arg1} ${arg2}
echo -n "${arg1}*${arg2}="; mul_func ${arg1} ${arg2}
echo -n "${arg1}/${arg2}="; div_func ${arg1} ${arg2}
腳本執行效果
[root@localhost ~]# /bin/bash function_arg_scripts2.sh
必須傳遞兩個數字參數
[root@localhost ~]# /bin/bash function_arg_scripts2.sh 7 5
7+5=12
7-5=2
7*5=35
7/5=1

四、函數退出

4.1.簡介

  • 我們可以將函數代碼塊,看成shell腳本內部的小型腳本,所以說函數代碼塊也會有執行狀態返回值。對于函數來說,它通常支持兩種種狀態返回值的樣式
  • 樣式1-默認的退出狀態:
    • 默認情況下,函數的退出狀態是函數體內的最后一條命令的退出狀態,可以通過 $? 來獲取
  • 樣式2-return定制狀態返回值:
    • 在函數體內部,通過return定制狀態返回值的內容

4.2.注意:

  • return的狀態返回值必須盡快使用,否則會被其他return的值覆蓋
  • return的狀態返回值必須在 0-255,否則失效

4.3.簡單實踐:

實踐1-默認退出狀態

[root@localhost ~]# cat function_exit_status1.sh
#!/bin/bash
# 功能:函數默認狀態返回值# 定制成功運行的函數
ok_func() {echo -e "\e[31m腳本的使用幫助信息: xxx\e[0m"
}
# 定制一個運行失敗的函數
err_func() {666666
}
# 定制腳本使用邏輯
if [ $# -eq 1 ]
thenerr_funcecho "錯誤函數的執行狀態返回值: " $?
elseok_funcecho "成功函數的執行狀態返回值: " $?
fi
腳本執行效果
[root@localhost ~]# /bin/bash function_exit_status1.sh
腳本的使用幫助信息: xxx
成功函數的執行狀態返回值:  0
[root@localhost ~]# /bin/bash function_exit_status1.sh aa
function_exit_status1.sh:行10: 666666: 未找到命令
錯誤函數的執行狀態返回值:  127
[root@localhost ~]# lll; echo $?
bash: lll: 未找到命令
127
結果顯示:對于異常的函數來說,默認的狀態返回值有安全隱患

實踐2-return定制函數的返回值實踐

[root@localhost ~]# cat function_exit_status2.sh
#!/bin/bash
# 功能:return定制函數狀態返回值# 定制成功運行的函數
ok_func() {echo -e "\e[31m腳本的使用幫助信息: xxx\e[0m"# 定制超范圍的狀態返回值return 666
}
# 定制一個運行失敗的函數
err_func() {666666# 定制狀態返回值return 222
}
# 定制腳本使用邏輯
if [ $# -eq 1 ]
thenerr_funcecho "錯誤函數的執行狀態返回值: " $?
elseok_funcecho "成功函數的執行狀態返回值: " $?
fi
腳本執行效果
[root@localhost ~]# /bin/bash function_exit_status2.sh
腳本的使用幫助信息: xxx
成功函數的執行狀態返回值:  154
[root@localhost ~]# /bin/bash function_exit_status2.sh aa
function_exit_status2.sh:行12: 666666: 未找到命令
錯誤函數的執行狀態返回值:  222
結果顯示:return的狀態返回值范圍必須滿足要求

五、綜合案例

5.1.信息采集

  • 腳本實踐-采集系統負載信息
[root@localhost ~]# cat function_systemctl_load.sh
#!/bin/bash
# 功能:采集系統負載信息
# 版本:v0.3# 定制資源類型
resource_type=(CPU MEM)# 定制cpu信息輸出函數
cpu_info() {cpu_attribute=(1 5 15)cpu_load=($(uptime | tr -s " " | cut -d " " -f 11-13 | tr "," " "))echo -e "\e[31m\t系統CPU負載信息\e[0m"echo -e "\e[32m================================"for index in ${!cpu_attribute[@]}doecho "CPU ${cpu_attribute[$index]} min平均負載為: ${cpu_load[$index]}" doneecho -e "================================\e[0m"	
}
# 獲取內存相關屬性信息
mem_info() {free_attribute=(總量 使用 空閑)free_info=($(free -m | grep Mem | tr -s " " | cut -d " " -f 2-4))echo -e "\e[31m\t系統內存負載信息\e[0m"echo -e "\e[32m================================"for index in ${!free_attribute[@]}doecho "內存 ${free_attribute[$index]} 信息為: ${free_info[$index]} M" doneecho -e "================================\e[0m"
}# 服務的操作提示
echo -e "\e[31m---------------查看資源操作動作---------------1: CPU  2: MEM
-------------------------------------------"'\033[0m'
# 選擇服務操作類型
while true
doread -p "> 請輸入要查看的資源信息類型: " resource_idechocase ${resource_type[$resource_id-1]} in"CPU")cpu_info;;"MEM")mem_info;;*)echo -e "\e[31m\t請輸入有效的信息類型\e[0m";;esac
done
  • 2.測試:
腳本使用效果
[root@localhost ~]# /bin/bash function_systemctl_load.sh
---------------查看資源操作動作---------------1: CPU  2: MEM
-------------------------------------------
> 請輸入要查看的資源信息類型: 1系統CPU負載信息
================================
CPU 1 min平均負載為: 0.00
CPU 5 min平均負載為: 0.01
CPU 15 min平均負載為: 0.05
================================
> 請輸入要查看的資源信息類型: 2系統內存負載信息
================================
內存 總量 信息為: 3770 M
內存 使用 信息為: 237 M
內存 空閑 信息為: 3290 M
================================
> 請輸入要查看的資源信息類型: 3請輸入有效的信息類型
> 請輸入要查看的資源信息類型: ^C
[root@localhost ~]#

5.2.環境部署

a.需求

  • 定制kubernetes環境部署管理的功能腳本改造
    • 功能函數實現
    • 擴充while循環執行功能
    • 增加q退出環境功能

b.腳本內容

  • 查看腳本內容
[root@localhost ~]# cat function_kubernetes_manager.sh
#!/bin/bash
# 功能:定制kubernetes環境部署管理的功能
# 版本:v0.2# 定制數組變量
env_array=(base ha k8s_base master slave)# 監控平臺的信息提示
menu(){echo -e "\e[31m     歡迎使用kubernetes部署平臺"echo -e "\e[32m-----------請選擇部署階段-----------"echo -e " 1: 基礎環境部署"echo -e " 2: 高可用環境部署"echo -e " 3: kubernetes基礎環境部署"echo -e " 4: 主角色環境部署"echo -e " 5: 從角色環境部署"echo -e " q: 退出"echo -e "----------------------------------\033[0m"
}
# 定制基礎環境
os_base_func(){echo -e "\e[31m開始基礎環境部署..."echo "1 執行跨主機免密碼操作"echo "2 執行時間同步操作"echo "3 執行內核配置操作"echo -e "4 執行容器私有倉庫部署操作\e[0m"
}# 定制高可用環境
ha_func(){echo -e "\e[31高可用環境部署..."echo "1 執行高可用環境部署操作"echo -e "2 執行負載均衡環境部署操作\e[0m"
}# 定制k8s基礎環境
k8s_base_func(){echo -e "\e[31mkubernetes基礎環境部署..."echo "1 執行證書管理操作"echo "2 執行etcd環境部署操作"echo -e "3 執行集群證書配置操作\e[0m"
}# 定制主角色環境
master_func(){echo -e "\e[31m主角色環境部署..."echo "1 執行apiserver環境部署操作"echo "2 執行scheduler環境部署操作"echo "3 執行controller環境部署操作"echo "4 執行認證配置操作"echo "5 執行容器環境部署操作"echo "6 執行kubelet環境部署操作"echo -e "7 執行kube-proxy環境部署\e[0m"
}
# 定制從角色環境
slave_func(){echo -e "\e[31m主角色環境部署..."echo "1 執行容器環境部署操作"echo "2 執行kubelet環境部署操作"echo -e "3 執行kube-proxy環境部署\e[0m"
}
# 定制錯誤提示信息
usage_func(){echo -e "\e[31m請輸入有效的功能場景標識\e[0m"
}# 腳本內容的判斷
while true
do# 定制業務邏輯menuread -p "請輸入功能標識: " env_idif [ ${env_id} == "q" ];thenexitelse# 執行配套業務邏輯case "${env_array[$env_id-1]}" in"base")os_base_func;;"ha")ha_func;;"k8s_base")k8s_base_func;;"master")master_func;;"slave")slave_func;;*)usage_func;;esacfi
done
  • 2.測試:
[root@localhost ~]# /bin/bash function_kubernetes_manager.sh歡迎使用kubernetes部署平臺
-----------請選擇部署階段-----------1: 基礎環境部署2: 高可用環境部署3: kubernetes基礎環境部署4: 主角色環境部署5: 從角色環境部署q: 退出
----------------------------------
請輸入功能標識: 6
請輸入有效的功能場景標識歡迎使用kubernetes部署平臺
-----------請選擇部署階段-----------1: 基礎環境部署2: 高可用環境部署3: kubernetes基礎環境部署4: 主角色環境部署5: 從角色環境部署q: 退出
----------------------------------
請輸入功能標識: 5
主角色環境部署...
1 執行容器環境部署操作
2 執行kubelet環境部署操作
3 執行kube-proxy環境部署歡迎使用kubernetes部署平臺
-----------請選擇部署階段-----------1: 基礎環境部署2: 高可用環境部署3: kubernetes基礎環境部署4: 主角色環境部署5: 從角色環境部署q: 退出
----------------------------------
請輸入功能標識: q

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910313.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RA4M2開發涂鴉模塊CBU(6)----RA4M2驅動涂鴉CBU模組

RA4M2開發涂鴉模塊CBU.6--RA4M2驅動涂鴉CBU模組 概述視頻教學樣品申請參考程序硬件準備接口生成UARTUART屬性配置R_SCI_UART_Open()函數原型回調函數user_uart_callback0 ()變量定義按鍵回調更新按鍵狀態DP-LED 同步長按進入配網涂鴉協議解析主循環任務調度 概述 本方案基于瑞…

MiniMax-M1: Scaling Test-TimeCompute Efficiently with I Lightning Attention

我們推出了MiniMax-M1,這是全球首個開源權重、大規模混合注意力推理模型。MiniMax-M1采用了混合專家系統(Mixture-of-Experts,簡稱MoE)架構,并結合了閃電注意力機制。該模型是在我們之前的MiniMax-Text-01模型&#xf…

Appium+python自動化(二十六) -Toast提示

在日常使用App過程中,經常會看到App界面有一些彈窗提示(如下圖所示)這些提示元素出現后等待3秒左右就會自動消失,那么我們該如何獲取這些元素文字內容呢? Toast簡介 Android中的Toast是一種簡易的消息提示框。 當視圖…

【信號與系統三】離散時間傅里葉變換

上一講我們講述了連續時間傅里葉變換,這一講同理來個離散時間傅里葉變換。 和上講模塊類似 5.1離散時間傅里葉變換 這一式子就是離散時間傅里葉變換對 5.2周期信號的傅里葉變換 同理,由于之前第一講講到: 可以推出: 舉個例子&am…

Python應用石頭剪刀布練習初解

大家好!作為 Python 初學者,尋找一個既簡單又有趣的項目來練習編程技能是至關重要的。今天,我將向大家介紹一個經典的編程練習——石頭剪刀布游戲,它可以幫助你掌握 Python 的基本概念,如條件語句、隨機數生成和用戶輸入處理等。 …

私有規則庫:企業合規與安全的終極防線

2.1 為什么企業需要私有規則庫?——合規與安全的最后防線 真實案例:2023年某跨境電商因員工泄露內部檢測規則,導致黑產繞過風控系統,損失1200萬+ 企業規則庫的三大剛需: 行業合規: 金融行業需符合《個人金融信息保護技術規范》 醫療行業需滿足HIPAA患者數據脫敏要求 業…

長尾關鍵詞優化SEO核心策略

內容概要 本文旨在系統解析長尾關鍵詞在搜索引擎優化中的核心地位,為讀者提供從理論到實踐的全面指南。文章首先探討長尾關鍵詞的基礎作用,幫助理解其在提升網站流量質量中的價值。接著,深入介紹精準定位低搜索量、高轉化率關鍵詞的策略&…

騰訊云事件總線:構建毫秒級響應的下一代事件驅動架構

摘要 事件總線(EventBridge)作為云原生架構的核心樞紐,其性能與可靠性直接影響企業系統彈性。騰訊云事件總線基于TGW云網關底層能力重構,實現單節點吞吐量提升125%、故障恢復時間降至4秒級(行業平均>30秒&#xff0…

PyTorch 中mm和bmm函數的使用詳解

torch.mm 是 PyTorch 中用于 二維矩陣乘法(matrix-matrix multiplication) 的函數,等價于數學中的 A B 矩陣乘積。 一、函數定義 torch.mm(input, mat2) → Tensor執行的是兩個 2D Tensor(矩陣)的標準矩陣乘法。 in…

Qt 解析復雜對象構成

Qt 解析復雜對象構成 dumpStructure 如 QComboBox / QCalendarWidget / QSpinBox … void Widget::Widget(QWidget* parent){auto c new QCalendarWidget(this);dumpStructure(c,4); }void Widget::dumpStructure(const QObject *obj, int spaces) {qDebug() << QString…

山姆·奧特曼:從YC到OpenAI,硅谷創新之星的崛起

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 山姆奧特曼&#xff1a;從YC到OpenAI&#xff0c;硅谷創新之星的崛起 在人工智能革命…

PHP語法基礎篇(五):流程控制

任何 PHP 腳本都是由一系列語句構成的。一條語句可以是一個賦值語句&#xff0c;一個函數調用&#xff0c;一個循環&#xff0c;一個條件語句或者甚至是一個什么也不做的語句&#xff08;空語句&#xff09;。語句通常以分號結束。此外&#xff0c;還可以用花括號將一組語句封裝…

怎么隱藏關閉或恢復顯示輸入法的懸浮窗

以搜狗輸入法為例&#xff0c;隱藏輸入法懸浮窗 懸浮窗在輸入法里的官方叫法為【狀態欄】。 假設目前大家的輸入法相關顯示呈現如下狀態&#xff1a; 那我們只需在輸入法懸浮窗&#xff08;狀態欄&#xff09;的任意位置鼠標右鍵單擊&#xff0c;調出輸入法菜單&#xff0c;就…

Electron (02)集成 SpringBoot:服務與桌面程序協同啟動方案

本篇是關于把springboot生成的jar打到electron里&#xff0c;在生成的桌面程序啟動時springboot服務就會自動啟動。 雖然之后并不需要這種方案&#xff0c;更好的是部署[一套服務端&#xff0c;多個客戶端]...但是既然搭建成功了&#xff0c;也記錄一下。 前端文件 1、main.js…

2025年計算機應用與神經網絡國際會議(CANN 2025)

2025 International Conference on Computer Applications and Neural Networks &#xff08;一&#xff09;會議信息 會議簡稱&#xff1a;CANN 2025 大會地點&#xff1a;中國重慶 收錄檢索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 &#xff08;二&#x…

振動分析中的低頻噪聲問題:從理論到實踐的完整解決方案

前言 在振動監測和結構健康監測領域&#xff0c;我們經常需要從加速度信號計算速度和位移。然而&#xff0c;許多工程師在實際應用中都會遇到一個令人困擾的問題&#xff1a;通過積分計算得到的速度和位移頻譜中低頻噪聲異常放大。 本文將深入分析這個問題的根本原因&#xf…

ncu學習筆記01——合并訪存

全局內存通過緩存實現加載和存儲過程。其中&#xff0c;L1為一級緩存&#xff0c;每個SM都有自己的L1&#xff1b;L2為二級緩存&#xff0c;L2則被所有SM共有。 數據從全局內存到SM的傳輸過程中&#xff0c;會去L1和L2中查詢是否有緩存。對全局內存的訪問將經過L1&#xff1b;…

2012 - 正方形矩陣

????題目描述 晶晶同學非常喜歡方形&#xff0c;她希望打印出來的字符串也是方形的。老師給了晶晶同學一個字符串"ACM"&#xff0c;晶晶同學突發奇想&#xff0c;如果任意給定義一個整數n&#xff0c;能不能打印出由這個字符串組成的正方形字符串呢&#xff1f;…

C++中set的常見用法

在 C 里&#xff0c;std::set屬于標準庫容器的一種&#xff0c;其特性是按照特定順序存儲唯一的元素。下面為你詳細介紹它的常見使用方法&#xff1a; 1. 頭文件引入 要使用std::set&#xff0c;需要在代碼中包含相應的頭文件&#xff1a; #include <set> 2. 集合的定…

stm32移植freemodbus

1、設置串口 開啟串口中斷 2、設置定時器 已知在freemodbus中默認定義&#xff1a;當波特率大于19200時&#xff0c;判斷一幀數據超時時間固定為1750us&#xff0c;當波特率小于19200時&#xff0c;超時時間為3.5個字符時間。這里移植的是115200&#xff0c;所以一幀數據超時…