2016-09-19 74 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