0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

通過(guò)RealSense代碼說(shuō)明一些C語(yǔ)言問(wèn)題

云深之無(wú)跡 ? 來(lái)源:云深之無(wú)跡 ? 2023-04-26 10:20 ? 次閱讀

以前也讀了這個(gè)RGBD相機(jī)的一些源碼但是發(fā)現(xiàn)自己的基本功是一點(diǎn)也不好,所以就擱置了很久,今天試圖來(lái)回答一些問(wèn)題。

說(shuō)好的不會(huì)再出新品結(jié)果還是出了,估計(jì)這個(gè)市場(chǎng)還是可以的

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

自己就看一個(gè)例子里面的代碼

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

就一個(gè)C文件,看的也簡(jiǎn)單一些

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來(lái)控制的,所以一開(kāi)始寫一些這個(gè)。

set(CMAKE_EXPORT_COMPILE_COMMANDS 1) 這個(gè)命令會(huì)讓CMake在編譯過(guò)程中輸出 JSON 格式的編譯命令到 compile_commands.json 文件中。這對(duì)于IDE的代碼補(bǔ)全和靜態(tài)分析很有幫助。

add_executable(rs-color rs-color.c ../example.h) 這個(gè)命令定義了一個(gè)rs-color的可執(zhí)行目標(biāo),源代碼文件是rs-color.c和example.h。

include_directories(../../common ../../third-party/imgui ../../C) 這個(gè)命令指定了包含路徑,用于解析rs-color.c和example.h中的#include語(yǔ)句。

target_link_libraries(rs-color ${DEPENDENCIES}) 這個(gè)命令為rs-color目標(biāo)指定了鏈接庫(kù),其中${DEPENDENCIES}是一個(gè)變量,包含所有依賴庫(kù)的名字。

set_target_properties (rs-color PROPERTIES FOLDER "Examples/C" )這個(gè)命令為rs-color目標(biāo)設(shè)置了一些屬性,這里指定了在IDE的項(xiàng)目視圖中,rs-color會(huì)出現(xiàn)在Examples/C文件夾下。

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

直接下來(lái)就看幾個(gè)代碼,是不是和學(xué)的C語(yǔ)言不太一樣

這條語(yǔ)句rs2_error *e = 0;

1. 定義了一個(gè)指針e,指向rs2_error類型。

2. 將e初始化為0,也就是RS2_ERROR_NONE,表示沒(méi)有錯(cuò)誤。

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

源碼使用 Intel RealSense SDK 的 C API 創(chuàng)建了一個(gè)上下文對(duì)象 rs2_context,并將其地址賦給 ctx 變量。

同時(shí),它傳遞了 RealSense SDK 的 API 版本號(hào) RS2_API_VERSION 給 rs2_create_context() 函數(shù),該函數(shù)將返回一個(gè) rs2_context 對(duì)象。

在創(chuàng)建上下文對(duì)象時(shí),還傳遞了一個(gè)錯(cuò)誤處理器(error-handler)的地址 &e,以便在運(yùn)行時(shí)捕獲可能出現(xiàn)的錯(cuò)誤。

如果發(fā)生someError,會(huì)通過(guò)*e = ...將e設(shè)置為相應(yīng)的錯(cuò)誤碼。之后,在調(diào)用者可以檢查*e的值來(lái)查看doSomething()是否發(fā)生錯(cuò)誤。這是C語(yǔ)言中一個(gè)很常見(jiàn)的錯(cuò)誤處理方式 - 通過(guò)指針傳遞錯(cuò)誤碼,如果有錯(cuò)誤,被調(diào)用的函數(shù)會(huì)設(shè)置該指針為錯(cuò)誤值。

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

調(diào)用者在調(diào)用后檢查該值來(lái)進(jìn)行錯(cuò)誤處理。這種方式的好處是:

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

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

簡(jiǎn)單和實(shí)用,適用于C語(yǔ)言的語(yǔ)法和習(xí)慣。

當(dāng)然,這個(gè)方式也有一定的缺點(diǎn),比如:

1. 如果不注意檢查錯(cuò)誤指針,難以發(fā)現(xiàn)錯(cuò)誤,這會(huì)影響健壯性。

2. 錯(cuò)誤指針需要與函數(shù)的正確返回值區(qū)分開(kāi)來(lái)檢查,有一定難度。

3. 錯(cuò)誤信息只能通過(guò)指定的指針值返回,表達(dá)能力較有限。所以,對(duì)于rs2_error *e這樣的指針,是可以直接作為C函數(shù)的參數(shù)進(jìn)行傳遞的,這是C語(yǔ)言中一種簡(jiǎn)單實(shí)用的錯(cuò)誤處理方式,但是也有一定的缺陷。

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

在這里被定義了很多

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

更具體的實(shí)現(xiàn)

1.析構(gòu)函數(shù)~rs2_context(),在rs2_context被釋放時(shí)會(huì)調(diào)用ctx->stop()。這是用于停止某個(gè)線程或后臺(tái)服務(wù)。

2. 一個(gè)std::shared_ptr<:context>成員ctx。這是一個(gè)librealsense庫(kù)中的context對(duì)象,通過(guò)shared_ptr智能指針進(jìn)行管理??梢圆聹y(cè),這個(gè)rs2_context結(jié)構(gòu)體表示一個(gè)與librealsense的context相關(guān)的對(duì)象,它在釋放時(shí)會(huì)停止該context,并通過(guò)shared_ptr管理context的生命周期。 其實(shí)這也是一個(gè)使用RAII(Resource Acquisition Is Initialization),通過(guò)在對(duì)象構(gòu)造和析構(gòu)時(shí)啟動(dòng)和停止資源,實(shí)現(xiàn)資源的自動(dòng)管理。

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

這段代碼中,通過(guò)調(diào)用rs2_create_context()函數(shù)創(chuàng)建了一個(gè)rs2_context 實(shí)例,并將該實(shí)例的指針賦值給了 ctx 變量。這個(gè) rs2_context 實(shí)例是在 rs2_create_context() 函數(shù)內(nèi)部創(chuàng)建并初始化的,然后將其地址返回給調(diào)用者,調(diào)用者通過(guò) ctx 變量來(lái)訪問(wèn)和操作該實(shí)例。

可以說(shuō)rs2_context實(shí)例已經(jīng)被初始化并設(shè)置好了,但不能直接說(shuō) rs2_context 里面是一個(gè)已經(jīng)初始化過(guò)的結(jié)構(gòu)體,因?yàn)?rs2_context 只是一個(gè)指針類型,并不存儲(chǔ)任何數(shù)據(jù)。

結(jié)構(gòu)體指針在 C 語(yǔ)言中被廣泛使用,因?yàn)樗梢苑奖愕卦L問(wèn)和操作結(jié)構(gòu)體中的成員,而不需要對(duì)整個(gè)結(jié)構(gòu)體進(jìn)行復(fù)制。結(jié)構(gòu)體指針可以通過(guò)指針運(yùn)算和取值運(yùn)算符來(lái)訪問(wèn)結(jié)構(gòu)體成員,這使得對(duì)結(jié)構(gòu)體的操作變得更加高效。

以下是一些常見(jiàn)的使用結(jié)構(gòu)體指針的場(chǎng)景:

傳遞結(jié)構(gòu)體指針作為函數(shù)參數(shù):這種情況下,函數(shù)可以通過(guò)指針來(lái)訪問(wèn)和修改結(jié)構(gòu)體的成員,從而避免了對(duì)整個(gè)結(jié)構(gòu)體進(jìn)行復(fù)制,提高了程序的效率。

動(dòng)態(tài)內(nèi)存分配:當(dāng)需要?jiǎng)討B(tài)創(chuàng)建一個(gè)結(jié)構(gòu)體對(duì)象時(shí),需要使用結(jié)構(gòu)體指針來(lái)指向該對(duì)象。在動(dòng)態(tài)分配內(nèi)存時(shí),使用結(jié)構(gòu)體指針可以確保只分配所需的內(nèi)存,并且可以方便地釋放分配的內(nèi)存。

鏈表和樹(shù)等數(shù)據(jù)結(jié)構(gòu):鏈表和樹(shù)等數(shù)據(jù)結(jié)構(gòu)通常使用結(jié)構(gòu)體指針來(lái)連接不同的節(jié)點(diǎn),從而構(gòu)建出完整的數(shù)據(jù)結(jié)構(gòu)。

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

- api_version參數(shù)指定了librealsense API的版本號(hào),用于向后兼容。
-e是個(gè)指針,如果有錯(cuò)誤發(fā)生,會(huì)被設(shè)置為錯(cuò)誤碼。這是C語(yǔ)言常見(jiàn)的錯(cuò)誤返回方式。

包含了以下字段:

message:錯(cuò)誤消息,描述錯(cuò)誤 details 的字符串。

function:發(fā)生錯(cuò)誤的函數(shù)名。

args:發(fā)生錯(cuò)誤的函數(shù)調(diào)用的參數(shù)。

exception_type:錯(cuò)誤類型,很可能是一個(gè)enum,表示出錯(cuò)的原因。這個(gè)結(jié)構(gòu)體通常用來(lái)表示異常信息,或是庫(kù)函數(shù)調(diào)用后的錯(cuò)誤詳情。

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

如果一個(gè)函數(shù)返回一個(gè)結(jié)構(gòu)體類型的值,那么需要使用一個(gè)結(jié)構(gòu)體類型的變量來(lái)接收這個(gè)返回值。因?yàn)榻Y(jié)構(gòu)體類型通常比較大,如果直接將結(jié)構(gòu)體類型的值作為函數(shù)的返回值返回,會(huì)導(dǎo)致復(fù)制整個(gè)結(jié)構(gòu)體的內(nèi)存空間,從而影響程序的性能。因此,C 語(yǔ)言中通常使用指向結(jié)構(gòu)體的指針作為返回值,而不是直接返回結(jié)構(gòu)體類型的值。

#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

看這個(gè)

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

 struct person

結(jié)構(gòu)體的指針。

該函數(shù)使用malloc()函數(shù)動(dòng)態(tài)分配內(nèi)存來(lái)存儲(chǔ)結(jié)構(gòu)體,然后將結(jié)構(gòu)體的成員賦值為傳入的參數(shù)。最后,該函數(shù)返回指向該結(jié)構(gòu)體的指針。在 main() 函數(shù)中,調(diào)用 create_person() 函數(shù)來(lái)創(chuàng)建一個(gè)結(jié)構(gòu)體實(shí)例,并打印出其成員的值。在使用完結(jié)構(gòu)體后,還需要調(diào)用 free() 函數(shù)來(lái)釋放動(dòng)態(tài)分配的內(nèi)存。

更具體的來(lái)分析:

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

調(diào)用malloc()函數(shù),請(qǐng)求分配sizeof(struct person)字節(jié)的內(nèi)存塊。這將分配足夠存放person結(jié)構(gòu)體的內(nèi)存。

malloc()返回 void *,所以我們需要強(qiáng)制類型轉(zhuǎn)換為struct person*。這會(huì)將void *轉(zhuǎn)換為person結(jié)構(gòu)體的指針。

person *p將保存分配的內(nèi)存塊地址,我們可以通過(guò)p訪問(wèn)這個(gè)person對(duì)象。

分配的內(nèi)存未初始化,需要手工初始化 person 對(duì)象的各個(gè)字段。

使用malloc()獲取內(nèi)存,強(qiáng)制類型轉(zhuǎn)換為需要的指針類型,使用后釋放內(nèi)存。

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 相機(jī)
    +關(guān)注

    關(guān)注

    4

    文章

    1449

    瀏覽量

    54542
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140769
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    733

    瀏覽量

    22758
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70370
  • RealSense
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    19549

原文標(biāo)題:通過(guò)RealSense代碼說(shuō)明一些C語(yǔ)言問(wèn)題

文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無(wú)跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    分享一些超級(jí)炫酷的C語(yǔ)言小技巧

    C語(yǔ)言常常讓人覺(jué)得它所能表達(dá)的東西非常有限。它不具有類似第級(jí)函數(shù)和模式匹配這樣的高級(jí)功能。但是C非常簡(jiǎn)單,并且仍然有一些非常有用的語(yǔ)法技巧
    發(fā)表于 11-07 11:25 ?814次閱讀

    試用 Intel RealSense

    Pro) 右上角。我們正在通過(guò) PC 上的 RealSense 開(kāi)發(fā)者工具運(yùn)行一些樣本數(shù)據(jù)。與常規(guī)網(wǎng)絡(luò)攝像頭不同,這款攝像頭模塊可以使用紅外線測(cè)量距離。因此它可以識(shí)別人類的動(dòng)作和手勢(shì),還能以 3D
    發(fā)表于 09-25 00:21

    Linux內(nèi)核中GNU C擴(kuò)展的一些常用C語(yǔ)言語(yǔ)法分析

    13.1 總結(jié)前面12節(jié)的課程,主要針對(duì) Linux 內(nèi)核中 GNU C 擴(kuò)展的一些常用 C 語(yǔ)言語(yǔ)法進(jìn)行了分析。GNU C 的這些擴(kuò)展語(yǔ)法
    發(fā)表于 12-14 06:29

    C語(yǔ)言使用必須了解的一些問(wèn)題495個(gè)C語(yǔ)言問(wèn)題選集免費(fèi)下載

    《你必須知道的495個(gè)C語(yǔ)言問(wèn)題》書(shū)于2009年由人民郵電出版社出版發(fā)行,該書(shū)以問(wèn)答的形式組織內(nèi)容,討論了學(xué)習(xí)或使用C語(yǔ)言的過(guò)程中經(jīng)常遇到
    發(fā)表于 11-01 11:46 ?22次下載

    C語(yǔ)言C++編程的一些思考資料說(shuō)明

    1、其實(shí)高級(jí)語(yǔ)言和面向過(guò)程的語(yǔ)言最求的目標(biāo)都是致的,高可復(fù)用性,另外,封裝性。我發(fā)現(xiàn)自己在寫C語(yǔ)言的時(shí)候,總是不自覺(jué)地就引入了高級(jí)
    發(fā)表于 05-09 18:16 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>和<b class='flag-5'>C</b>++編程的<b class='flag-5'>一些</b>思考資料<b class='flag-5'>說(shuō)明</b>

    一些基礎(chǔ)的C語(yǔ)言程序及其源代碼資料合集免費(fèi)下載

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

    單片機(jī)C語(yǔ)言代碼編寫技巧

    下面發(fā)一些我在網(wǎng)上看到的單片機(jī)C語(yǔ)言代碼編寫技巧和自己的一些經(jīng)驗(yàn)來(lái)和大家分享;
    發(fā)表于 07-14 11:02 ?3122次閱讀

    關(guān)于C語(yǔ)言一些特殊功能介紹

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

    通過(guò)一些附加信息和有用的實(shí)現(xiàn)技術(shù)對(duì)C函數(shù)的探索

    在本文中,我們將通過(guò)一些附加信息和一些有用的實(shí)現(xiàn)技術(shù)來(lái)結(jié)束對(duì)C函數(shù)的探索。 基本的C函數(shù)(例如,
    的頭像 發(fā)表于 09-27 11:11 ?1745次閱讀

    C語(yǔ)言常見(jiàn)的一些標(biāo)準(zhǔn)庫(kù)

    有很多工程師喜歡自己封裝一些標(biāo)準(zhǔn)庫(kù)已有的函數(shù),其實(shí)自己封裝的函數(shù),并不定比標(biāo)準(zhǔn)庫(kù)好,有時(shí)候反而代碼更冗余,且有bug。下面就來(lái)分享C
    的頭像 發(fā)表于 11-18 16:22 ?3349次閱讀

    C語(yǔ)言一些常用標(biāo)準(zhǔn)庫(kù)分享

     有很多工程師喜歡自己封裝一些標(biāo)準(zhǔn)庫(kù)已有的函數(shù),其實(shí)自己封裝的函數(shù),并不定比標(biāo)準(zhǔn)庫(kù)好,有時(shí)候反而代碼更冗余,且有bug。下面就來(lái)分享C
    的頭像 發(fā)表于 11-22 11:54 ?3041次閱讀

    C語(yǔ)言和STM32學(xué)習(xí)的一些學(xué)習(xí)筆記

    自己總結(jié)的一些C語(yǔ)言和STM32F1學(xué)習(xí)的一些筆記,適合想快速了解學(xué)習(xí)C語(yǔ)言和STM32單片機(jī)的
    發(fā)表于 03-24 14:53 ?36次下載

    分享一些Python代碼加速工具

    這篇文章會(huì)提供一些優(yōu)化代碼的工具。會(huì)讓代碼變得更簡(jiǎn)潔,或者更迅速。
    發(fā)表于 07-07 11:18 ?521次閱讀

    C語(yǔ)言如何寫出高效代碼呢?

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

    單片機(jī)C代碼嵌套匯編的一些方法

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

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品