我可以只将数组的特定元素声明为常量吗? (C/C++/Fortran)

Can I declare only specific elements of an array as constant? (C/C++/Fortran)

场景: 我通过例如一个二维矩阵作为函数中的参数,我希望能够读取和更改所有元素,但是 我想防止任何意外写入比方说最后一列。所以我想以某种方式告诉编译器将此函数中的特定元素用作常量。

可能无法完成,但在某些情况下会很有用。

数组是普通类型对象的连续块;所以你的建议不被支持。

适当的解决方案是封装数组并通过可以应用所需语义的函数访问它。事实上,如果你使用 C++,你可以封装在 class 中,重载 [] 运算符,这样你就可以应用你需要的语义,同时仍然使用数组访问符号。

不,这是不可能的。那是因为array一定是普通类型,而int虽然看起来和const int一样,但不是同一种类型。

在 Fortran 中这是不可能的。它在其他语言中没有任何两种不同的类型,如 intconst 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;

然后用上述对象的其他实例之一填充您的靴子。处理异常!

我建议您在用户试图覆盖这些元素时跳过它们。