关于如何在C中指定参数值的建议

关于如何在C中指定参数值的建议,c,simulation,C,Simulation,我想用C语言编写一个计算机模拟程序。我对C语言非常陌生,主要有Python方面的经验 还有一点Javascript。我想就以下方面的最佳实践提出一些建议 计算机模拟是基于许多参数的。指定这些参数值的最佳方法是什么?是将它们指定为变量,还是使用#define宏设置它们的值 例如,我能做什么 int numpeople = 100; 或者 哪一个更好的做法,还是无关紧要?模拟中某些阵列的长度取决于参数。如果我指定参数值 使用变量方法,则无法使用它指定数组的长度 比如说, // This is in

我想用C语言编写一个计算机模拟程序。我对C语言非常陌生,主要有Python方面的经验 还有一点Javascript。我想就以下方面的最佳实践提出一些建议

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

例如,我能做什么

int numpeople = 100;
或者

哪一个更好的做法,还是无关紧要?模拟中某些阵列的长度取决于参数。如果我指定参数值 使用变量方法,则无法使用它指定数组的长度

比如说,

// This is invalid.
int numpeople = 10;
int ids[numpeople];
在这种情况下,你会说我没有任何选择,我应该使用

#define numpeople 100
int ids[numpeople];
还是有其他更好的方法

最后,无论以何种方式定义参数,我都希望在一个位置列出参数的可能值,然后让模拟针对每个可能值运行。也就是说,假设
参数1
可以取值100、200、300,而
参数2
可以取值5、25、50

我想首先运行模拟,
parameter1
取值100,
parameter2
取值5。然后,我想用
parameter1
取值100,而
parameter2
取值25来运行它。。。依此类推,可以使用这些值形成的所有9个组合。如果我不必在每次模拟完成时手动更改组合,我更愿意这样做。是否有一种方法可以以某种形式列出所有组合(我要求提供用于此组合的数据结构建议),然后让代码一次读取一个。这就是我在运行时设置参数值的方式

也许没有一种方法可以做到这一点。但如果你认为这是个好办法,我会很感激的

请让我知道,如果你需要任何进一步的澄清


谢谢阅读和回答。

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

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);
  }
}

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

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

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);
  }
}

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

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


例如,

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


例如,

int numpople=10;int-id[numpeople]在C99和C11下完全有效。谷歌C++风格指南建议不要使用宏来定义常量值,它包括一个列表,点击左边的箭头显示它们。@ VBBOSE我得到了错误<代码>错误:在文件范围中可变地修改了“IDS”,即使我在GCC命令中指定了STD= C99。还有什么我应该做的吗@Douglas感谢您提供有关宏的链接。啊,是的,您不能在文件范围内这样做。在运行时必须知道可变长度的大小,以便为其分配适当的内存量。由于文件中的任何内容都可以修改
numpople
,这意味着即使在运行时也无法知道
ids[]
的大小;int-id[numpeople]在C99和C11下完全有效。谷歌C++风格指南建议不要使用宏来定义常量值,它包括一个列表,点击左边的箭头显示它们。@ VBBOSE我得到了错误<代码>错误:在文件范围中可变地修改了“IDS”,即使我在GCC命令中指定了STD= C99。还有什么我应该做的吗@Douglas感谢您提供有关宏的链接。啊,是的,您不能在文件范围内这样做。在运行时必须知道可变长度的大小,以便为其分配适当的内存量。由于文件中的任何内容都可以修改
numpople
,这意味着即使在运行时也无法知道
ids[]
的大小。我还不到C11(甚至不到C99)。
const&Params-Params
有效吗?我不这么认为。对一个结构的不断引用是很好的。但是应该拼写为“const Params&Params”。我不希望有人会剪切和粘贴这段代码,所以我不担心。谢谢你的评论。但是C11中有引用语法吗?我不记得在任何地方读过。在支持它们的语言中,引用是可以的。如果提问者只使用C,那么他们将使用指针。相同答案的不同实现——传入包含参数的结构。任何人都可以自由编辑答案,以满足精度的需要。我还没有达到C11(甚至C99)。
const&Params-Params
有效吗?我不这么认为。对一个结构的不断引用是很好的。但是应该拼写为“const Params&Params”。我不希望有人会剪切和粘贴这段代码,所以我不担心。谢谢你的评论。但是C11中有引用语法吗?我不记得在任何地方读过。在支持它们的语言中,引用是可以的。如果提问者只使用C,那么他们会