看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) None 問題(Question): 現在正在開發一個函式, 目的是要提供一個介面讓使用者傳送資料, 介面定義如下: SendVendorCmd(short cmd, char *data, int dataLength) 我目前知道的是如果進來的資料是用malloc配置記憶體的話, 可以用_msize來查看大小, 如果是null-terminated的字串的話, 可以用strlen來查看大小, 但是不確定使用者會用哪種配置方式, 而且這筆資料也不一定會是null-terminated, 所以我加了一個dataLength的參數。 又考慮到假如使用者丟的dataLength大小超過實際上data的長度, 可能會產生問題, 所以想請教有辦法判斷使用者傳進來的data真正的長度嗎? 還是有其他更適合的參數宣告嗎? 餵入的資料(Input): None 預期的正確結果(Expected Output): None 錯誤結果(Wrong Output): None 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 113.196.154.130 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1458612555.A.02D.html
Caesar08: dataLength超過實際大小是使用者的問題吧,應該不用管 03/22 10:21
所以我應該本著使用者不會耍蠢的想法來做嗎哈哈
Clangpp: char *可以改用string就好了?? 這就不用擔心了?? 03/22 12:09
Clangpp: 不然就是用vector<char> 03/22 12:17
主要是因為丟進來的東西不一定真的是字串 也有可能是一整串硬體控制的指令 所以就沒有考慮string了 vector<char>的部分我再研究看看 謝謝你的意見!!
Caesar08: 我猜他可能只能用C 03/22 12:32
就只有介面的參數部分我是希望用不是C++的型別啦 所以只能捨棄掉很多好用的東西
CaptainH: 應該只能這樣 03/22 14:08
noodleT: 你的data 會不會有0x00的資料?有的話就只能用datalength 03/23 07:11
基本上會有 不過我蠻好奇如果沒有0x00的資料的話 有什麼其他的判斷方法嗎?
Clangpp: 有0x00的話喔 你還是用vector<byte>吧 為什麼一定要用cha 03/23 09:55
Clangpp: r呢?? 03/23 09:55
Clangpp: 然後建議你可以去看 effecitve STL有教你如何用vector跟 03/23 09:57
Clangpp: C的API來接 03/23 09:57
非常謝謝你的建議!! 至於為啥一定要用char... 因為送到硬體的資料我是用WriteFile 又是臨時學C++的 所以不知不覺還是用C的寫法在寫這些東西 不過現階段也不知道該怎麼做會比較好 我實際上是在開發JNI跟硬體之間溝通的API JNI丟下來的資料型態是jstring 不過剛剛查了一下jstring也可以轉std::string std::string也可以轉成char*讓我可以丟進去WriteFile 這樣看來用string是一個好主意 我再來研究一下如果要改成string該怎麼設計 也非常謝謝大家給的建議!!
Clangpp: 我看了一下 WriteFile的API沒有必要用char吧?? 03/23 22:02
實際上他是LPVOID的型別 不過因為我們用的硬體的關係 所以習慣都用char的陣列丟指令
EdisonX: 硬體收發資料實際上是用 unsigned char 較佳。 03/24 10:01
想請教一下使用char會有什麼疑慮嗎? 因為在Java的部分是沒有unsigned的 如果會有問題我可能要想辦法來測試一下...
firejox: 要不然你就自己封裝一個資料結構 讓使用者用這個來傳 03/24 23:06
例如使用struct然後在裡面放入必要的變數嗎?
noodleT: 有一些標準函式也會要求使用者輸入資料長度,或像 printf 03/26 23:09
noodleT: 他也是信賴你輸入的引數夠給 format 使用。看你是想採取 03/26 23:09
noodleT: 怎樣的設計 03/26 23:09
noodleT: 你的 data 有固定格式嗎?例如結尾固定是兩個0x00,0x00? 03/26 23:15
noodleT: 這樣的話就可以自己去掃陣列獲得長度。 03/26 23:15
noodleT: 題外話,你的引數 char *data 建議改成 const char *data 03/26 23:15
目前data沒有固定格式耶 不過應該也是能規定使用者最後要加上去? 引數的部分我會再更改一下的 謝謝你的建議~
Clangpp: 加const 是為了保護你傳進來的資料不會被變動 03/27 22:17
noodleT: const 也是讓使用者能夠信賴你不會去改我的值 03/27 23:22
謝謝兩位的建議 小弟我對這部分的著墨實在是不夠 還好有大家的幫助才能把這個東西做得更好!! ※ 編輯: petercoin (220.130.36.2), 03/28/2016 08:26:14