c ++ struct - 使用计数器在for循环内部修改

c++ struct - modify inside for loop using counter

我对 C++ 有点陌生。我正在尝试使用结构来更好地组织我的数据。

在下面的代码中,我试图修改一个结构成员。所有成员都使用 int 命名。

我有两个问题:

我的计数器 currentParticleCount 在添加到结构后不会增加。 我在 for 循环中使用计数器 i 来引用结构数据的方式似乎有错误...

正如我所说,我是 C++ 的新手,我可能不知道我想要实现的目标的正确术语,并且在网上找不到任何真正的答案。

int currentParticleCount = 0;
 
struct particle
{
 int velocity;
 int trajectory;
 int currentPosition[2] = {0, 0};
 int mass;
};

void createParticle()
{
  struct particle currentParticleCount = {
    random(1, 10),
    random(0, 360),
    {random(1, MAX_SCREEN_HEIGHT), random(1, MAX_SCREEN_WIDTH)},
    random(1, 10),
  };
  currentParticleCount++;
}

void runParticles()
{
  for (int i = 0; i < currentParticleCount; i++)
  {
    particle.i.currentPosition[0] = particle.i.currentPosition[0] + ((particle.i.velocity) * cos(particle.i.trajectory));

    particle.i.currentPosition[0] = particle.i.currentPosition[0] + ((particle.i.velocity) * sin(particle.i.trajectory));
  }

}

我收到以下错误:

_particle: In function 'void createParticle()':

144:25: warning: no 'operator++(int)' declared for postfix '++', trying prefix operator instead [-fpermissive]
     currentParticleCount++;
                         ^

_particle:144: error: no match for 'operator++' (operand type is 'particle')

_particle: In function 'void runParticles()':

_particle:151: error: expected unqualified-id before '.' token
     particle.i.currentPosition[0] = particle.i.currentPosition[0] + ((particle.i.velocity) * cos(particle.i.trajectory));
             ^

_particle:153: error: expected unqualified-id before '.' token
     particle.i.currentPosition[0] = particle.i.currentPosition[0] + ((particle.i.velocity) * sin(particle.i.trajectory));
             ^

no match for 'operator++' (operand type is 'particle')

您的代码有一些问题;我会尽力解决所有问题:

void createParticle()
{
  struct particle currentParticleCount = {
    random(1, 10),
    random(0, 360),
    {random(1, MAX_SCREEN_HEIGHT), random(1, MAX_SCREEN_WIDTH)},
    random(1, 10),
  };
  currentParticleCount++;
}
  1. 这里不需要 struct 关键字 - particle <name> {...} 就足够了。
  2. 您声明了一个名为 currentParticleCountparticle 实例,其中 shadows 是全局 int currentParticleCount。为您的粒子选择一个不同的名称。
  3. 您在堆栈上创建了一个 particle,但之后您从未对其进行任何操作。它将在函数范围的末尾被删除。根据周围的一些代码,您似乎打算将粒子保存在某个地方 - 我建议使用 std::vector.
void runParticles()
{
  for (int i = 0; i < currentParticleCount; i++)
  {
    particle.i.currentPosition[0] = particle.i.currentPosition[0] + ((particle.i.velocity) * cos(particle.i.trajectory));

    particle.i.currentPosition[0] = particle.i.currentPosition[0] + ((particle.i.velocity) * sin(particle.i.trajectory));
  }
}
  1. particle.i 是无效语法。大概这意味着 运行 用于所有已知粒子,因此假设您的容器称为 particles,您将使用 particles[i] 访问容器中的单个粒子。
  2. 您连续更新 currentPosition[0] 两次 - 我猜其中一个应该是 currentPosition[1]。更好的是,您可以使用 xy 成员创建一个 position 结构,使其比 [0][1].
  3. 更清晰
  4. 一般来说,a = a + b可以缩短为a += b

其他:

  1. 如果您按照我上面的建议使用 std::vector<particle>,您甚至不需要 currentParticleCount - 它只会变成 particles.size()。此外,如果这样做,您可以使用更简单的“基于范围的 for 循环”语法,例如:
for (particle& p : particles) {
  p.currentPosition[0] = ...
}
  1. 几乎总是应该避免使用全局变量。相反,您应该将事物作为函数参数传递并从函数返回值。

这是一个 运行 的版本。它远不是一个合适的 C++ 版本,它不使用标准库或任何更新的 C++ 标准细节,但希望能告诉你哪里出错了:

#include <stdlib.h>
#include <time.h> 
#include <math.h>

using namespace std;

// Declare the struct
struct particle
{
 int velocity;
 int trajectory;
 int currentPosition[2]; // another struct such as struct point {int x; int y;} would be better here
 int mass;
};

const int PARTICLE_COUNT = 100; // A constant with the number of particles
const int MAX_SCREEN_HEIGHT = 1080;
const int MAX_SCREEN_WIDTH = 1920;

int random(int from, int to) {
    return rand() % (to - from) + from; 
}

// Gets a reference to the particle and initializes it
void initParticle(particle& currentParticle) {
    currentParticle.velocity = random(1, 10);
    currentParticle.trajectory = random(0, 360);
    currentParticle.currentPosition[0] = random(1, MAX_SCREEN_HEIGHT);
    currentParticle.currentPosition[1] = random(1, MAX_SCREEN_WIDTH);
    currentParticle.mass = random(1, 10);
}

// pass the array as reference
void runParticles(particle (&particles)[PARTICLE_COUNT]) {
    for (int i=0; i<PARTICLE_COUNT; ++i) {
        particles[i].currentPosition[0] = particles[i].currentPosition[0] + ((particles[i].velocity) * cos(particles[i].trajectory));
    }
}

// pass a pointer to the first element in the array
// it's good style to pass the size as well in this case
void otherRunParticles(particle* particles, int size) {
    for (int i=0; i<size; ++i) {
        particles[i].currentPosition[0] = particles[i].currentPosition[0] + ((particles[i].velocity) * cos(particles[i].trajectory));
    }
}

int main()
{
    srand(time(NULL));
    
    // declare an array of `struct particle` called `particles`
    particle particles[PARTICLE_COUNT];
    
    // initialize the array
    for (int i=0; i<PARTICLE_COUNT; ++i) {
        initParticle(particles[i]);
    }

    // Now you can do whatever you want with the particles
    runParticles(particles);
    
    otherRunParticles(particles, PARTICLE_COUNT);

    return 0;
}