![](/img/trans.png)
[英]C++ invalid conversion from ‘char*’ to ‘const unsigned char*’
[英]C++ Returning a const unsigned char
所以,我一直在努力解決這個問題。 我有一個簡單的 function,定義如下:
const unsigned char GetColor(unsigned int x, unsigned int y)
{
const unsigned char color[3] = {0, 1, 0};
return color;
}
然而,我不允許這樣做,編譯器返回以下錯誤:
Error: cannot initialize return object of type 'const unsigned char' with an lvalue of type 'const unsigned char [3]'
我應該將數組轉換為指向數組的指針,我應該返回嗎? 如果我這樣做,難道我不會冒着在“超出范圍”之后將其刪除的風險——也就是超出 function 的風險嗎?
任何有助於理解這個問題的幫助將不勝感激:)
編輯:最終目標是擁有一個 function,它可以在給定 x 和 y 值的情況下在像素位置返回顏色。 這意味着顏色會根據 x- 和 y 的值發生變化。 上面的例子是一個簡化。
它應該返回一個大小為 3 的 const unsigned char 數組,每個數組都有一個值。
你想返回一個數字數組。 您是對的,嘗試將某種引用傳遞給局部變量會導致 scope 出現問題(技術上稱為懸空指針/懸空引用),盡管原因與所示不同。 (編譯器只是抱怨單個char
和char
數組之間的類型不一致。)
C++ 為您提供了幾種安全的方法。 例如,您可以返回一個array
類型:
#include <array>
std::array<unsigned char, 3> GetColor(unsigned int x, unsigned int y)
{
return {0, 1, 0};
}
這使得“三個字符”成為包含三個字符的特殊類型的單個變量,就像struct { unsigned char a, b, c; }
struct { unsigned char a, b, c; }
。 或者你可以制作自己的類型來做類似的事情。
在上面,您可以想象編譯器以某種方式隱式聲明的“返回變量”,就好像它的 scope 是您調用function 的語句。 return
語句寫入這個變量,而不是這個 function 的本地數組。
顯然,您需要更改調用代碼,使其期望std::array<unsigned char, 3>
而不是unsigned char[3]
,但是a)以前的版本無論如何都無法正常工作,所以我們在說新代碼而不是嘗試更改現有代碼庫,並且 b) std::array
通常在新代碼中優於 C 風格的 arrays 並且值得學習使用它們。
當然,總是有不安全的方式,例如:
unsigned char* GetColor(unsigned int x, unsigned int y)
{
unsigned char* ret = new unsigned char[3] { 0, 1, 0 };
return ret;
}
但是,一旦不再需要它,您就不能忘記delete[]
返回的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.