2014-05-21 6 views
1

나는 타일 맵을 만들기위한 YouTube 튜토리얼을 따라 왔습니다.txt 파일을 읽을 때 내 프로그램이 다음 줄로 이동하지 않습니다.

내 코드는 동일한 IDE를 사용하는 자습서와 동일합니다. 프로그램이 텍스트 파일에서 읽는

그러나 그 줄의 끝을 인식하지 나타납니다 : 나는지도 배열 내 텍스트 파일 너무 작은 것을 할 수 있다고 생각

#include<SFML/Graphics.hpp> 
#include<iostream> 
#include<fstream> 
#include<cctype> 
#include<string> 

using namespace std; 

int main() 
{ 
ifstream openfile("map1.txt"); 

sf::Texture tileTexture; 
sf::Sprite tiles; 

sf::Vector2i map[500][200]; 
sf::Vector2i loadCounter = sf::Vector2i(0, 0); 

if(openfile.is_open()) 
{ 
    string tileLocation; 
    openfile >> tileLocation; 
    tileTexture.loadFromFile(tileLocation); 
    tiles.setTexture(tileTexture); 
    while(!openfile.eof()) 
    { 
     string str; 
     openfile >> str; 
     char x = str[0], y = str[2]; 
     if(!isdigit(x) || !isdigit(y)) 
      map[loadCounter.x][loadCounter.y] = sf::Vector2i(-1, -1); 
     else 
      map[loadCounter.x][loadCounter.y] = sf::Vector2i(x - '0', y - '0'); 

     if(openfile.peek() == '\n') 
     { 
      loadCounter.x = 0; 
      loadCounter.y++; 
     } 
     else 
      loadCounter.x++; 
    } 
    loadCounter.y++; 
} 

를 그래서 나는 그것을 증가 동일한 오류 또는 스택 오버플로 오류가 발생했습니다. 나는 그것이 loadCounter.x 증가 프로그램을 스테핑에서 그것을 볼 수 있지만 결코 여기 loadcounter.y

를 증가하지 내 TEXTFILE의로

는 단어가 여기에 포장하면 미안 당신이 더 나은 표현을해야합니다 그래서 만약 미리보기가 줄 바꿈을 보여주고있다 (문제가 txt 파일은 저에게 할 수있는 일을 알려주세요).

여기에 간단한 설명을하기 위해 파일에는로드 할 이미지의 이름과 40X25 세트의 배열에있는 "좌표"세트가 들어 있습니다. 구축 할 때

x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
0,1 0,1 0,1 0,1 0,1 0,1 0,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
0,1 0,1 0,1 0,1 0,1 0,1 0,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
0,1 0,1 0,1 0,1 0,1 0,1 0,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
0,1 0,1 0,1 0,1 0,1 0,1 0,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
0,1 0,1 0,1 0,1 0,1 0,1 0,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
0,1 0,1 0,1 0,1 0,1 0,1 0,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,1 1,1 1,1 1,1 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 

Tileset.jpg 난이 오류가 발생합니다.

Angels Last Crusade.exe에서 0x0006A30D의 첫 번째 예외 : 0xC0000005 : 0x0022003C 위치 쓰기 액세스 위반. Angels에서 0x0006A30D의 처리되지 않은 예외 마지막 Crusade.exe : 0xC0000005 : 0x0022003C 위치 쓰기 액세스 위반.

텍스트 파일이 너무 커서지도 배열이 많이 필요하다는 두 가지 질문이 있습니다. 또는 내 텍스트 파일에 오류가있어서 코드가 새 줄을 놓치거나 새 줄의 잘못된 식별자를 찾는 코드가 있습니까?

답변

4

두 가지 즉시 알 수 있습니다

sf::Vector2i map[500][200]; 

main()의 자동 변수 공간에서 천 한 백명에sf:: Vector2i 객체를 선언합니다. 플랫폼의 로컬 스택 공간 구성에 따라 문제가 될 수 있습니다. 예를 들어 스택 공간을 1MB로 사용하려면 객체 당 약 11 바이트 정도만 필요합니다. 힙에 넣거나 배열에 정적 링크를 제공하는 것이 좋습니다 (예 : 전역 변수 또는 static으로 선언 된). 힙에 넣어하려면이처럼 std::vector<>std::array<>의 사용

#include <vector> 
#include <array> 

int main() 
{ 
    std::vector<std::array<sf::Vector2i,200>> map(500); 
    .... 

은 솔직히 쉽게 std::map<>로/동일시되는 모든 현대적인 C++ 프로그램에서 map로, BTW, 다른 이름을 선택합니다. 나는 너에게 맡긴다.

while(!openfile.eof()) 

이것은 잘못 S :

하지만 난 당신이 이전 항목을 처리하더라도 실제 범인을 생각이있다. Read this to better understand why.루프 내에서 입 출력 결과를 확인하지 않으면 마지막으로 문자열 추출이 이되지 않으므로이 실패하므로 빈 문자열이 남게됩니다.이 문자열은 보호되지 않은 operator[]을 사용하여 액세스합니다. 특히,이 : 당신이 정말로 줄에 제대로이 작업을 수행하려면

// after last successful string has been read, eof-bit is still not set... 
while(!openfile.eof()) 
{ 
    string str; 
    openfile >> str; // ... until this fails (which it will) 
    char x = str[0], y = str[2]; // this this, invokes undefined behavior 

당신이 당신의 경계를 뛰어 넘다하지 않도록하기 위해, 이런 일이 가능성이 선호 될 것이다 :

std::ifstream openfile("map1.txt"); 
if (!openfile.is_open()) 
    return EXIT_FAILURE; 

sf::Texture tileTexture; 
sf::Sprite tiles; 

// TODO: this should be checked as well 
openfile >> tileLocation; 
tileTexture.loadFromFile(tileLocation); 
tiles.setTexture(tileTexture); 

// our tile map. 
std::vector<std::vector<sf::Vector2i>> mymap; 

std::string line; 
while (std::getline(openfile,line)) 
{ 
    std::vector<sf::Vector2i> row; 
    std::istringstream iss(line) 
    std::string str; 

    while (iss >> str && str.length() >=3) 
    { 
     char x = str[0], y = str[2]; 
     if(!isdigit(x) || !isdigit(y)) 
      row.push_back(sf::Vector2i(-1, -1)); 
     else 
      row.push_back(sf::Vector2i(x - '0', y - '0')); 
    } 

    if (!row.empty()) 
     mymap.emplace_back(row); 
} 

이는 일이있다 가변 행 너비에 대한 잠재적 인 단점 (코드에서 코드를 처리하는 방법에 따라 다를 수 있음) 읽어 행의 수는 간단하다 :

mymap.size() 

및 특정 행의 쌍의 수는 다음과 같습니다 어쨌든

mymap[rownum].size() 

, 나는 당신이 그것에서 무언가를 얻을 수 있기를 바랍니다. 행운을 빌어 요.

+0

thanX @WhozCraig, 화면에 그릴 무언가를 얻을 수 있지만 오류가있는 쌍보다 많은 행을 가진지도를 그리는 방법을 찾지 못했습니다. 디버그 어설 션이 실패했습니다. ... 식 : 벡터 첨자 중 range .... 그러나 쌍이 행보다 많으면 잘 컴파일됩니다. – FPSHero

+0

@ user3659128이 정보는지도 파일의 경계 내에 머물러 있도록하는 부분입니다. 특정 행에 대해 게시 한 코드 (하단)에는 입력 파일에서 특정 개수의 쌍이 있습니다. 매핑하려는 이미지가 일치하지 않으면 쌍이 부족한 경우 대체 작업을 수행해야합니다. 솔직히, 나는 당신의 비디오 작업에 대해 잭을 모른다. 그러나 나는 표준 lib를 안다. 그래서 왜 read-alternative가 그렇게 직접적 이었는가? – WhozCraig

+0

나는 당신이 나를 잃어 버렸다고 생각합니다. 오류는 코드가 아닌 입력 파일을 편집하여 발생합니다. 텍스트는 쌍 (즉, x, x -> 1,1)을 변경하여 이미지 일 뿐이므로 타일 세트에서 섹션을 잘라내어 화면에 인쇄합니다. 난 당신의 코드가 쌍의 집합보다 많은 행을 처리하도록하는 방법을 놓치고있다. 그것은 행만큼 많은 쌍으로 잘 작동합니다. 불행하게도 이것은 대부분의 모니터와 반대되는 너비보다 큰 이미지를 출력합니다 – FPSHero