Forum: C++ probs

Forum huvudsida -> Programmering -> C++ probs

Sidor: 1

Till botten

Gazrog2 21:09 - 20:e Maj 2006 | Post #1
Medlem
Inlägg: 71


Skicka PM
Tja fan!
Jag har ett litet problem här. För första gången i hela mitt liv hade jag tänkt börja programmera något kul litet spel som jag faktist hade planerat att slutföra! Men som vanligt dyker det upp problem i starten som gör att jag alltid ger upp, här kommer de tre filerna jag använder:

Starring Main.cc:

#include <iostream>
#include "Functions.cc"
using namespace std;




int main()
{
    cout << "It's working Smiley";
    return 0;
}

###########################    
Functions.cc:
#include <iostream>
using namespace std;

#define MAPSIZE 1250
int map[MAPSIZE];
int LoadMap(string filename)
{
    ifstream data_file(filename );
    for(int i = 0; i < MAPSIZE ; i++)
    data_file >> map[i];
    
    return map;
}
###################
map1.txt:

00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000##################################00000000000
00000#00000000000000000000000000000000#00000000000
00000#00000000000000000000000000000000#00000000000
00000#00000000077700000007770000000000#00000000000
00000#00000000077700000007770000000000#00000000000
00000#00000000000000000000000000000000#00000000000
00000#00000000000000000000000000000000#00000000000
######00000000000000000000000000000000############
00000000000000000000000000000000000000000000000000
######00000000000000000000000000000000000000000000
00000#00000000000000000000000000000000############
00000#00000000000000000000000000000000#00000000000
00000#00000000000000000000000000000000#00000000000
00000#00000000000000000000000000000000#00000000000
00000#00000000000000000000000000000000#00000000000
00000#00000000000000000000000000000000#00000000000
00000#################################00000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000

Den blev visst lite osymetrisk nu när jag kopiera in den, den ska egentligen va fyrkantig typ, men jajja. Här kommer felmeddelandena i alla fulla fall:

Functions.cc: In function EUR~int LoadMap(std::string)EUR(TM):
Functions.cc:8: error: variable EUR~std::ifstream data_fileEUR(TM) has initializer but incomplete type
Functions.cc:12: error: invalid conversion from EUR~int*EUR(TM) to EUR~intEUR(TM)


Men nu börjar melodifestivalen. Tja fan!


-------------------------
Ingen signatur!

Senast redigerad 21:36 - 20:e Maj 2006


Nissebosselasse 22:21 - 20:e Maj 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Konstruktorn till de flesta klasser i STL tar oftast en char * istället för en std::string, så ändra raden till ifstream data_file (filename.c_str());.

Du ska även inkludera string i functions.cc. Använd aldrig klasser/funktioner utan att inkludera deras rätta headerfiler!

-------------------------
http://pushingcows.se
Gula Nallen



Gazrog2 19:22 - 21:a Maj 2006 | Post #3
Medlem
Inlägg: 71


Skicka PM
Jag gjorde den ändringen men jag får fortfarande meddelandet :
Functions.cc: In function EUR~int LoadMap(std::string)EUR(TM):
Functions.cc:9: error: variable EUR~std::ifstream data_fileEUR(TM) has initializer but incomplete type
Functions.cc:13: error: invalid conversion from EUR~int (*)[1250]EUR(TM) to EUR~intEUR(TM)


-------------------------
Ingen signatur!



Nissebosselasse 19:59 - 21:a Maj 2006 | Post #4
Medlem
Inlägg: 490


Skicka PM
Du returnerar en pekare-till-int (dvs en array) i funktionen LoadMap, men i funktionsdeklarationen har du skrivit att den returnerar en vanlig int (int LoadMap...).

En variant jag tänkte på är att använda std::vector istället för vanliga arrays:
  1.  
  2. // För std::vector behövs denna inkluderingen
  3. #include <vector>
  4. #include <fstream>
  5.  
  6. // Returnerar FALSE om det inte
  7. // gick att ladda filen
  8. bool LoadMap (string filename, std::vector<char> &filemap)
  9. {
  10. // filemap är nu en referens, dvs,
  11. // som en pekare, till en samling av char.
  12. ifstream data_file (filename.c_str());
  13. if (!data_file.is_open()) {
  14. // Filen kunde inte öppnas
  15. return false;
  16. }
  17.  
  18. // Så länge filen går att läsa...
  19. while (data_file.good()) {
  20. char c;
  21. data_file >> c;
  22. filemap.push_back (c);
  23. }
  24.  
  25. return true;
  26. }


Följande grejor kan vara bra att läsa på om:
  • vector
  • Referenser (variabler som deklararas med ampersand, &)

Hoppas jag inte förvirrade det än mer nu! Smiley

-------------------------
http://pushingcows.se
Gula Nallen



Sotai 14:39 - 24:e Maj 2006 | Post #5
Medlem
Inlägg: 5


Skicka PM
Hejsan. Jag skrev om din funktion så att den (bör, har inte testat) fungera. Tills du lär dig förstå Nisses.
  1. #define MAPSIZE 1250
  2. int[] LoadMap(string filename)
  3. {
  4. int map[MAPSIZE];
  5. ifstream data_file(filename.c_str());
  6. for(int i = 0; i < MAPSIZE ; i++)
  7. data_file >> map[i];
  8. return map;
  9. }

En array och en pekare är egentligen samma sak, bara att en array har ett tilldelat utrymme till sig i minnet. Din funktion skulle kunna skrivas om till:
  1. int* LoadMap(string filename)
  2. {
  3. int map[MAPSIZE];
  4. ifstream data_file(filename.c_str());
  5. for(int i = 0; i < MAPSIZE ; i++)
  6. {
  7. data_file >> *map;
  8. *map++;
  9. }
  10. return map;
  11. }

Eller något i den stilen. Bara så du förstår likheterna. =)

Lycka till med ditt spel =)

-------------------------
Ingen signatur!

Senast redigerad 14:41 - 24:e Maj 2006


Nissebosselasse 15:35 - 24:e Maj 2006 | Post #6
Medlem
Inlägg: 490


Skicka PM
Problemet med den sista är väl att pekaren som returneras pekar på en lokal variabel, vilket ju inte är så smart (den existerar ju inte utanför funktionens kropp, såvida den inte görs static).


-------------------------
http://pushingcows.se
Gula Nallen



Sidor: 1

Forum huvudsida -> Programmering -> C++ probs
Atom feed

Du får inte posta i den här tråden | Till toppen