C ++ (казалось бы) случайные ошибки компилятора - PullRequest
0 голосов
/ 16 ноября 2011

Я играл с 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 ]

7 голосов
/ 16 ноября 2011

Чтобы переменная могла использоваться в качестве размера массива, она должна быть константным выражением.Это обозначено const в C ++.В C вы бы использовали #define.

// C++
const int MAX = 50;
/* C */
#define MAX 50
/* both C & C++ */
enum { MAX = 50 };
Particle particles[MAX];
2 голосов
/ 16 ноября 2011

Ошибка объясняет проблему:

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

Исправление:

const int max = 50;

Теперь граница массива является целочисленной константой.

1 голос
/ 16 ноября 2011

VLA не допускается в стандарте C ++.

Используйте это:

const int max = 50;

Поскольку размер массива должен быть постоянным выражением.Без ключевого слова const, max не является константным выражением.

0 голосов
/ 16 ноября 2011

Я сомневаюсь, что этот код когда-либо скомпилируется.

  • 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, так как оно означает только чтение, а не константу.
0 голосов
/ 16 ноября 2011

Измените значение на const int max = 50;, которое является постоянной времени компиляции, поэтому ее можно использовать для инициализации массива.(Обратите внимание, что не все const переменные являются константами времени компиляции)

Кроме того, переименуйте файл в *.cpp, чтобы GCC понимал конструкции C ++.Кажется, он компилируется как прямой C код языка.
Йоахим Пилеборг заметил, что у вас есть и Vector2d, и Vector2D.

...