2016-09-19 72 views
0

在我的C99程序中,我有一個指向浮點數的結構(表示一個矩陣)。該結構會經歷一系列例程,例如main使用指向常量數據的指針的替代方法?

我想確保結構的內容(矩陣中的實際值)不會被調用的例程保持不變。但是數據應該可以從main改變。

我已經想出了以下解決方案,在那裏我定義一個指針const數據:

struct math_object { 
    const real_t *p_to_matrix; 
}; 

這樣做,沒有所謂的例程可以改變的基礎數據通過p_to_matrix指向。

在節目的一開始我分配一些內存指向user_matrix,我初始化值,並指向p_to_matrixuser_matrix使用這個(有點醜陋)鑄造:

real_t *user_matrix; 
... allocate memory ... 
... initialize the data ... 
math_object1.p_to_matrix = (const real_t *) user_matrix; 

然後,我只允許用戶更改user_matrix指向的值。

是否有更好/更清潔/更安全的方式傳遞數據應該被認爲是const被調用的例程,但是您需要一次又一次更改相同的數據?

+1

它不能被強制執行,但爲什麼不簡單地聲明該函數採用'const real_ *'參數?然後編譯器和代碼的讀者都會知道該函數不會修改數據。 –

+0

我在一個結構中有20多個矩陣,所以然後參數列表變得很長.. – Nibor

+0

'p_to_matrix *指向一維數組,而不是矩陣(即二維數組)。除非你完全理解了所有的含義,否則不要投。說,ples提供[mcve]。目前尚不清楚你的問題是什麼。 – Olaf

回答

1

一種方法是不讓API的用戶看到struct math_object的結構,而是提供與它交互的功能。這樣,您就能夠保持指針非const,並完全避免鑄造:

// This goes into the header file for your API 
struct math_object; // Forward declaration 
struct math_object* math_allocate(/* allocation parameters go here */); 
void math_free(struct math_object* obj); 
const real_t *math_get_matrix(struct math_object* obj); 

您可以防止用戶看到指針的值,以使兩倍多包裝的費用:

real_t math_get_matrix_val(struct math_object* obj, size_t row, size_t col); 
void math_set_matrix_val(struct math_object* obj, size_t row, size_t col, real_t val); 

現在,您可以定義struct math_object您的實現有一個非const指針裏,因爲你的API的用戶只能看到頭部,所以他們沒有進入內部:

struct math_object { 
    real_t *p_to_matrix; 
}; 

I have 20+ matrices in a struct , so then the argument lists get very long.

你有兩種方法給API用戶訪問20+矩陣:

  • 製作20+ API函數,每個矩陣 - 這種方法效果最好的矩陣表示無關的事情,或者
  • 創建一個需要矩陣「數字」或其他標識符的函數 - 當矩陣表示相似的概念,幾乎是一個矩陣數組時,這是有效的。
+0

但被調用的例程仍然可以更改數據,對吧?這就是我想要阻止的。 – Nibor

+2

使用'const'自定義文檔,調用的例程不會更改引用的對象。所以也許'math_change_this(struct math_object * obj)'和'math_read_that(const struct math_object * obj)'? – chux

+0

@chux但是'const struct'與'const'字段的'struct'不一樣,對吧?我仍然能夠改變結構內部指向的數據。 – Nibor