c++(看似)随机编译错误

C++ (seemingly) Random Compiler Errors

本文关键字:编译 错误 随机 看似 c++      更新时间:2023-10-16

我一直在摆弄C、c++和Allegro,这多亏了我在乐施会书店找到的一本小书和一本大书。我现在理解得很好,但是我遇到了瓶颈……每当我编译,我得到这些错误:

archiboldian@archiboldian:~/Documents/C++ Projects/particles$ g++ particles.c -lalleg -lnoise -o particles
particles.c:19: error: array bound is not an integer constant before ‘]’ token
particles.c:20: error: ‘Vector2D’ does not name a type
particles.c:21: error: ‘Vector2D’ does not name a type
particles.c: In function ‘int main()’:
particles.c:26: error: ‘nPos’ was not declared in this scope
particles.c:28: error: ‘nVel’ was not declared in this scope
particles.c:29: error: ‘nvel’ was not declared in this scope
particles.c:31: error: ‘addParticle’ was not declared in this scope
particles.c: At global scope:
particles.c:47: error: ‘Vector2D’ has not been declared
particles.c:47: error: ‘Color’ has not been declared
particles.c: In function ‘void addParticle(int, int, Vector2d, int, int, int)’:
particles.c:50: error: ‘particles’ was not declared in this scope

这是我的代码…

#include "allegro.h"
struct Vector2d{
    double x;
    double y;
};
struct Particle {
    Vector2d Pos;
    Vector2d Vel;
    int age;
    int LifeSpan;
    int colour;
    int size;
};
int max = 50;
int pcount = 0;
Particle particles[max];
int main(void) {
    Vector2D nPos;
    Vector2D nVel;
    nPos.x = 320;
    nPos.y = 240;
    nVel.x = 2;
    nvel.y = 0;
    addParticle(10, nPos, nVel, 20, makecol(255,255,255), 2);
    allegro_init();
    install_keyboard();
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
    while(!key[KEY_ESC]) {
        for(int i=0;i<pcount;i++){
        }
    }
    allegro_exit();
}
void addParticle(int addp, Vector2D Pos, Vector2d Vel, int LifeSpan, Color colour, int size) {
    for(int i=0;i<addp;i++){
        pcount++;
        particles[pcount].Pos = Pos;
        particles[pcount].Vel = Vel;
        particles[pcount].LifeSpan = LifeSpan;
        particles[pcount].colour = colour;
        particles[pcount].size = size;
    }
}
END_OF_MAIN();

从我从调试输出中收集到的第一个错误是关于'Particle particles[max];'行,信息听起来好像在'particles'的末尾有这个'[max]'是错误的,但直到现在,它工作得很好,编译没有问题。这可能只是一个打字错误或误解或其他什么,但我真的想不出来。

正如你所看到的,这是一个粒子系统的尝试和任何关于更好的提示(这是一个词吗?)我的代码非常感谢:)

谢谢。

对于能够用作数组大小的变量,它需要是一个常量表达式。这在c++中用const表示。在C语言中,您将使用#define

// C++
const int MAX = 50;
/* C */
#define MAX 50
/* both C & C++ */
enum { MAX = 50 };
Particle particles[MAX];

错误解释问题:

particles.c:19: error: array bound is not an integer constant before ‘]’ token

解决办法:

const int max = 50;

现在数组的边界是一个整型常量

VLA在标准c++中是不允许的

使用

:

const int max = 50;

因为数组大小必须是一个常量表达式。没有const关键字,max不是常量表达式

更改为const int max = 50;,这是一个编译时常数,因此它可以用于初始化数组。(注意并非所有 const变量都是编译时间常量)

另外,将文件重命名为*.cpp,以便GCC能够理解c++结构。它似乎被编译成直接的C语言代码。
Joachim Pileborg观察到你有Vector2dVector2D

我怀疑这段代码编译不了。

  • Vector2D不是正确的类型。struct Vector2D。(因此产生了许多错误)。您可以使用typedef struct Vector2D Vector2D来获得预期的行为。不确定Vector2d(小写d)发生了什么。
  • 不能动态定义全局表变量的空间。如果你做particles[50],它将工作。如果您使用#define max 50enum { max = 50 };,它也可以工作。在这种情况下,enum变体可能是最好的选择。否则,您可以选择使用malloc()动态分配粒子空间-您必须在main()中这样做。这里的问题是int max = 0;不是常量。如果你使用的是C语言,定义const是没有帮助的,因为它意味着只读而不是常量。