Как заставить Eclipse C ++ parser работать с Emscripten

У меня есть несколько проблем с синтаксическим анализатором C ++ Eclipse. Я использовал его с Emscripten и обнаружил, что завершение кода, иерархия вызовов, всплывающее окно с документацией, анализ кода и связанные с этим функции очень полезны, но меня беспокоит, что анализатор работает не полностью. Особенно с этой новой проблемой с использованием векторов.


Первая ошибка синтаксического анализа включена std::vector<SDL_Rect> box; с ошибкой:

Символ «вектор» не может быть разрешен

А затем на emscripten_set_main_loop(game_loop, 60, 1); Я получаю эту ошибку:

Функция usleep не может быть решена

Вот полный код:

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <emscripten.h>
#include <stdarg.h>
#include <libcxx/vector>

///GLOBAL VARIABLES
SDL_Surface* bitmap;
SDL_Surface* screen;
SDL_Rect source;
SDL_Rect destination;

///second sprite
SDL_Surface* bitmap2;
SDL_Rect source2;
SDL_Rect destination2;

/// Side Scrolling variables:
SDL_Rect camera;
SDL_Rect offset;
SDL_Rect offset2;

int level_width = 480 * 5;
int level_height = 640;

bool gameRunning = true;

class buttonpresses {
public:
bool leftButton;
bool rightButton;
bool jumpButton;

};

int movementspeed = 5;
int jumpspeed = 2;
bool jumpenabled = false;
int jumpduration = 0;
int maxjump = 20;

int leftmomentum = 1;
int rightmomentum = 1;

int lastdestination;
int countDestination = 0;

int maxmomentum = 5;

buttonpresses charactermovement;

/// Collision detection
std::vector<SDL_Rect> box;

///MAIN LOOP
void game_loop() {
// EVENT HANDLING
SDL_PumpEvents();
Uint8 *keystate = SDL_GetKeyboardState(NULL);

if (keystate[SDLK_ESCAPE]) {
gameRunning = false;
printf("Game Stopping!!!!!!\n");
SDL_Quit();
exit(0);
}

if (keystate[SDLK_LEFT]) {
//     printf("Left Key\n");
charactermovement.leftButton = true;
}
if (keystate[SDLK_LEFT] == false) {
charactermovement.leftButton = false;
}
if (keystate[SDLK_RIGHT]) {
//     printf("Right Key\n");
charactermovement.rightButton = true;
}
if (keystate[SDLK_RIGHT] == false) {
charactermovement.rightButton = false;
}
if (keystate[SDLK_SPACE]) {
//     printf("Space Key\n");
charactermovement.jumpButton = true;
}
if (keystate[SDLK_SPACE] == false) {
charactermovement.jumpButton = false;
}

//        printf("Game Running..\n");

// LOGIC

//character movement
if (charactermovement.rightButton) {
destination.x = destination.x + movementspeed;
}
if (charactermovement.leftButton) {
destination.x = destination.x - movementspeed;
}
if (charactermovement.jumpButton && jumpenabled) {
destination.y = destination.y - jumpspeed;
jumpduration++;
}
destination.x = destination.x + rightmomentum - leftmomentum;

if (destination.y >= 200) {
jumpenabled = true;

//  printf ("jump enabled\n");
}
if (jumpduration >= maxjump) {
jumpenabled = false;
}
if (destination.y >= 200) {
//  printf ("destination y:");
//  printf ("%d\n", destination.y);

jumpduration = 0;
}
//if (jumpenabled != true){
//  printf ("jump disabled\n");
//}
//if (jumpenabled == true){
//  printf ("jump enabled\n");
//  printf ("jump duration: ");
//  printf ("%d\n", jumpduration);
//}

//momentum
//save position every 5 interations
if (countDestination > 5) {
lastdestination = destination.x;
countDestination = 0;
} else {
countDestination++;
}

//printf ("last location: ");
//printf ("%d\n", destination.x);
//
//printf ("current location: ");
//printf ("%d\n", lastdestination);

// increase momentum in direction your moving in (relative to previous location)
if (lastdestination > destination.x) {
//  printf ("right if running \n ");
if (rightmomentum > 0) {
rightmomentum--;
} else if (leftmomentum < maxmomentum) {
leftmomentum++;
}
}
if (lastdestination < destination.x) {
//  printf ("left if running \n ");
if (leftmomentum > 0) {
leftmomentum--;
} else if (rightmomentum < maxmomentum) {
rightmomentum++;
}
}
if (lastdestination == destination.x) {
if (leftmomentum > 0) {
leftmomentum--;
}
if (rightmomentum > 0) {
rightmomentum--;
}
}

printf("left momentum: ");
printf("%d\n", rightmomentum);
printf("right momentum: ");
printf("%d\n", leftmomentum);

//gravity
if (destination.y <= 200) {
destination.y++;
}
offset.x = destination.x - camera.x;
offset2.x = destination2.x - camera.x;
offset.y = destination.y - camera.y;
offset2.y = destination2.y - camera.y;

// RENDERING
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
SDL_BlitSurface(bitmap, &source, screen, &offset);

// RENDER SECOND SPRITE
SDL_BlitSurface(bitmap2, &source2, screen, &offset2);

//blank screen
SDL_Flip(screen);
camera.x++;
}

int main() {
SDL_Init( SDL_INIT_VIDEO);

// LOAD FILES
bitmap = IMG_Load("ninjagaiden3sheet1.png");
screen = SDL_SetVideoMode(640, 480, 0, SDL_HWSURFACE | SDL_DOUBLEBUF);
/// camera variables
camera.x = 0;
camera.y = 0;
camera.w = 640;
camera.h = 480;
/// end camera variables

// Part of the bitmap that we want to draw

source.x = 37;
source.y = 4;
source.w = 17;
source.h = 32;

// Part of the screen we want to draw the sprite to

destination.x = 100;
destination.y = 100;
destination.w = 65;
destination.h = 44;

//// second sprite
bitmap2 = IMG_Load("bat_transparent.png");
source2.x = 24;
source2.y = 63;
source2.w = 65;
source2.h = 44;

destination2.x = 940;
destination2.y = 100;
destination2.w = 65;
destination2.h = 44;
//// end second sprite

lastdestination = destination.x;

offset = destination;
offset2 = destination2;

charactermovement.leftButton = false;
charactermovement.rightButton = false;
charactermovement.jumpButton = false;

//START MAIN LOOP
emscripten_set_main_loop(game_loop, 60, 1);

return 0;
}

Моя вкладка включений для C ++ в свойствах «Пути и символы» выглядит следующим образом:

C:\Program Files\Emscripten\emscripten\1.12.0\system\include
C:\Program Files\Emscripten\emscripten\1.12.0\system\include\libc
C:\Program Files\Emscripten\emscripten\1.12.0\system\include\emscripten
C:\Program Files\Emscripten\emscripten\1.12.0\system\include\libcxx

В настройках индексатора у меня включено следующее:

  • Индексировать исходные файлы, не включенные в сборку
  • Индекс неиспользуемых заголовков
  • Индексировать все варианты заголовков
  • Индекс исходных и заголовочных файлов, открытых в редакторе
  • Разрешить эвристическое разрешение включает
  • Пропустить файлы размером более: 8 МБ

Кто-нибудь знает, что происходит? Или что я могу сделать, чтобы это исправить?

Обновить:

Я исправил ошибку при разборе std::vector, Оказывается, что некоторые из библиотек llvm / clang используют _LIBCPP_BEGIN_NAMESPACE_STD а также _LIBCPP_END_NAMESPACE_STD определения вместо using namespace std; и эти определения невидимы для анализатора, если __clang__ определено.

Поэтому решение состоит в том, чтобы перейти на вкладку «Символы» для C ++ в свойствах «Пути и символы» и добавить:

__clang__

В появившемся диалоговом окне «Добавить» просто поместите его в Name: введите поле и нажмите ОК. Это также добавит многие из отсутствующих функций пространства имен std, таких как cout cin и т. Д.

Я еще не нашел исправления для проблемы usleep / emscripten_set_main_loop, но этого должно быть достаточно, чтобы заставить работать код завершения IDE и несколько связанных функций. Хотя у меня все еще есть некоторые странные сложные проблемы с синтаксическим анализатором в Eclipse, поэтому я думаю, что я собираюсь отказаться от поиска решения здесь и работать с NetBeans, для которого Я думаю, что я все настроил.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]