2014-03-06 67 views
0
uint32 measurements [32]; 

Xcp_Addr_t XcpApp_ConvertAddress(uint32 address, uint8 extension) 
{ 

    return &measurements[address]; //return from incompatible pointer type 

} 

地址是我從客戶端收到的值(例如:0,1,2 .....)。上述功能用於將測量地址返回到其他內部功能。我收到以下警告:在C中不兼容的指針類型警告?

return from incompatible pointer type 

誰能告訴我如何解決這個問題?

+3

'Xcp_Addr_t'的typedef是什麼? – Shoe

+0

typedef uint8 * Xcp_Addr_t; – user3383557

+2

那麼,'uint8_t *'與'uint32_t *'不一樣 - 你有我的理由嗎? –

回答

1

這一切都取決於Xcp_Addr_t的類型。你的表情是:&measurements[address]。表達式的類型可轉換爲uint32*。如果您的退貨類型是僞裝的uint32,那麼只需刪除&運營商。如果你的返回類型完全不同,你應該重新思考你在做什麼。


所以你的類型定義是:

typedef uint8* Xcp_Addr_t; 

,你可以看到uint8*uint32*(實際返回值的類型)(返回類型)不匹配。您可以改變返回類型或數組measurements到類型:

uint8 measurements[32]; 

好了,所以你要確保XcpApp_ConvertAddress返回一個有效的指針(不用出界)。你有兩個選擇:

  • 斷言它
  • 拋出一個異常

您可以通過執行斷言它:

assert(address < 32); 
return &measurements[address]; 
在這種情況下

程序會在運行時,如果失敗傳遞給該函數的地址不正確(請注意,您必須添加#include <cassert>才能使用assert)。

或者,你可以拋出一個異常:

if (address < 32) throw std::runtime_error("out of bounds"); 
return &measurements[address]; 

(請注意,你需要爲#include <stdexcept>std::runtime_error)。

+0

它應該是uint8度量[32]; – user3383557

+0

@ user3383557,那會解決它,是的。 – Shoe

+0

您可能還想在返回之前檢查「address <32」;否則你執行一個越界數組訪問。 –

0

您必須決定是否要返回measurements[address]或其指針的值!

+0

我想返回測量地址 – user3383557

+0

,所以聲明變量'Xcp_Addr_t''like'typedef uint8 * Xcp_Addr_t;' –

+0

@Anis_Stack請添加您的代碼部分作爲答案的一部分。 – CSchulz

相關問題