女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

云深之無跡 ? 來源:云深之無跡 ? 2023-04-26 10:20 ? 次閱讀

以前也讀了這個RGBD相機的一些源碼但是發現自己的基本功是一點也不好,所以就擱置了很久,今天試圖來回答一些問題。

說好的不會再出新品結果還是出了,估計這個市場還是可以的

e63a0740-e351-11ed-ab56-dac502259ad0.png

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

e655f752-e351-11ed-ab56-dac502259ad0.png

就一個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的代碼補全和靜態分析很有幫助。

add_executable(rs-color rs-color.c ../example.h) 這個命令定義了一個rs-color的可執行目標,源代碼文件是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會出現在Examples/C文件夾下。

e66d398a-e351-11ed-ab56-dac502259ad0.png

直接下來就看幾個代碼,是不是和學的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 創建了一個上下文對象 rs2_context,并將其地址賦給 ctx 變量。

同時,它傳遞了 RealSense SDK 的 API 版本號 RS2_API_VERSION 給 rs2_create_context() 函數,該函數將返回一個 rs2_context 對象。

在創建上下文對象時,還傳遞了一個錯誤處理器(error-handler)的地址 &e,以便在運行時捕獲可能出現的錯誤。

如果發生someError,會通過*e = ...將e設置為相應的錯誤碼。之后,在調用者可以檢查*e的值來查看doSomething()是否發生錯誤。這是C語言中一個很常見的錯誤處理方式 - 通過指針傳遞錯誤碼,如果有錯誤,被調用的函數會設置該指針為錯誤值。

e694cd4c-e351-11ed-ab56-dac502259ad0.png

調用者在調用后檢查該值來進行錯誤處理。這種方式的好處是:

可以從函數返回額外的錯誤信息(除了函數返回值本身)。

不需要定義專門的錯誤返回類型,可以直接使用指向已有類型的指針。

簡單和實用,適用于C語言的語法和習慣。

當然,這個方式也有一定的缺點,比如:

1. 如果不注意檢查錯誤指針,難以發現錯誤,這會影響健壯性。

2. 錯誤指針需要與函數的正確返回值區分開來檢查,有一定難度。

3. 錯誤信息只能通過指定的指針值返回,表達能力較有限。所以,對于rs2_error *e這樣的指針,是可以直接作為C函數的參數進行傳遞的,這是C語言中一種簡單實用的錯誤處理方式,但是也有一定的缺陷。

e6a709d0-e351-11ed-ab56-dac502259ad0.png

在這里被定義了很多

e6c802f2-e351-11ed-ab56-dac502259ad0.png

更具體的實現

1.析構函數~rs2_context(),在rs2_context被釋放時會調用ctx->stop()。這是用于停止某個線程或后臺服務。

2. 一個std::shared_ptr<:context>成員ctx。這是一個librealsense庫中的context對象,通過shared_ptr智能指針進行管理。可以猜測,這個rs2_context結構體表示一個與librealsense的context相關的對象,它在釋放時會停止該context,并通過shared_ptr管理context的生命周期。 其實這也是一個使用RAII(Resource Acquisition Is Initialization),通過在對象構造和析構時啟動和停止資源,實現資源的自動管理。

  rs2_context *ctx = rs2_create_context(RS2_API_VERSION, &e);

這段代碼中,通過調用rs2_create_context()函數創建了一個rs2_context 實例,并將該實例的指針賦值給了 ctx 變量。這個 rs2_context 實例是在 rs2_create_context() 函數內部創建并初始化的,然后將其地址返回給調用者,調用者通過 ctx 變量來訪問和操作該實例。

可以說rs2_context實例已經被初始化并設置好了,但不能直接說 rs2_context 里面是一個已經初始化過的結構體,因為 rs2_context 只是一個指針類型,并不存儲任何數據。

結構體指針在 C 語言中被廣泛使用,因為它可以方便地訪問和操作結構體中的成員,而不需要對整個結構體進行復制。結構體指針可以通過指針運算和取值運算符來訪問結構體成員,這使得對結構體的操作變得更加高效。

以下是一些常見的使用結構體指針的場景:

傳遞結構體指針作為函數參數:這種情況下,函數可以通過指針來訪問和修改結構體的成員,從而避免了對整個結構體進行復制,提高了程序的效率。

動態內存分配:當需要動態創建一個結構體對象時,需要使用結構體指針來指向該對象。在動態分配內存時,使用結構體指針可以確保只分配所需的內存,并且可以方便地釋放分配的內存。

鏈表和樹等數據結構:鏈表和樹等數據結構通常使用結構體指針來連接不同的節點,從而構建出完整的數據結構。

 rs2_context *rs2_create_context(int api_version, rs2_error **error);

- api_version參數指定了librealsense API的版本號,用于向后兼容。
-e是個指針,如果有錯誤發生,會被設置為錯誤碼。這是C語言常見的錯誤返回方式。

包含了以下字段:

message:錯誤消息,描述錯誤 details 的字符串。

function:發生錯誤的函數名。

args:發生錯誤的函數調用的參數。

exception_type:錯誤類型,很可能是一個enum,表示出錯的原因。這個結構體通常用來表示異常信息,或是庫函數調用后的錯誤詳情。

c++
struct rs2_error 
{
    std::string message;   // 錯誤消息
    std::string function;  // 函數名
    std::string args;     // 函數參數
    rs2_exception_type exception_type; // 錯誤類型
};

如果一個函數返回一個結構體類型的值,那么需要使用一個結構體類型的變量來接收這個返回值。因為結構體類型通常比較大,如果直接將結構體類型的值作為函數的返回值返回,會導致復制整個結構體的內存空間,從而影響程序的性能。因此,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;
}

完整代碼

e6d9b45c-e351-11ed-ab56-dac502259ad0.png

看這個

在上面的例子中,create_person() 函數返回一個指向:

 struct person

結構體的指針。

該函數使用malloc()函數動態分配內存來存儲結構體,然后將結構體的成員賦值為傳入的參數。最后,該函數返回指向該結構體的指針。在 main() 函數中,調用 create_person() 函數來創建一個結構體實例,并打印出其成員的值。在使用完結構體后,還需要調用 free() 函數來釋放動態分配的內存。

更具體的來分析:

    struct person* p = (struct person*) malloc(sizeof(struct person));

調用malloc()函數,請求分配sizeof(struct person)字節的內存塊。這將分配足夠存放person結構體的內存。

malloc()返回 void *,所以我們需要強制類型轉換為struct person*。這會將void *轉換為person結構體的指針。

person *p將保存分配的內存塊地址,我們可以通過p訪問這個person對象。

分配的內存未初始化,需要手工初始化 person 對象的各個字段。

使用malloc()獲取內存,強制類型轉換為需要的指針類型,使用后釋放內存。

https://www.intelrealsense.com/
https://github.com/IntelRealSense/librealsens

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 相機
    +關注

    關注

    4

    文章

    1428

    瀏覽量

    54462
  • C語言
    +關注

    關注

    180

    文章

    7629

    瀏覽量

    140144
  • 命令
    +關注

    關注

    5

    文章

    725

    瀏覽量

    22655
  • 代碼
    +關注

    關注

    30

    文章

    4886

    瀏覽量

    70206
  • RealSense
    +關注

    關注

    0

    文章

    11

    瀏覽量

    19525

原文標題:通過RealSense代碼說明一些C語言問題

文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    分享一些超級炫酷的C語言小技巧

    C語言常常讓人覺得它所能表達的東西非常有限。它不具有類似第級函數和模式匹配這樣的高級功能。但是C非常簡單,并且仍然有一些非常有用的語法技巧
    發表于 11-07 11:25 ?800次閱讀

    試用 Intel RealSense

    Pro) 右上角。我們正在通過 PC 上的 RealSense 開發者工具運行一些樣本數據。與常規網絡攝像頭不同,這款攝像頭模塊可以使用紅外線測量距離。因此它可以識別人類的動作和手勢,還能以 3D
    發表于 09-25 00:21

    Linux內核中GNU C擴展的一些常用C語言語法分析

    13.1 總結前面12節的課程,主要針對 Linux 內核中 GNU C 擴展的一些常用 C 語言語法進行了分析。GNU C 的這些擴展語法
    發表于 12-14 06:29

    C語言使用必須了解的一些問題495個C語言問題選集免費下載

    《你必須知道的495個C語言問題》書于2009年由人民郵電出版社出版發行,該書以問答的形式組織內容,討論了學習或使用C語言的過程中經常遇到
    發表于 11-01 11:46 ?22次下載

    C語言C++編程的一些思考資料說明

    1、其實高級語言和面向過程的語言最求的目標都是致的,高可復用性,另外,封裝性。我發現自己在寫C語言的時候,總是不自覺地就引入了高級
    發表于 05-09 18:16 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>和<b class='flag-5'>C</b>++編程的<b class='flag-5'>一些</b>思考資料<b class='flag-5'>說明</b>

    一些基礎的C語言程序及其源代碼資料合集免費下載

    本文檔的主要內容詳細介紹的是一些基礎的C語言程序及其源代碼資料合集免費下載。
    發表于 05-21 08:00 ?3次下載
    <b class='flag-5'>一些</b>基礎的<b class='flag-5'>C</b><b class='flag-5'>語言</b>程序及其源<b class='flag-5'>代碼</b>資料合集免費下載

    單片機C語言代碼編寫技巧

    下面發一些我在網上看到的單片機C語言代碼編寫技巧和自己的一些經驗來和大家分享;
    發表于 07-14 11:02 ?3083次閱讀

    關于C語言一些特殊功能介紹

    C語言之所以那么受歡迎,除了C語言歷史悠久之外,還有它具有一些編程語言沒有的功能。那么,今年我們
    的頭像 發表于 08-18 15:31 ?2686次閱讀
    關于<b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>一些</b>特殊功能介紹

    通過一些附加信息和有用的實現技術對C函數的探索

    在本文中,我們將通過一些附加信息和一些有用的實現技術來結束對C函數的探索。 基本的C函數(例如,
    的頭像 發表于 09-27 11:11 ?1705次閱讀

    C語言常見的一些標準庫

    有很多工程師喜歡自己封裝一些標準庫已有的函數,其實自己封裝的函數,并不定比標準庫好,有時候反而代碼更冗余,且有bug。下面就來分享C
    的頭像 發表于 11-18 16:22 ?3299次閱讀

    C語言一些常用標準庫分享

     有很多工程師喜歡自己封裝一些標準庫已有的函數,其實自己封裝的函數,并不定比標準庫好,有時候反而代碼更冗余,且有bug。下面就來分享C
    的頭像 發表于 11-22 11:54 ?2991次閱讀

    C語言和STM32學習的一些學習筆記

    自己總結的一些C語言和STM32F1學習的一些筆記,適合想快速了解學習C語言和STM32單片機的
    發表于 03-24 14:53 ?36次下載

    分享一些Python代碼加速工具

    這篇文章會提供一些優化代碼的工具。會讓代碼變得更簡潔,或者更迅速。
    發表于 07-07 11:18 ?508次閱讀

    C語言如何寫出高效代碼呢?

    當涉及復雜的高效C代碼案例時,這些代碼示例展示了C語言中一些復雜且高效的應用案例,涵蓋了排序算法、圖算法、位操作、文件操作、多線程編程等領域
    發表于 09-06 14:57 ?790次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>如何寫出高效<b class='flag-5'>代碼</b>呢?

    單片機C代碼嵌套匯編的一些方法

    單片機C代碼嵌套匯編的一些方法
    的頭像 發表于 10-18 16:39 ?737次閱讀
    單片機<b class='flag-5'>C</b><b class='flag-5'>代碼</b>嵌套匯編的<b class='flag-5'>一些</b>方法