在我的C99程序中,我有一个带浮点指针的结构(表示矩阵)。结构体经历了一组例程,称为main
。
我想确保被调用的例程不改变结构的内容(矩阵中的实际值)。但是,数据应该可以从main
更改。
我提出了以下解决方案,我在其中定义了指向const
数据的指针:
struct math_object {
const real_t *p_to_matrix;
};
这样做,所有被调用的例程都不能更改p_to_matrix
指向的基础数据。
在程序的最开始,我分配了user_matrix
指向的一些内存,我初始化了值,并使用这个(有点丑陋的)演员将p_to_matrix
指向user_matrix
:< / p>
real_t *user_matrix;
... allocate memory ...
... initialize the data ...
math_object1.p_to_matrix = (const real_t *) user_matrix;
然后我只允许用户更改user_matrix
指向的值。
是否有一种更好/更清洁/更安全的传递数据的方式应该被调用的例程视为const
,但是你需要一次又一次地更改相同的数据?
答案 0 :(得分:1)
一种方法是不要让API的用户完全看到// 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);
的结构,而是提供与之交互的功能。通过这种方式,您可以将指针保持为非const,并完全避免使用:
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指针在您的实现中定义struct math_object {
real_t *p_to_matrix;
};
,因为您的API的用户只看到标题,因此他们无权访问内部:
struct
我在
ss = series_of_dates.astype(str).tail(1).reset_index().loc[0, 'date']
中有20多个矩阵,因此参数列表会很长。
您有两种方法可以让API用户访问20多个矩阵: