Page 1 of 5

problēma

Posted: 14 Feb 2012, 23:52
by kristapuciitis
Sveiki!
Man ir problēma- gandrīz vai katrā tutoriālī rāda, ka failu vajag atvērt ar ifstream fin(fileName); . Es daru tieši tā pat, bet man notiek kļūda- viss nokompilējas bez error, bet pati spēle nepalaižas. =( Ja aizkomentē visu to funkciju, kura nolasa datus no faila, tad errora nav, bet ja atkomentē tieši ifstream file(fileName); , tad notiek kļūda, ka spēle nepalaižas. Kur var būt problēma? Tā funkcija atrodas Level.cpp failā.

Re: problēma

Posted: 15 Feb 2012, 00:12
by bubu
A debugeris ko saka?
C stila stringus btw labāk ir padot kā const char* tipu, nevis char*

Re: problēma

Posted: 15 Feb 2012, 13:12
by atis
Nokompilēju, palaidu, viss strādā. Vienīgā lieta: tu nepārbaudi, vai fails vispār ir atvēries. Jo, ja fails neatveras, tad viņš ieiet mūžīgā ciklā. Šitais nosacījums

Code: Select all

while (!file.eof())
vienmēr ir patiess. Drošvien faila nosaukumā vai ceļā ir kļūda tavā gadījumā.

Re: problēma

Posted: 15 Feb 2012, 13:55
by kristapuciitis
Tad sanāk, ka, ja es c++ lieku atvērt failu, ja tāda faila nav, tad kods ieciklosies arī tad, ja funkcija nav nereizes izsaukta?

Re: problēma

Posted: 15 Feb 2012, 14:58
by Tenjou
Kā, Tev, jau teica, prims lieto ir jāparbauda vai fails eksistē. Vienkāršakais kā to darīt:

Code: Select all

if(file.is_open() == false) {
  // fails nav atvērts kāda iemesla pēc
}

Re: problēma

Posted: 15 Feb 2012, 15:06
by atis
kristapuciitis wrote:Tad sanāk, ka, ja es c++ lieku atvērt failu, ja tāda faila nav, tad kods ieciklosies arī tad, ja funkcija nav nereizes izsaukta?
Nē, tā tas nebūs.
Tavā dotajā kodā funkcija Level::Load() netika izsaukta un viss strādāja.

Tad es iekš main() pieliku:

Code: Select all

Level *lvl = new Level();
lvl->Load("kaut_kads_fails");
Un tad arī viss bija OK, izņemot gadījumu, ja tāds fails neeksistēja -- tad proga uzkārās.

Re: problēma

Posted: 15 Feb 2012, 16:59
by kristapuciitis
Man nestrādā pat, ja funkcija netiek izsaukta. Ja pat tajā funkcijā paliek tikai

Code: Select all

	 ifstream file(fileName);
	 if (!file.is_open())
		 return;
Vienalga nokarās.

Re: problēma

Posted: 15 Feb 2012, 18:39
by kristapuciitis
Tenjou wrote:Kā, Tev, jau teica, prims lieto ir jāparbauda vai fails eksistē. Vienkāršakais kā to darīt:

Code: Select all

if(file.is_open() == false) {
  // fails nav atvērts kāda iemesla pēc
}
emm, tā funkcija nemaz netiek izsauka un faila nosaukums netika norādīts, bet programma vienalga nokarās tieši tā ifstream file(fileName). =(

Re: problēma

Posted: 15 Feb 2012, 19:14
by atis
No tava skrīnšota redzams, ka nokrašo SDL blitošanas funkcijā.

Tad nu ielūrēsim šeit:

Code: Select all

void Sprite::Draw(SDL_Surface* destination, int x, int y)
{
        SDL_Rect pos;
        pos.x = x;
        pos.y = y;
        SDL_BlitSurface(_surface, NULL, destination, &pos);
};
Izskatās, ka SDL_Rect struktūrai tu atstāj neinicializētus mainīgos w un h. Attiecīgi viņš paķer to, kas atradās pirms brīža uz steka.. Pieļauju, ka, ja tas ir kaut kas galīgi garām, tad SDL_BlitSurface() varētu arī nokrašot. Vismaz tas izskaidrotu, kāpēc kaut kāda automātiskā variabļa eksistence/neeksistence (ifstream file) var izmainīt uzvedību.

Re: problēma

Posted: 15 Feb 2012, 19:29
by kristapuciitis
Tas neko nedod, saliku w un h pa nullēm, vienalga nokarās. Sataisīju jaunu projektu:

Code: Select all

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Level
{
public:
	void Load(const char* fileName);
};

void Level::Load(const char* fileName)
{
	 std::ifstream file(fileName);
	 string buffer;
	 int iLine = 0;
	 while (!file.eof())
	 {
		 getline(file, buffer);
	 }
};

void main()
{
	Level level;
	level.Load("file");
}
At least šī palaižas. Kaut kāds tāds brīnums ar C++ man nebija noticis :/