C++ (казалось бы) случайные ошибки компилятора
Я играл с C, C++ и Allegro благодаря маленькой книге и большой книге, которую я нашел в книжном магазине Oxfam. Я хорошо понимаю это в данный момент, но я столкнулся со стеной... Всякий раз, когда я компилирую, я получаю эти ошибки:
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();
Исходя из того, что я понял из результатов отладки, первая ошибка говорит о проблеме с "Частицами частиц [max];" строка и сообщение звучат так, как будто неправильно указывать этот "[max]" в конце "частиц", но до сих пор он работал нормально и компилировался без проблем. Вероятно, это просто опечатка или недоразумение или что-то еще, но я действительно не могу понять это.
Как вы можете видеть, это попытка создать систему частиц и любые намеки на улучшение (это слово?) Мой код очень ценится:)
Благодарю.
5 ответов
Чтобы переменная могла использоваться в качестве размера массива, она должна быть выражением константы. Это обозначено const
в C++. В 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
не является постоянным выражением.
Я сомневаюсь, что этот код когда-либо скомпилируется.
Vector2D
не правильный типstruct Vector2D
является. (Многие ошибки возникают из-за этого). Ты можешь использоватьtypedef struct Vector2D Vector2D
чтобы получить ожидаемое поведение. Не уверен, что там происходит сVector2d
(в нижнем регистреd
).- Вы не можете динамически определить пространство глобальной табличной переменной. Если вы делаете
particles[50]
это будет работать. Это также будет работать, если вы#define max 50
или жеenum { max = 50 };
, Где, для таких целей, вариант enum, вероятно, ваш лучший выбор. В противном случае вы можете выбрать динамическое распределение пространства для частиц, используяmalloc()
- вам придется сделать это вmain()
, Проблема здесь в том, чтоint max = 0;
не является постоянным Определяя этоconst
не поможет, если вы используете C, так как это означает только чтение, а не константу.
Изменить на const int max = 50;
которая является постоянной времени компиляции, поэтому ее можно использовать для инициализации массива. (Обратите внимание, что не все const
переменные являются константами времени компиляции)
Кроме того, переименуйте файл в *.cpp
, так что GCC будет понимать конструкции C++. Кажется, компилируется прямо C
код языка.
Йоахим Пилеборг заметил, что у вас есть оба Vector2d
а также Vector2D
,