以前也讀了這個RGBD相機的一些源碼但是發(fā)現(xiàn)自己的基本功是一點也不好,所以就擱置了很久,今天試圖來回答一些問題。
說好的不會再出新品結果還是出了,估計這個市場還是可以的

自己就看一個例子里面的代碼

就一個C文件,看的也簡單一些
set(CMAKE_EXPORT_COMPILE_COMMANDS 1) add_executable(rs-color rs-color.c ../example.h) include_directories(../../common ../../third-party/imgui ../../C) target_link_libraries(rs-color ${DEPENDENCIES}) set_target_properties (rs-color PROPERTIES FOLDER "Examples/C" ) install(TARGETS rs-color RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
編譯的文件都是使用Cmake來控制的,所以一開始寫一些這個。
set(CMAKE_EXPORT_COMPILE_COMMANDS 1) 這個命令會讓CMake在編譯過程中輸出 JSON 格式的編譯命令到 compile_commands.json 文件中。這對于IDE的代碼補全和靜態(tài)分析很有幫助。
add_executable(rs-color rs-color.c ../example.h) 這個命令定義了一個rs-color的可執(zhí)行目標,源代碼文件是rs-color.c和example.h。
include_directories(../../common ../../third-party/imgui ../../C) 這個命令指定了包含路徑,用于解析rs-color.c和example.h中的#include語句。
target_link_libraries(rs-color ${DEPENDENCIES}) 這個命令為rs-color目標指定了鏈接庫,其中${DEPENDENCIES}是一個變量,包含所有依賴庫的名字。
set_target_properties (rs-color PROPERTIES FOLDER "Examples/C" )這個命令為rs-color目標設置了一些屬性,這里指定了在IDE的項目視圖中,rs-color會出現(xiàn)在Examples/C文件夾下。

直接下來就看幾個代碼,是不是和學的C語言不太一樣
這條語句rs2_error *e = 0;
1. 定義了一個指針e,指向rs2_error類型。
2. 將e初始化為0,也就是RS2_ERROR_NONE,表示沒有錯誤。
rs2_context *ctx = rs2_create_context(RS2_API_VERSION, &e);
源碼使用 Intel RealSense SDK 的 C API 創(chuàng)建了一個上下文對象 rs2_context,并將其地址賦給 ctx 變量。
同時,它傳遞了 RealSense SDK 的 API 版本號 RS2_API_VERSION 給 rs2_create_context() 函數(shù),該函數(shù)將返回一個 rs2_context 對象。
在創(chuàng)建上下文對象時,還傳遞了一個錯誤處理器(error-handler)的地址 &e,以便在運行時捕獲可能出現(xiàn)的錯誤。
如果發(fā)生someError,會通過*e = ...將e設置為相應的錯誤碼。之后,在調用者可以檢查*e的值來查看doSomething()是否發(fā)生錯誤。這是C語言中一個很常見的錯誤處理方式 - 通過指針傳遞錯誤碼,如果有錯誤,被調用的函數(shù)會設置該指針為錯誤值。

調用者在調用后檢查該值來進行錯誤處理。這種方式的好處是:
可以從函數(shù)返回額外的錯誤信息(除了函數(shù)返回值本身)。
不需要定義專門的錯誤返回類型,可以直接使用指向已有類型的指針。
簡單和實用,適用于C語言的語法和習慣。
當然,這個方式也有一定的缺點,比如:
1. 如果不注意檢查錯誤指針,難以發(fā)現(xiàn)錯誤,這會影響健壯性。
2. 錯誤指針需要與函數(shù)的正確返回值區(qū)分開來檢查,有一定難度。
3. 錯誤信息只能通過指定的指針值返回,表達能力較有限。所以,對于rs2_error *e這樣的指針,是可以直接作為C函數(shù)的參數(shù)進行傳遞的,這是C語言中一種簡單實用的錯誤處理方式,但是也有一定的缺陷。

在這里被定義了很多

更具體的實現(xiàn)
1.析構函數(shù)~rs2_context(),在rs2_context被釋放時會調用ctx->stop()。這是用于停止某個線程或后臺服務。
2. 一個std::shared_ptr<:context>成員ctx。這是一個librealsense庫中的context對象,通過shared_ptr智能指針進行管理??梢圆聹y,這個rs2_context結構體表示一個與librealsense的context相關的對象,它在釋放時會停止該context,并通過shared_ptr管理context的生命周期。 其實這也是一個使用RAII(Resource Acquisition Is Initialization),通過在對象構造和析構時啟動和停止資源,實現(xiàn)資源的自動管理。
rs2_context *ctx = rs2_create_context(RS2_API_VERSION, &e);
這段代碼中,通過調用rs2_create_context()函數(shù)創(chuàng)建了一個rs2_context 實例,并將該實例的指針賦值給了 ctx 變量。這個 rs2_context 實例是在 rs2_create_context() 函數(shù)內部創(chuàng)建并初始化的,然后將其地址返回給調用者,調用者通過 ctx 變量來訪問和操作該實例。
可以說rs2_context實例已經(jīng)被初始化并設置好了,但不能直接說 rs2_context 里面是一個已經(jīng)初始化過的結構體,因為 rs2_context 只是一個指針類型,并不存儲任何數(shù)據(jù)。
結構體指針在 C 語言中被廣泛使用,因為它可以方便地訪問和操作結構體中的成員,而不需要對整個結構體進行復制。結構體指針可以通過指針運算和取值運算符來訪問結構體成員,這使得對結構體的操作變得更加高效。
以下是一些常見的使用結構體指針的場景:
傳遞結構體指針作為函數(shù)參數(shù):這種情況下,函數(shù)可以通過指針來訪問和修改結構體的成員,從而避免了對整個結構體進行復制,提高了程序的效率。
動態(tài)內存分配:當需要動態(tài)創(chuàng)建一個結構體對象時,需要使用結構體指針來指向該對象。在動態(tài)分配內存時,使用結構體指針可以確保只分配所需的內存,并且可以方便地釋放分配的內存。
鏈表和樹等數(shù)據(jù)結構:鏈表和樹等數(shù)據(jù)結構通常使用結構體指針來連接不同的節(jié)點,從而構建出完整的數(shù)據(jù)結構。
rs2_context *rs2_create_context(int api_version, rs2_error **error);
- api_version參數(shù)指定了librealsense API的版本號,用于向后兼容。
-e是個指針,如果有錯誤發(fā)生,會被設置為錯誤碼。這是C語言常見的錯誤返回方式。
包含了以下字段:
message:錯誤消息,描述錯誤 details 的字符串。
function:發(fā)生錯誤的函數(shù)名。
args:發(fā)生錯誤的函數(shù)調用的參數(shù)。
exception_type:錯誤類型,很可能是一個enum,表示出錯的原因。這個結構體通常用來表示異常信息,或是庫函數(shù)調用后的錯誤詳情。
c++ struct rs2_error { std::string message; // 錯誤消息 std::string function; // 函數(shù)名 std::string args; // 函數(shù)參數(shù) rs2_exception_type exception_type; // 錯誤類型 };
如果一個函數(shù)返回一個結構體類型的值,那么需要使用一個結構體類型的變量來接收這個返回值。因為結構體類型通常比較大,如果直接將結構體類型的值作為函數(shù)的返回值返回,會導致復制整個結構體的內存空間,從而影響程序的性能。因此,C 語言中通常使用指向結構體的指針作為返回值,而不是直接返回結構體類型的值。
#include#include struct person { char name[50]; int age; }; struct person* create_person(const char* name, int age) { struct person* p = (struct person*) malloc(sizeof(struct person)); if (p != NULL) { strcpy(p->name, name); p->age = age; } return p; } int main() { struct person* p = create_person("John Doe", 30); if (p != NULL) { printf("Name: %s ", p->name); printf("Age: %d ", p->age); free(p); } return 0; }
完整代碼

看這個
在上面的例子中,create_person() 函數(shù)返回一個指向:
struct person
結構體的指針。
該函數(shù)使用malloc()函數(shù)動態(tài)分配內存來存儲結構體,然后將結構體的成員賦值為傳入的參數(shù)。最后,該函數(shù)返回指向該結構體的指針。在 main() 函數(shù)中,調用 create_person() 函數(shù)來創(chuàng)建一個結構體實例,并打印出其成員的值。在使用完結構體后,還需要調用 free() 函數(shù)來釋放動態(tài)分配的內存。
更具體的來分析:
struct person* p = (struct person*) malloc(sizeof(struct person));
調用malloc()函數(shù),請求分配sizeof(struct person)字節(jié)的內存塊。這將分配足夠存放person結構體的內存。
malloc()返回 void *,所以我們需要強制類型轉換為struct person*。這會將void *轉換為person結構體的指針。
person *p將保存分配的內存塊地址,我們可以通過p訪問這個person對象。
分配的內存未初始化,需要手工初始化 person 對象的各個字段。
使用malloc()獲取內存,強制類型轉換為需要的指針類型,使用后釋放內存。
https://www.intelrealsense.com/
https://github.com/IntelRealSense/librealsens
審核編輯:湯梓紅
-
相機
+關注
關注
5文章
1519瀏覽量
55269 -
C語言
+關注
關注
183文章
7634瀏覽量
144170 -
命令
+關注
關注
5文章
745瀏覽量
23361 -
代碼
+關注
關注
30文章
4925瀏覽量
72476 -
RealSense
+關注
關注
0文章
11瀏覽量
19667
原文標題:通過RealSense代碼說明一些C語言問題
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
分享一些超級炫酷的C語言小技巧
試用 Intel RealSense
Linux內核中GNU C擴展的一些常用C語言語法分析
C語言使用必須了解的一些問題495個C語言問題選集免費下載
C語言和C++編程的一些思考資料說明
通過一些附加信息和有用的實現(xiàn)技術對C函數(shù)的探索
C語言常見的一些標準庫
C語言的一些常用標準庫分享
C語言如何寫出高效代碼呢?

通過RealSense代碼說明一些C語言問題
評論