C語言之函數和函數庫以及自己制作靜態動態鏈接庫并使用

一:函數的本質

? ? ? ? 1:C語言為什么會有函數

? ? ? ? ? ? ? ? (1)整個程序分為多個源文件,一個文件分為多個函數,一個函數分成多個語句,這就是整個程序的組織形式。這樣的組織好處在于:分化問題、、便于程序編寫、便于分工

? ? ? ? ? ? ? ? (2)函數的出現是人(程序員和架構師)的需要,而不是機器(編譯器、cpu)的需要

? ? ? ? ? ? ? ? (3)函數的目的就是實現模塊話編程

? ? ? ? 2:函數書寫的一般原則
? ? ? ? ? ? ? ? (1)遵循一定的格式。函數的返回類型、函數名、參數列表等

? ? ? ? ? ? ? ? (2)一個函數只做一件事,不能太長也不能太短,原則是一個函數只做一件事

????????????????(3)傳參不宜過多,在ARM體系下,傳參不宜超過四個。如果傳參確實需要多則考慮結構體打包

? ? ? ? ? ? ? ? (4)盡量少碰全局變量,函數最好用傳參返回值來和外部交換數據,不需要用全局變量


? ? ? ? 3:函數是動詞,變量是名詞? ? ? ??

? ? ? ? ? ? ? ? (1)函數將來被編譯成可執行代碼段,變量(主要指全局變量)經過編譯后變成數據或者運行時變成數據。一個程序的運行需要數據和代碼兩方面的結合才能完成

? ? ? ? ? ? ? ? (2)代碼和數據需要彼此配合,代碼是為了加工數據,數據必須借助代碼來起作用。

? ? ? ? 4:函數的實質是:數據處理器

? ? ? ? ? ? ? ? (1)程序的主體是數據,程序運行的主要目標是生成目標數據,程序員寫代碼也是為了目標數據。如何得到目標數據?必須兩個因素:原材料和加工算法。原材料就是程序輸入的數據,加工算法就是程序

? ? ? ? ? ? ? ? (2)程序的編寫和運行就是為了把原數據加工成目標數據,所以程序的實質就是一個數據處理器

? ? ? ? ? ? ? ? (3)函數就是程序的一個縮影,函數的參數列表就是為了給函數輸入原材料數據,函數的返回值和輸出參數就是為了向外部輸出目標數據,函數的函數體內部的那些代碼就是加工算法。

? ? ? ? ? ? ? ? (4)函數在靜止時沒有執行(待在硬盤里),此時只會占用一些存儲空間但是并不會占用資源(cpu+內存);函數的每一次運行時都需要耗費資源(cpu+內存),運行時可以對數據加工生成目標數據;函數運行完成后會釋放占用的資源

? ? ? ? ? ? ? ? (5)整個程序的運行其實就是很多個函數相繼運行的連續過程

二:函數的基本使用

? ? ? ? 1:函數三要素:定義、聲明調用

? ? ? ? ? ? ? ? (1)函數的定義就是函數體、函數的聲明就是函數的原型、函數的調用就是使用函數

????????????????????????

#include <stdio.h>int add(int a,int b);        //函數聲明int main(void)
{int a = 3;int b = 5;int c = 0;c =add(a,b);            //函數調用printf("c = %d\n",c);            //結果8    printf("3+5 = %d\n",add(3+5));  //8          //add函數的返回值作為printf函數的參數return 0;}//函數定義
int add(int a,int b)        //函數名、參數列表、返回值
{return a + b;           //函數體
}

? ? ? ? ? ? ? ? ?(2)函數定義是函數的根本,函數定義中的函數名表示了這個函數在內存中的首地址,所以可以使用函數名來調用執行這個函數(實質是指針解引用訪問);函數定義中的函數體是函數的執行關鍵,函數將來執行主要就是執行函數體。

? ? ? ? ? ? ? ? (3)函數聲明的主要是告訴編譯器函數的原型

? ? ? ? ? ? ? ? (4)函數調用就是執行一個函數?

? ? ? ? 2:函數原型和作用

? ? ? ? ? ? ? ? (1)函數原型就是函數的聲明,就是函數的函數名、返回值類型、參數列表

? ? ? ? ? ? ? ? (2)函數原型的主要作用就是給編譯器提供原型,讓編譯器在編譯程序時幫助程序員進行參數的靜態類型檢查

? ? ? ? ? ? ? ? (3)編譯器在編譯文件時是以單個源文件為單位的(所以一定要在哪里調用在哪里聲明),而且編譯器工作時就已經經過預處理了,最重要的是編譯器編譯文件時是按照文件中語句的先后順序來執行的

? ? ? ? ? ? ? ? (4)編譯器從源文件的第一行開始編譯,遇到函數聲明時就會收到編譯器的函數聲明表中,然后繼續向后。當遇到一個函數調用時,就在本文件函數聲明表中去查這個函數,看有沒有原型相對應的一個函數(這個相對應的函數有且只能有一個)。如果沒有或者只有部分匹配只會報錯和報警告,如果發現多個則會報錯和報警告(函數重復了,C語言中不允許2個函數原型完全一樣這個過程其實是在編譯器遇到函數定義時完成的,所以函數可以重復聲明但是不能重復定義)

? ? ? ? 3:函數傳參

? ? ? ? ? ? ? ? (1)函數傳參的個數和類型要匹配

? ? ? ? ? ? ? ? (2)如果傳參個數太多可以用結構體打包

三:遞歸函數

? ? ? ? 1:什么是遞歸函數

? ? ? ? ? ? ? ? (1)遞歸函數就是函數值調用了自己本身的函數的函數

? ? ? ? ? ? ? ? (2)遞歸函數和循環的區別。遞歸不等于循環

? ? ? ? ? ? ? ? (3)遞歸函數解決問題的典型就是:求階乘、求裴波那切數列

????????????????

//求階乘
#include <stdio.h>int jiecheng(int n);        //函數聲明int main(void)
{int a = 5;int c = 0;c = jiecheng(a);        //函數表達式展開首先>1 != 1 ,所以進入else 中//retuen (n * jiecheng(n-1))//就等于 (5 * (4 * (3 * (2 * (1))))) 結果為120printf(" c = %d\n",c);return 0;}int jiecheng(int n)    
{if(n<1)    //判斷是否小于1 ,小于1 輸出n!<1 并返回 -1{printf("n !<1");return -1;}else if(n == 1){return 1;    //n等于1返回 1 }else{return (n * jiecheng(n-1));    //n<1則返回 n * 函數本身(傳參-1),直接調用                            //本身這個函數,直到不滿足<1時不在繼續調用執行本身函數返回所乘的值}}
? ? ? ? 2:函數的遞歸調用原理

? ? ? ? ? ? ? ? (1)實際上遞歸函數是在棧內存上遞歸執行的,每次遞歸執行一次就需要耗費一些棧內存

? ? ? ? ? ? ? ? (2)棧內存大小是限制遞歸深度的重要因素

? ? ? ? 3:使用遞歸函數的調用原則:收斂性、棧溢出

? ? ? ? ? ? ? ? (1)收斂性就是函數必須要有一個終止遞歸的條件。當每次這個函數被執行時,我們判斷一個條件決定是否結束遞歸,這個條件最終必須被滿足。如果沒有遞歸終止條件或者這個條件永遠不能被滿足,則這個遞歸沒有收斂性,這個遞歸最終要

? ? ? ? ? ? ? ? (2)因為遞歸是占用棧內存的,每次遞歸都會消耗一些棧內存。因此必須在棧內存耗盡之前遞歸收斂(終止)否則棧就會溢出

四:函數庫

? ? ? ? 1:什么是函數庫?

? ? ? ? ? ? ? ? (1)函數庫就是一些事先寫好的函數的集合

? ? ? ? ? ? ? ? (2)函數是模塊化的,因此可以被復用。程序員寫好了一個函數,可以被反復使用。也可以a寫好了一個函數共享出來,當b有需求是就不用重新寫這個函數直接用a寫好的就可以了

? ?? ? 2:函數庫的由來

? ? ? ? ? ? ? ? (1)最開始是沒有函數庫的,每個人寫程序都要自己重頭開始自己寫。時間久了程序員就積累了一些有用的函數(經常要用到的函數 )

? ? ? ? ? ? ? ? (2)早起的程序員經常參加行業聚會,在聚會上大家交換各自的函數庫

? ? ? ? ? ? ? ??(3)后來的行業大神就提出把大家各自的函數收攏在一起,然后經過校驗和整理,形成一份標準的函數庫,就是現在公開的函數庫,

? ? ? ? 3:函數庫的提供形式:動態鏈接庫與靜態鏈接庫

? ? ? ? ? ? ? ? (1)早起的函數共享都是以源代碼的形式進行的。這種共享的方式是最徹底的(后來這種源碼共享的方向就變成了現在的開源社區)。但是也有缺點,缺點就是無法以商業化的方式發布函數庫

? ? ? ? ? ? ? ? (2)商業公司需要將自己有用的函數共享給別人(付費的形式),但是不能給客戶源代碼,這時候的解決方案就是以庫a(主要是以靜態庫和動態庫)的形式來提供

? ? ? ? ? ? ? ? (3)比較早出現的是靜態鏈接庫。靜態庫就是商業公司將自己的函數源代碼只編譯不鏈接形成.O的目標文件,然后用ar工具將.O文件歸檔成.a的歸檔文件(.a的歸檔文件又叫靜態鏈接文件)。商業公司通過發布.a庫文件和.h頭文件來提供靜態庫來給客戶使用:客戶拿到.a和.h文件之后,通過.h頭文件得知庫中庫函數的原型,然后在自己的.c文件中調用這些庫文件 ,在鏈接的時候鏈接器會去.a文件中拿出被調用的那個函數的編譯后的.o二進制代碼段鏈接進去形成最終的可執行程序

? ? ? ? ? ? ? ? (4)動態鏈接庫比靜態鏈接庫要出現的晚一些,效率要高一些。現在基本上都是用動態庫的。靜態庫在用戶鏈接自己的可執行程序時就已經把調用的的庫中的函數的代碼段鏈接進最終的可執行程序中了,這樣的好處是可以執行,壞處是太占地方了。尤其是有多個應用程序都使用了這個庫函數的時候,實際在最后生成的可執行程序中都各自有一份這個函數的代碼段。當這些應用程序同時在內存中運行時,實際上在內存中有多個這個庫函數的代碼段,這完全重復了,而動態鏈接庫本身不將庫函數的代碼段鏈接到可執行程序,只是做個標記,然后當應用程序在執行時,運行時環境發現調用了一個動態庫的庫函數時,會去加載這個動態庫去內存中,然后不管以后多少次調用執行這個動態庫中的函數都會跳轉到第一次加載的地方去執行,不會重復去加載。

//使用靜態鏈接動態鏈接編譯鏈接遞歸函數實現階乘程序來查看動態鏈接和靜態鏈接的區別
#include <stdio.h>int mem(int n)
{if(n<1){return -1;}if(n== 1){return 1;   }else{return n * mem(n-1);}}int main(void)
{int a = mem(9);printf("a = %d\n",a);return 0;}

? ? ? ? ?使用linux環境下用gcc編譯工具鏈

? ? ? ? 用gcc默認編譯目標文件4.6.8.func.c (默認為動態鏈接)? ? ? ? 輸出 a = 362880查看可執行文件./a.out文件大小為16728

? ? ? ? 使用強制靜態鏈接方式編譯鏈接目標文件4.6.8.func.c? ? ? ?輸出a = 362880 查看可執行文件大小為871856

?????????

? ? ? ? 4:函數庫中庫函數的使用

? ? ? ? ? ? ? ? (1)linux的gcc中編譯鏈接程序默認是使用動態鏈接,要想使用靜態鏈接需要顯示使用-static來強制靜態鏈接

? ? ? ? ? ? ? ? (2)庫函數的使用需要注意四點:第一,包含相應的頭文件;第二,調用庫函數時要注意函數原型;第三,有些庫函數鏈接時需要額外用-lxxx來指定鏈接;第四,如果是動態庫,要注意-L指定動態庫的地址

五:字符串函數

? ? ? ? 1:什么是字符串

? ? ? ? ? ? ? ? (1)字符串就是在多個字符在內存中連續分布組成的字符結構。字符串的特點是指定了開頭(字符串的指針)和結尾(結尾為固定字符'\0'),而沒有指定長度(長度由開頭地址和結尾地址相減得到)? ??

? ? ?? ?2:常用字符串處理函數

? ? ? ? ? ? ? ? (1)c庫中字符串處理函數包含在string.h頭文件中,這個文件在ubuntu系統中在/use/include中? ? ? ?

? ? ? ? ? ? ? ? (2)常見字符串處理函數及其用法

????????????????????????

六: 數學庫函數

? ? ? ? 1:math.h

? ? ? ? ? ? ? ? (1)真正的數學運算函數定義在:/usr/include/i386-linux-gnu/bits/mathcalls.h

? ? ? ? ? ? ? ? (2)使用數學庫函數的時候,只需要包含math.h即可

? ? ? ? 2:計算開平方

? ? ? ? ? ? ? ? (1)庫函數:double sqrt(double x);

????????????????????????

//使用庫函數中math.h頭文件中聲明的sqrt函數來計算開平方的值#include <stdio.h>        
#include <math.h>            //數學庫函數int main(void)
{double a = 16.0;        //定義一個double類型的變量double b = sqrt(a);     //計算a變量存的值的平方printf("b = %lf\n",b);    return 0;}

但是如果在linux中進行編譯鏈接可能會出現報錯

分析:這個鏈接錯誤的意思是;sqrt函數有聲明(聲明就在math.h中)有引用(在math.c)但是
沒有定義,鏈接器找不到函數體。sqrt本來是庫函數,在編譯器庫中是有.a和.so鏈接庫的(函
數體在鏈接庫中的)

?????????

? ? ? ? ? ? ? ? ? ? ? ? 這里顯示main函數中的sqrt未定義引用,其實是定義聲明了的只是找不到函數原型

? ? ? ? ? ? ? ? ? ? ? ? 但是當我們把頭文件包含的math.h函數屏蔽時的報錯

解決辦法是在編譯鏈接文件時后面加-lm也就是:? ? ? ?gcc 4.6.10.math.c -lm

下面圖可以看到添加了-lm之后不報錯,運行可執行文件也輸出了a的值的開平方也就是16的開平方4

? ? ? ? ? ??

鏈接器的工作特點:因為庫函數有很多,鏈接器去庫函數目錄搜索的時間比較久。為了提升速
度想了一個折中的方案:鏈接器只是默認的尋找幾個最常用的庫,如果是一些不常用的庫中的函
數被調用,需要程序員在鏈接時明確給出要擴展查找的庫的名字。鏈接時可以用-1xxx來指示鏈
接器去到libxxx.so中去查找這個函數

? ? ? ? 3:鏈接時加 -lm

? ? ? ? ? ? ? ? (1)-lm就是告訴鏈接器到libm中去查找用到的函數

? ? ? ? ? ? ? ? (2)高版本的gcc會出現不用加lm也可以編譯鏈接成功

七:自己制作靜態連接庫并使用

? ? ? ?1: 第一步,自己制作靜態鏈接庫? ? ? ? (在ubuntu系統中)

? ? ? ? 在ubuntu中創建文件夾(名為static_lib)-> 進入創建的文件夾static_lib -> 創建一個名為static_lib.c的.c源文件和一個名為static_lib.h的文件 -> 在static_lib.c源文件中寫入代碼 -> 在static_lib.h頭文件中聲明函數 -> 使用gcc static_lib.c -o static_lib.o -c命令行命令只編譯不鏈接生成static_lib.o文件 -> 使用ar -rc libstatic_lib.a static_lib.o命令行命令使用ar工具打包成.a歸檔文件

????????????????

#include <stdio.h>void func1(void)
{printf("func1 in static_lib.c.\n");}int func1(int a,int b)
{printf("func2 in static_lib.c.\n");return a + b;}

? ? ? ? ? ? ? ? (1)首先使用gcc -c 只編譯不鏈接,生成.o文件;然后使用ar工具進行打包成.a歸檔文件

? ? ? ? ? ? ? ? (2)庫名不能隨便亂起,一般是lib+庫名稱,后綴名是.a表示是一個歸檔文件

? ? ? ? ? ? ? ? (3)制作出來靜態庫后,發布需要發布.a文件和.h文件

? ? ? ? 2:第二步,使用靜態鏈接庫

????????????????在static_lib文件夾中創建一個名為static_lib的子文件夾? ->? 將剛剛生成的歸檔文件libstatic.a和static.h文件復制到ststic_lib子文件夾中->創建一個名為test.c的源文件,在里面寫入代碼調用靜態庫內的函數->使用gcc test.c -o test -lstatic_lib -L.命令編譯鏈接生成可執行文件->運行可執行文件

cp /home/tu/tu_min_kang/4.6/static_lib/libstatic_lib.a ?/home/tu/tu_min_kang/4.6/static_lib/teselib

cp /home/tu/tu_min_kang/4.6/static_lib/static_lib.h /home/tu/tu_min_kang/4.6/static_lib/teselib

#include "static_lib.h"
#include <stdio.h>int main(void)
{func1();int a =  func2(3,5);printf("a = %d\n",a);return 0;}

?

? ? ? ? ? ? ? ? (1)把.a文件和.h放在需要引用的文件夾下,然后在.c文件中包含庫文件使用庫函數

? ? ? ? ? ? ? ? 第一次編譯方法 :gcc? tese.c -o test

? ? ? ? ? ? ? ? 報錯:/usr/bin/ld: /tmp/ccniBjn5.o: in function `main':
??????????????????????????test.c:(.text+0xd): undefined reference to `func1'
??????????????????????????/usr/bin/ld: test.c:(.text+0x1c): undefined reference to `func2'
? ? ? ? ? ? ? ? ? ? ? ? ? collect2: error: ld returned 1 exit status

? ? ? ? ? ? ? ? 第二次編譯方法:gcc test.c -o test -lstatic_lib

? ? ? ? ? ? ? ? 報錯:/usr/bin/ld: cannot find -lstatic_lib collect2: error: ld returned 1 exit status

? ? ? ? ? ? ? ? 第三次 編譯方法:gcc test.c -o test -lstatic_lib -L.

? ? ? ? ? ? ? ? 無報錯

? ? ? ? ? ? ? ? 運行結果:

????????????????

? ? ? ??

八:自己制作動態鏈接庫并使用

? ? ? ? 動態鏈接庫的后綴是.so(對于windows系統的dll),靜態庫的擴展名是.a

? ? ? ? 1:創建動態鏈接庫并使用流程

? ? ? ? ? ? ? ? 編寫.c源文件和.h源文件 ->? 使用gcc? dynamic_lib.c? -o? dynamic_lib.o -c -fPIC 命令將.c源文件只編譯不鏈接生成.o文件(-fPIC是告訴編譯器在編譯時將程序變成位置無關碼,這意味著生成的目標文件是與其載入的內存位置無關的,可以被載入到進程的任何位置,只要所有的內存訪問都是正確的。位置無關碼對于共享庫(如.so文件)是非常重要的,因為它們需要能夠被多個進程同時使用,而不會相互干擾。) -> 再使用gcc -o libdynamic_lib.so? dynamic_lib.o -shared生成動態鏈接庫(-shared告訴編譯器我們要將它設用置為共享庫的方式來進行鏈接)->編寫一個.c文件來調用生成的動態鏈接庫 -> 使用gcc test.c -o test -ldynamic_lib -L 命令來編譯鏈接文件 ->?將動態鏈接庫復制一份到/usr/lib目錄下 ->./test執行程序

????????????????

#include <stdio.h>void func1(void)
{printf("func1 in static_lib.c.\n");}int func1(int a,int b)
{printf("func2 in static_lib.c.\n");return a + b;}
void func1(void);
int func2(int a,int b);

?

?

#include <stdio.h>
#include "dynamic_lib.h"    int main(void)
{func1();int a = func2(3,5);printf("a = %d\n",a);return 0;}

?

?

?

? ? ? ? ?第一次編譯:gcc test.c -o test

? ? ? ? 報錯:/usr/bin/ld: /tmp/ccDhA63w.o: in function `main':
????????????????test.c:(.text+0xd): undefined reference to `func1'
????????????????/usr/bin/ld: test.c:(.text+0x1c): undefined reference to `func2'
????????????????collect2: error: ld returned 1 exit status

? ? ? ? ?第二次編譯:gcc test.c -o test -ldynamic_lib

? ? ? ? 報錯:/usr/bin/ld: cannot find -ldynamic_lib
???????????????????collect2: error: ld returned 1 exit status

? ? ? ? 第三次編譯:gcc test.c -o test -ldynamic_lib -L.

? ? ? ? 無報錯

? ? ? ? 但是運行test可執行文件報錯 原因是:動態庫在運行時需要被加載(運行程序時環境在執行test時發現他動態鏈接了 libdynamic_lib.so,于是會去固定目錄嘗試加載 libdynamic_lib.so,失敗則會打印錯誤)

????????

? ? ? ? 解決方法1:將動態鏈接庫復制一份到/usr/lib目錄下?

使用ldd指令查看? ? ? ? :ldd test

?

? ? ? ? 解決方法2:使用環境變量LD_LIBRARY_PATH 操作系統在加載固定目錄/uer/lib之前會去?環境變量LD_LIBRARY_PATH指定的目錄去尋找,如果找到就不要去/usr/lib目錄下找,沒找到才會去/usr/lib

? ? ? ?export
LD_LIBRARY_PATH=$LD_LIBARY_PATH:/home/tu/tu_min_kang/4.6/4.6.12.dynamic_lib/testlib

?

????????

????????????????

????????????????

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

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

相關文章

分布式版本控制工具 git

git 是什么 分布式版本控制工具。github 是代碼托管平臺。 git 有什么用 保存文件的所有修改記錄。使用版本號&#xff08;sha1 哈希值&#xff09; 進行區分。隨時可瀏覽歷史版本記錄。可還原到歷史指定版本。對比不同版本的文件差異。 為什么要使用 git 多人協作開發一個大…

SQL 優化

SQL 優化是指通過各種手段提高 SQL 查詢的執行效率,減少資源消耗,提高數據庫的整體性能。以下是一些詳細的 SQL 優化方法,包括索引優化、查詢優化、數據庫設計優化等。 1. 索引優化 創建適當的索引: 單列索引:在查詢中頻繁使用的單個列上創建索引。多列索引(復合索引):…

STM32手寫超頻到128M函數

今天學習了野火的STM32教程學會了如何設置STM32的時鐘頻率&#xff0c;步驟比較詳細&#xff0c;也很容易理解&#xff0c;就是視頻教程不能跳著看&#xff0c;只能一節節的看&#xff0c;不然會知識不連貫&#xff0c;造成有些知識不理解&#xff0c;連續著看還是沒有什么難度…

docker-file 網絡

docker掛載 1.綁定掛載&#xff08;Bind Mounts&#xff09;&#xff1a;綁定掛載是將主機上的文件或目錄掛載到容器中。 docker run -v /host/path:/container/path image_name 2.卷掛載&#xff08;Volume Mounts&#xff09;&#xff1a;卷掛載將 Docker 數據卷掛載到容器中…

【CTF Web】CTFShow web4 Writeup(SQL注入+PHP+字符型注入)

web4 1 管理員阿呆又失敗了&#xff0c;這次一定要堵住漏洞 解法 注意到&#xff1a; <!-- flag in id 1000 -->攔截很多種字符&#xff0c;連 select 也不給用了。 if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\|select/i",$id)){die(&q…

yolov8推理由avi改為mp4

修改\ultralytics-main\ultralytics\engine\predictor.py&#xff0c;即可 # Ultralytics YOLO &#x1f680;, AGPL-3.0 license """ Run prediction on images, videos, directories, globs, YouTube, webcam, streams, etc.Usage - sources:$ yolo modepred…

Android開發-Android開發中的TCP與UDP通信策略的實現

Android 開發中的 TCP 與 UDP 通信策略的實現 1. 前言2. 準備工作3. Kotlin 中 TCP 通信實現客戶端代碼示例&#xff1a;服務器代碼示例&#xff1a; 4. Kotlin 中 UDP 通信實現客戶端代碼示例&#xff1a;服務器代碼示例&#xff1a; 5. TCP 與 UDP 應用場景分析TCP 實現可靠傳…

搭建訪問阿里云百煉大模型環境

最近這波大降價&#xff0c;還有限時免費&#xff0c;還不趕快試試在線大模型&#xff1f;下面整理訪問百煉平臺的千問模型方法。 創建RAM子賬號并授權 創建RAM子賬號 1. “訪問控制RAM”入口&#xff08;控制臺URL&#xff09; 然后點擊進入“RAM管理控制臺” 2. 添加用戶 …

vue 區分多環境打包

需求&#xff1a;區分不同的環境&#xff08;測試、正式環境&#xff09;&#xff0c;接口文檔地址不同&#xff1b; 配置步驟&#xff1a; 1、在根目錄下面新建 .env.xxx 文件&#xff08;xxx 根據環境不同配置&#xff09; 文件中一定要配置的參數項為&#xff1a;NODE_ENV…

【Python搞定車載自動化測試】——Python實現CAN總線Bootloader刷寫(含Python源碼)

系列文章目錄 【Python搞定車載自動化測試】系列文章目錄匯總 文章目錄 系列文章目錄&#x1f4af;&#x1f4af;&#x1f4af; 前言&#x1f4af;&#x1f4af;&#x1f4af;一、環境搭建1.軟件環境2.硬件環境 二、目錄結構三、源碼展示1.診斷基礎函數方法2.診斷業務函數方法…

python 火焰檢測

在日常生活,總是離不開火,有時候我們需要預防火災發生,但是我們又不可能一直盯著,這時候我們就需要一款程序幫我們盯著,一旦發生火災從而告知我們,今天就帶大家編寫這么一款應用。 安裝需要的庫 pip install opencv-python 代碼實現 import cv2 # Library for…

qmt量化教程4----訂閱全推數據

文章鏈接 qmt量化教程4----訂閱全推數據 (qq.com) 上次寫了訂閱單股數據的教程 量化教程3---miniqmt當作第三方庫設置&#xff0c;提供源代碼 全推就主動推送&#xff0c;當行情有變化就會觸發回調函數&#xff0c;推送實時數據&#xff0c;可以理解為數據驅動類型&#xff0…

mysql中使用 mysqldump 實現跨機器備份|數據同步

1.如果同步數據庫&#xff0c;必須先創建數據庫&#xff1a; mysqldump -h 192.168.1.10 --lock-tablesfalse -uroot -proot db_name | mysql -h127.0.0.1 -uroot -proot db_name2.過濾掉不想要的表(沒試過&#xff0c;但是試過轉為sql文件的) mysqldump -h 192.168.1.10 --…

vs2019 c++ 函數的返回值是對象的值傳遞時候,將調用對象的移動構造函數

以前倒沒有注意過這個問題。但編譯器這么處理也符合移動構造的語義。因為本來函數體內的變量也要離開作用域被銷毀回收了。測試如下&#xff1a; 謝謝

實現信號發生控制

1. 信號發生器的基本原理 信號發生器是一種能夠產生特定波形和頻率的電子設備&#xff0c;常用于模擬信號的產生和測試。 信號發生器的基本原理 信號發生器的工作原理基于不同的技術&#xff0c;但最常見的類型包括模擬信號發生器和數字信號發生器&#xff08;DDS&#xff0…

[SCTF2019]babyre

打開看看還是有花指令 解除后首先pass1是解maze&#xff0c;好像又是三維的 x是25&#xff0c;也就是向下跳五層,注意是立體的 得到 passwd1&#xff1a; ddwwxxssxaxwwaasasyywwdd 接著往下看 有一個加密函數IDA逆向常用宏定義_lodword-CSDN博客 unsigned __int64 __fastca…

primeflex樣式庫筆記 Display相關的案例

回顧 寬度設置的基本總結 w-full&#xff1a;表示widtdh&#xff1a;100%&#xff1b;占滿父容器的寬度。 w-screen&#xff1a;表示占滿整個屏幕的寬度。 w-1到w-12&#xff0c;是按百分比劃分寬度&#xff0c;數字越大&#xff0c;占據的比例就越大。 w-1rem到w-30rem&…

Oracle的安裝以及一些相關問題

系列文章目錄 Oracle的安裝以及一些相關問題 文章目錄 系列文章目錄前言一、Oracle的安裝二、常用命令三、誤刪dbf四、PLSQL亂碼五、oracle更換數據庫字符集總結 前言 一段時間沒更新&#xff0c;主要最近一直在找工作&#xff0c;最終還是順著春招找到工作了&#xff0c;現在…

美信時代監控易:堆疊交換機的監控與配置管理策略

隨著企業數字化轉型的加速&#xff0c;網絡架構的複雜性日益提升&#xff0c;堆疊交換機作為高可靠性、靈活擴展性的解決方案&#xff0c;在網絡基礎設施中扮演著至關重要的角色。然而&#xff0c;如何確保堆疊交換機的穩定運行&#xff0c;實現高效監控與配置管理&#xff0c;…

剖析 OceanBase 應對高并發的技術策略

推薦一個AI網站&#xff0c;免費使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鯨AI 在當今互聯網時代&#xff0c;高并發場景下的數據庫處理能力成為了許多應用的關鍵需求。為了滿足用戶對快速響應和高吞吐量的期望&#xff0c;數據庫系統需要采用一系列技術來優化并發性…