我可以只将数组的特定元素声明为常量吗? (C/C++/Fortran)
Can I declare only specific elements of an array as constant? (C/C++/Fortran)
场景:
我通过例如一个二维矩阵作为函数中的参数,我希望能够读取和更改所有元素,但是 我想防止任何意外写入比方说最后一列。所以我想以某种方式告诉编译器将此函数中的特定元素用作常量。
可能无法完成,但在某些情况下会很有用。
数组是普通类型对象的连续块;所以你的建议不被支持。
适当的解决方案是封装数组并通过可以应用所需语义的函数访问它。事实上,如果你使用 C++,你可以封装在 class 中,重载 []
运算符,这样你就可以应用你需要的语义,同时仍然使用数组访问符号。
不,这是不可能的。那是因为array
一定是普通类型,而int
虽然看起来和const int
一样,但不是同一种类型。
在 Fortran 中这是不可能的。它在其他语言中没有任何两种不同的类型,如 int
和 const int
,但你仍然不能自动保护数组的一部分不被修改。 intent(in)
参数属性也可以只保护整个数组。
只需确保正确编写程序并对其进行彻底测试。您可以使用调试器来测试内存的某个部分是否被修改。
这是 C++ 中可能性的草图
class Item {
protected:
int <or some other type> value;
public:
Item(int x) : value (x) {};
int Get() const ( return value; };
void Set(int x) { throw std::runtime_error("Oh Dear!");
};
class Settable : public Item {
public:
void Set(int x) { value = x; };
};
那么一个二维向量(我们用的是C++)就可以
std::vector<std::vector<std::shard_ptr<item>>> list;
然后用上述对象的其他实例之一填充您的靴子。处理异常!
我建议您在用户试图覆盖这些元素时跳过它们。
场景: 我通过例如一个二维矩阵作为函数中的参数,我希望能够读取和更改所有元素,但是 我想防止任何意外写入比方说最后一列。所以我想以某种方式告诉编译器将此函数中的特定元素用作常量。
可能无法完成,但在某些情况下会很有用。
数组是普通类型对象的连续块;所以你的建议不被支持。
适当的解决方案是封装数组并通过可以应用所需语义的函数访问它。事实上,如果你使用 C++,你可以封装在 class 中,重载 []
运算符,这样你就可以应用你需要的语义,同时仍然使用数组访问符号。
不,这是不可能的。那是因为array
一定是普通类型,而int
虽然看起来和const int
一样,但不是同一种类型。
在 Fortran 中这是不可能的。它在其他语言中没有任何两种不同的类型,如 int
和 const int
,但你仍然不能自动保护数组的一部分不被修改。 intent(in)
参数属性也可以只保护整个数组。
只需确保正确编写程序并对其进行彻底测试。您可以使用调试器来测试内存的某个部分是否被修改。
这是 C++ 中可能性的草图
class Item {
protected:
int <or some other type> value;
public:
Item(int x) : value (x) {};
int Get() const ( return value; };
void Set(int x) { throw std::runtime_error("Oh Dear!");
};
class Settable : public Item {
public:
void Set(int x) { value = x; };
};
那么一个二维向量(我们用的是C++)就可以
std::vector<std::vector<std::shard_ptr<item>>> list;
然后用上述对象的其他实例之一填充您的靴子。处理异常!
我建议您在用户试图覆盖这些元素时跳过它们。