【问题标题】:C++ Calling function inside another function that uses references and parametersC++ 在另一个使用引用和参数的函数中调用函数
【发布时间】:2015-01-20 11:29:44
【问题描述】:

我在 Arduino IDE(基本上使用 C++)上编程,我在调用另一个函数时遇到了麻烦。部分代码如下:

unsigned long int deslocamento (char sentido, byte &cont, const int pino, unsigned long int posicaoA)
{
  byte leitura;
  unsigned int deltaposicao;

  leitura = digitalRead(pino);

  if ((leitura == HIGH) && (cont == 0))
  {
    cont = 1;
  }

  if ((leitura == LOW) && (cont == 1))
  {
    cont = 0;

    deltaposicao++;
  }

  if (sentido == 'F')
  {
    posicaoA += deltaposicao;
  }

  else
  {
    posicaoA -= deltaposicao;
  }

  return posicaoA;
}

void zeramento (unsigned long int posicaoA)
{
  byte pwm = 255;
  char sentido = 'R';

  byte fator;

  fator = fatorcorrecaoP (pwm);

  while (posicaoA != 0)
  {
    posicaoA = deslocamento (sentido, cont, pinencoder, posicaoA);

    posicaoA -= fator;

    comando (sentido, pwm);
  }
}

在函数“void zeramento”上,我是否应该将函数“unsigned long int deslocamento”使用的所有输入(参数)声明为输入,或者有一个更简单和更短(或者在内存优化方面更有效)的方法去做?例如,我应该声明为“void zeramento(posicaoA, sentido, &cont, pinecoder)”吗?

感谢大家,如有任何问题,我们深表歉意。我是新来的,还在学习英语。

【问题讨论】:

  • 我无法理解这个问题。
  • 我省略了其余的代码,但我会尽力描述它。这是操作切割机的 ATMEGA 的代码。该机器有许多用户输入,如操作速度和长度。它到达确定的位置,然后返回。它还有许多其他功能,例如内存处理。两者中的第一个(“deslocamento”)根据移动方向、最后位置和编码器传感器的读数确定机器的实际位置。第二个仅在开始时执行,它的 for 将机器移动到零位置,基于打开时的位置。
  • 为什么?由于 posicaoA 指的是最后一个位置,并且函数“deslocamento”根据覆盖的距离更新 posicaoA。
  • 我注意到它是一个全局变量,尽量避免使用它们。
  • 这不是一个好理由,将其作为参数传递。

标签: c++ c function arduino arduino-ide


【解决方案1】:

这取决于您要达到的目标。对于更短的代码,我将调用您的函数 funcAfuncB 以及参数 par1par2

你可以做任何一个

void funcA(int par1, int par2)
{ ... use par1 and par2 ... }

void funcB(int par1, int par2)
{
    ...
    funcA(par1, par2);
    ...
}

int global_par1;
int global_par2;

void funcA(int par1, int par2)
{ ... use par1 and par2 ... }

void funcB()
{
    ...
    funcA(global_par1, global_par2);
    ...
}

在第一种情况下,您只使用局部变量,而在第二种情况下,您使用全局变量。

不同之处在于,在全局情况下(请在 funcAfuncB 中以不同的方式称呼它们,因为可能存在可读性问题)变量对于整个程序是唯一的(即,如果您在 @987654329 中修改它们@你甚至会在函数中修改它们),而在本地情况下,你只是在处理它们的本地副本。

在我看来,由于这些变量确定了位置(这是唯一的),我会采用一个完全全局的解决方案,即

int global_par1;
int global_par2;

void funcA()
{ .. use global_par1 and global_par2.. }

void funcB()
{
    ...
    funcA();
    ...
}

【讨论】:

  • 那么,正如我所说,我应该将其声明为 void zeramento(posicaoA, sentido, &cont, pinecoder) 吗?我想避免它,因为我已经必须将所有这些参数指定给函数 deslocamento。对我来说它看起来模棱两可,所以我认为它会有更合适的方式
  • 如果您更喜欢局部变量版本,可以。或者更好,我称之为void zeramento (char sentido, byte &cont, const int pino, unsigned long int posicaoA)(最后是posicaoA,只是为了两个函数的指纹相同 - 它更具可读性)
  • 不客气,但是...“不完全如我所愿”是什么意思? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 2017-02-17
相关资源
最近更新 更多