![](/img/trans.png)
[英]C++ LinkedList Queue Implementation and Destructor Error:“Aborted (Core Dumped)”
[英]C++ SFML Game - Aborted (core dumped)
我正在嘗試“ Beginning C ++ Game Programming”中的代碼,當我嘗試運行該程序時,我收到“ Aborted(核心已轉儲)”。 我懷疑問題出在指針上,但我不知道該如何處理。 我不會在這里發布所有代碼,因為它真的很長,因此如果缺少某些內容,我會添加其余的代碼。 這是我的代碼:
LevelManager.cpp
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include "textureholder.h"
#include <sstream>
#include <fstream>
#include "levelmanager.h"
using namespace sf;
using namespace std;
int** LevelManager::nextLevel(VertexArray& rVaLevel){
m_LevelSize.x = 0;
m_LevelSize.y = 0;
// Get the next level
m_CurrentLevel++;
if (m_CurrentLevel > NUM_LEVELS){
m_CurrentLevel = 1;
}
// Load the appropriate level from a text file
string levelToLoad;
switch (m_CurrentLevel){
case 1:
levelToLoad = "levels/level1.txt";
m_StartPosition.x = 100;
m_StartPosition.y = 100;
break;
case 2:
levelToLoad = "levels/level2.txt";
m_StartPosition.x = 100;
m_StartPosition.y = 3600;
break;
case 3:
levelToLoad = "levels/level3.txt";
m_StartPosition.x = 1250;
m_StartPosition.y = 0;
break;
case 4:
levelToLoad = "levels/level4.txt";
m_StartPosition.x = 50;
m_StartPosition.y = 200;
break;
}
ifstream inputFile(levelToLoad);
string s;
while(getline(inputFile, s)){
++m_LevelSize.y;
}
m_LevelSize.x = s.length();
inputFile.clear();
inputFile.seekg(0, ios::beg);
int** arrayLevel = new int*[m_LevelSize.y];
for (int i =0; i < m_LevelSize.y; ++i){
arrayLevel[i] = new int[m_LevelSize.x];
}
string row;
int y =0;
while (inputFile >> row){
for (int x = 0; x < row.length(); x++){
const char val = row[x];
arrayLevel[y][x] = atoi(&val);
}
y++;
}
inputFile.close();
// What type of primitive are we using?
rVaLevel.setPrimitiveType(Quads);
// Set the size of the vertex array
rVaLevel.resize(m_LevelSize.x * m_LevelSize.y * VERTS_IN_QUAD);
// Start at the beginning of the vertex array
int currentVertex = 0;
for (int x = 0; x < m_LevelSize.x; x++){
for (int y = 0; y < m_LevelSize.y; y++){
// Position each vertex in the current quad
rVaLevel[currentVertex + 0].position =Vector2f(x * TILE_SIZE, y * TILE_SIZE);
rVaLevel[currentVertex + 1].position = Vector2f((x * TILE_SIZE) + TILE_SIZE , y * TILE_SIZE);
rVaLevel[currentVertex + 2].position = Vector2f((x * TILE_SIZE) + TILE_SIZE , (y * TILE_SIZE) + TILE_SIZE);
rVaLevel[currentVertex + 3].position =Vector2f((x * TILE_SIZE),(y * TILE_SIZE) + TILE_SIZE);
// Which tile from the sprite sheet should we use
int verticalOffset = arrayLevel[y][x] * TILE_SIZE;
rVaLevel[currentVertex + 0].texCoords = Vector2f(0, 0 + verticalOffset);
rVaLevel[currentVertex + 1].texCoords = Vector2f(TILE_SIZE, 0 + verticalOffset);
rVaLevel[currentVertex + 2].texCoords = Vector2f(TILE_SIZE, TILE_SIZE + verticalOffset);
rVaLevel[currentVertex + 3].texCoords = Vector2f(0, TILE_SIZE + verticalOffset);
// Position ready for the next four vertices
currentVertex = currentVertex + VERTS_IN_QUAD;
}
}
return arrayLevel;
} // End of nextLevel function
Vector2i LevelManager::getLevelSize(){
return m_LevelSize;
}
int LevelManager::getCurrentLevel(){
return m_CurrentLevel;
}
Vector2f LevelManager::getStartPosition(){
return m_StartPosition;
}
級別管理器
#pragma once
#include <SFML/Graphics.hpp>
using namespace sf;
using namespace std;
class LevelManager{
private:
Vector2i m_LevelSize;
Vector2f m_StartPosition;
int m_CurrentLevel = 0;
const int NUM_LEVELS = 4;
public:
const int TILE_SIZE = 50;
const int VERTS_IN_QUAD = 4;
Vector2f getStartPosition();
int** nextLevel (VertexArray& rVaLevel);
Vector2i getLevelSize();
int getCurrentLevel();
};
LoadLevel.cpp
#include "engine.h"
void Engine::loadLevel(){
m_Playing = false;
// Delete the previously allocated memory
for (int i = 0; i < m_LM.getLevelSize().y; ++i){
delete[] m_ArrayLevel[i];
}
delete[] m_ArrayLevel;
// Load the next 2d array with the map for the level
// And repopulate the vertex array as well
m_ArrayLevel = m_LM.nextLevel(m_VALevel);
// Spawn Gracza
m_Player.spawn(m_LM.getStartPosition(), GRAVITY);
// Make sure this code isn't run again
m_NewLevelRequired = false;
}
我在Geany中使用以下代碼進行編譯:
g++ -std=c++11 -c -g main.cpp levelmanager.cpp engine.cpp playercharacter.cpp player.cpp input.cpp textureholder.cpp update.cpp loadlevel.cpp detectcollisions.cpp draw.cpp
g++ -std=c++11 main.o levelmanager.o playercharacter.o player.o input.o draw.o engine.o loadlevel.o detectcollisions.o textureholder.o update.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system
之后,我通過“ ./sfml-app”運行它。 我嘗試運行gdb,但它只是引發了更多問題: 運行gdb ./sfml-app后的終端
很抱歉,如果不清楚(我的英語不好)。 感謝您的時間和幫助。
像以前一樣使用gdb
,但是在main()
處設置一個斷點,然后逐步完成程序。
現在,我懷疑程序會由於嘗試刪除以前從未設置的級別而失敗(嘗試在Engine::loadLevel()
而不是main()
上設置一個斷點)。
@馬里奧
好的,所以我在gdb打開的同時嘗試了loadLevel的新功能,這就是它返回有關過時sfml-app的信息的原因。 我終於將代碼更改為此:
void Engine::loadLevel(){
m_Playing = false;
// Delete the previously allocated memory
if (m_NewLevelRequired){
for (int i = 0; i < m_LM.getLevelSize().y; ++i){
delete &m_ArrayLevel[i];
}
delete[] m_ArrayLevel;
}
如您所見,當最后一個級別完成時,我才嘗試添加“ if”來刪除之前的級別。 我試圖更改刪除的公式,但總的來說並沒有太大幫助。 可以肯定的是,我再次運行了gdb: http : //i67.tinypic.com/1118kuc.png
內存的分配在LevelManager.cpp中:
int** arrayLevel = new int*[m_LevelSize.y];
for (int i =0; i < m_LevelSize.y; ++i){
arrayLevel[i] = new int[m_LevelSize.x];
}
很抱歉在這里發布,但是評論太久了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.