【问题标题】:A recommendation for how to specify parameter values in C关于如何在 C 中指定参数值的建议
【发布时间】:2013-08-31 22:38:34
【问题描述】:

我想用 C 编写计算机模拟代码。我对 C 很陌生,主要有 Python 方面的经验 还有一点Javascript。我想要一些关于以下最佳实践的建议。

计算机模拟基于许多参数。指定这些参数值的最佳方法是什么?应该将它们指定为变量,还是应该使用#define 宏设置它们的值。

例如,我可以做

int numpeople = 100;

或者,

#define numpeople 100

哪个是更好的做法,还是没关系?模拟中某些数组的长度取决于参数。如果我指定参数值 使用可变方法然后我不能用它来指定长度数组。

例如,

// This is invalid.
int numpeople = 10;
int ids[numpeople];

在这种情况下,你会说我别无选择,我应该使用

#define numpeople 100
int ids[numpeople];

或者还有其他更好的方法。

最后,无论我以哪种方式定义参数,我都想在一个地方列出参数的可能值,然后让模拟针对每个可能的值运行。也就是说,假设 parameter1 可以取值 100、200、300,parameter2 可以取值 5、25、50。

我想首先运行模拟,其中parameter1 取值 100,parameter2 取值 5。然后,我想运行它,parameter1 取值 100,parameter2 取值 25.. . 以此类推,对于可以用这些值形成的所有 9 种组合。如果我不必在每次模拟完成时手动更改组合,我会更喜欢。有没有一种方法可以以某种形式列出所有组合(我要求推荐用于此组合的数据结构),然后让代码一次读取一个。这就是我将如何在运行时设置参数的值。

也许没有一种方法可以做到这一点。但如果您认为这是一种好方法,我将不胜感激。

如果您需要任何进一步的说明,请告诉我。

感谢您阅读本文和您的回答。

【问题讨论】:

  • int numpeople = 10; int ids [numpeople]; 在 C99 和 C11 下完全有效。
  • Google C++ 风格指南建议不要对 const 值使用宏,它包含good reasons 的列表,单击左侧的箭头即可显示。
  • @verbose 即使我在 gcc 命令中指定 -std=c99 ,我也会收到错误 error: variably modified ‘ids’ at file scope。还有什么我应该做的。 @Douglas 感谢有关宏的链接。
  • 啊,是的,你不能在文件范围内这样做。可变长度的大小必须在运行时知道,以便为它分配适当的内存量。由于文件中的任何内容都可以修改numpeople,这意味着即使在运行时也无法知道ids[] 的大小。

标签: c simulation


【解决方案1】:

如果您的模拟由许多值参数化,请考虑将这些值作为单个结构传递给模拟设置。像这样:

struct Params {
  int num_people;
  int simulation_steps;
  int step_size;
  // ...
}

void your_simulation(const &Params params) {
  int people_ids[params.num_people];
  // ...
}

这样您就可以在标题、主文件或其他任何内容中设置多次运行。

Params small_sim = {
  .num_people = 10,
  .simulation_steps = 5,
  .step_size = 30,
};

Params big_sim = {
  .num_people = 100,
  .simulation_steps = 5000,
  .step_size = 3,
};

main() {

  if (...) {
    your_simulation(&small_sim);
  } else {
    your_simulation(&big_sim);
  }
}

这将使单元测试更容易,因为您可以设置具有已知预期输出的固定模拟,您也可以稍后扩展程序以从输入文件、命令行或其他地方获取其参数。

【讨论】:

  • 我达不到 C11(甚至 C99)。 const &Params params 有效吗?我认为不会。
  • 对结构的常量引用就可以了。不过应该拼写为“const Params &params”。我不希望有人会剪切和粘贴这段代码,所以我不担心。不过感谢您的评论。
  • 但是 C11 中是否存在引用语法?我不记得在任何地方读过。
  • 引用在支持它们的语言中很好。 C 没有。
  • 如果提问者只使用 C,那么他们将使用指针。相同答案的不同实现——传入包含参数的结构。任何人都应该随意编辑答案以满足精确度的需求。
【解决方案2】:

您还可以将参数值作为命令行参数传递给您的程序。

例如,

【讨论】:

  • ./program_name
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2011-06-19
  • 2013-11-20
相关资源
最近更新 更多