| | |
| Stránka: 1 z 1
| [ Príspevkov: 18 ] | |
Autor | Správa |
---|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal kuma: 17.12.2013 22:40 | |
|
Dobrý deň prosím vás potrebujem pomoc mám program spravený, a prekladač pri kompilácie nehlási žiadne chyby ale pri priebehu aplikacie pri spusteni nacitavania zo suboru asi v 3/4 vyhodi chybu Unhandled exception at 0x01304012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. a neviem co mam s tym urobit ... lebo v programe ziadnu chybu nevidim. Tento program by mal zatial sluzit na Na ukladanie hodnot do trojrozmerneho pola objektov Block cize zadate X Y Z Block MAP[X][Y][Z]; a MAP[X][Y][Z].setID(cislo); a nastavim hodnotu do trojroymerneho pola objektu dalej mam tam aj moynost uloyenia do suboru ktora funguje super a moznost nacitania zo suboru ktora mi robi tento problempre zobrazenie kodu, otvorit spoiler ! (ak sa neurazis, pre lepsiu citatelnost som dal kod do spoilera. jtbs)[c]#include <Windows.h> #include <iostream> #include <string> #include <fstream> using namespace std; //kolko hodnot mozem ulozit do x -> MAX_X --> LEN PARNE CISLA !!!!! #define MAX_X 20 //cize -10 az 10 #define MAX_Y 10 //cize -5 az 5 #define MAX_Z 20 //cize -10 az 10 //hodnoty pre funkciu msg() a wmsg() #define err 0 #define inf 1 #define war 2 //Farby a ich kody #define BLACK 0 #define DBLUE 1 #define DGREEN 2 #define DAQUA 3 #define DRED 4 #define DPURPLE 5 #define DYELLOW 6 #define DWHITE 7 #define GRAY 8 #define BLUE 9 #define GREEN 10 #define AQUA 11 #define RED 12 #define PURPLE 13 #define YELLOW 14 #define WHITE 15 #define DEFAULT 7 //Verzia Programu v nej bude ulozena verzia class GameVersion { private: string gv; void setVer(string Param1) { gv = Param1; } public: GameVersion() { setVer("1.0.0"); } string getVer() { return gv; } }; //Vector3D v tomto programe zatial nieje pouzity IGNORUJTE class Vector3D { private: float x, y, z; public: Vector3D() { setXYZ(0, 0, 0); } void setXYZ(float Param1, float Param2, float Param3) { x = Param1; y = Param2; z = Param3; } void setX(float Param1) { x = Param1; } void setY(float Param1) { y = Param1; } void setZ(float Param1) { z = Param1; } float getX() { return x; } float getY() { return y; } float getZ() { return z; } }; //blok class Block { private: unsigned int ID; public: void setID(unsigned int Param1) { ID = Param1; } unsigned int getID() { return ID; } }; //Funkcia na nastavovanie farby textu void SetColor(unsigned char Param1, unsigned char Param2) { int color = Param1 + Param2 * 16; HANDLE cHandle; cHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(cHandle, color); } //Staticke Deklaracie aby mohli s nimi pracovat aj funkcie na konci static GameVersion v; static Block MAP[MAX_X][MAX_Y][MAX_Z]; //vytvori trojrozmerne pole blokov MAP[X][Y][Z] static fstream map_file; //subor bude sluzit na ukladanie a nacitavanie mapy static fstream crash_file; //tu sa budu zapisovat chyby static fstream log_file; //tu sa bude zapisovat priebeh hry //funkcie void wmsg(unsigned char, string); //otvori dialogove okno s chybou , infom , alebo upozornenim void msg(unsigned char, string); //zobrazi [INFO] / [ERROR] / [WARNING] + string + \n do okna konzoli void start(); //hlavna funkcia - pokracovanie programu zadavanie prikazov
int main() { log_file.open("game_log.log", ios::app); //subor log_file sa otvori a zacne sa zapisovat na jeho koniec (ios::app) if(!log_file.is_open()) { crash_file.open("crash.txt" , ios::app); if(!crash_file.is_open()) { crash_file << "[ERROR]File crash.txt and game_log.log is not open !!\n"; msg(err, "File crash.txt and game_log.log is not open !!"); wmsg(err, "File crash.txt and game_log.log is not open !!"); } else if(crash_file.is_open()) { crash_file << "[WARNING]File game_log.log is not open !\n"; msg(war, "File game_log.log is not open !!"); wmsg(war, "File game_log.log is not open !!"); } } system("color 70"); //nastavi hlavnu farbu textu na ciernu a pozadie sede SetColor(0, DEFAULT); //nastavy Farbu Textu na ciernu a pozadia za textom na DEFAULT msg(inf, "Running version " + v.getVer()); //zobrazi verziu programu start(); //spusti zadavanie prikazov log_file.close(); map_file.close(); crash_file.close(); return 0; }
void wmsg(unsigned char Param1, string Param2) //otvori dialogove okno s chybou , infom , alebo upozornenim { string Param3; if(Param1 == 0) //chyba { Param3 = "echo x=MsgBox(\"" + Param2 + "\",16,\"[FATAL ERROR]\") > message.vbs"; char *c; c = &Param3[0]; system(c); system("start message.vbs"); } else if(Param1 == 1) //info { Param3 = "echo x=MsgBox(\"" + Param2 + "\",48,\"[INFO]\") > message.vbs"; char *c; c = &Param3[0]; system(c); system("start message.vbs"); } else if(Param1 == 2) //upozornenie { Param3 = "echo x=MsgBox(\"" + Param2 + "\",64,\"[WARNING]\") > message.vbs"; char *c; c = &Param3[0]; system(c); system("start message.vbs"); } }
void msg(unsigned char Param1, string Param2) //zobrazi [INFO] / [ERROR] / [WARNING] + string + \n do okna konzoli { if(Param1 == 0) //chyba { cout << "["; SetColor(12, DEFAULT); cout << "ERROR"; SetColor(0, DEFAULT); cout << "]" << Param2 << "\n"; log_file << "[ERROR]" << Param2 << "\n"; } else if(Param1 == 1) //info { cout << "["; SetColor(11, DEFAULT); cout << "INFO"; SetColor(0, DEFAULT); cout << "]" << Param2 << "\n"; log_file << "[INFO]" << Param2 << "\n"; } else if(Param1 == 2) //upozornenie { cout << "["; SetColor(14, DEFAULT); cout << "WARNING"; SetColor(0, DEFAULT); cout << "]" << Param2 << "\n"; log_file << "[WARNING]" << Param2 << "\n"; } }
void start() //hlavna funkcia - pokracovanie programu zadavanie prikazov { msg(inf, "All Comands > help"); string command; float px , py, pz; unsigned int pid, p1 = 0, p2 = 0, p3 = 0; while(1) //zadavanie prikazov (opakuje sa stale kym nezadate prikaz exit alebo stop) { cin.clear(); cout << "\b\b> "; SetColor(BLUE, DEFAULT); //nastavi farbu textu na modru getline(cin, command); SetColor(BLACK, DEFAULT); //nastavi farbu textu na ciernu if(command == "help") //ak je prikaz help { log_file << "[INFO]User use command \"help\"\n"; msg(inf, "Comands:"); SetColor(YELLOW, DEFAULT); cout << "Type "; SetColor(BLUE, DEFAULT); cout << "chelp "; SetColor(YELLOW, DEFAULT); cout << "if you need help with other command.\n"; SetColor(BLUE, DEFAULT); cout << "set\nget\nclear\nlimits\nload\nsave\nexit\nrestart\n"; SetColor(BLACK, DEFAULT); } else if(command == "set") //ak je prikaz set nastavujete ID pre niektory blok z trojrozmerneho pola blokov { log_file << "[INFO]User use command \"set\"\n"; SetColor(GREEN, DEFAULT); //zadavate X cout << "X: "; cin >> px; SetColor(RED, DEFAULT); //zadavate Y cout << "Y: "; cin >> py; SetColor(BLUE, DEFAULT); //zadavate Z cout << "Z: "; cin >> pz; SetColor(DAQUA, DEFAULT); //zadavate ID cout << "ID: "; cin >> pid; SetColor(BLACK, DEFAULT); p1 = px; p2 = py; p3 = pz; p1 += MAX_X / 2; p2 += MAX_Y / 2; p3 += MAX_Z / 2; MAP[p1][p2][p3].setID(pid); //tu sa ID nastavi cout << "ID has been set MAP[" << p1 << "][" << p2 << "][" << p3 << "].setID(" << pid << ");\n"; log_file << "[INFO]ID has been set MAP[" << p1 << "][" << p2 << "][" << p3 << "].setID(" << pid << ");\n"; msg(inf, "ID has been set.\n"); } else if(command == "get") //ak je prikaz get ziskavate ID z jedneho bloku trojrozmerneho pola blokov { log_file << "[INFO]User use command \"get\"\n"; SetColor(GREEN, DEFAULT); //zadavate X cout << "X: "; cin >> px; SetColor(RED, DEFAULT); //zadavate Y cout << "Y: "; cin >> py; SetColor(BLUE, DEFAULT); //zadavate Z cout << "Z: "; cin >> pz; SetColor(DAQUA, DEFAULT); p1 = px + MAX_X / 2; //tu sa suradnice X Y Z p2 = py + MAX_Y / 2; //premienaju na pocitadla trojrozmerneho pola ked bude px = -4 tak bude p1 = 6 p3 = pz + MAX_Z / 2; //ked bude px = 0 tak bude p1 = 10 atd... pid = MAP[p1][p2][p3].getID(); cout << "ID = " << pid << "\n"; //zobrazi sa ID SetColor(BLACK, DEFAULT); } else if(command == "clear") //zmaze povodny obsah okna { log_file << "[INFO]User use command \"clear\"\n"; system("cls"); } else if(command == "limits") //zobrazi X Y Z limity { log_file << "[INFO]User use command \"limits\"\n"; msg(inf, "Limits of X Y Z"); SetColor(DGREEN, DEFAULT); cout << "MIN X: " << 0 - MAX_X / 2 << "\n"; cout << "MIN Y: " << 0 - MAX_Y / 2 << "\n"; cout << "MIN Z: " << 0 - MAX_Z / 2 << "\n"; cout << "MAX X: " << MAX_X / 2 << "\n"; cout << "MAX Y: " << MAX_Y / 2 << "\n"; cout << "MAX Z: " << MAX_Z / 2 << "\n"; SetColor(BLACK, DEFAULT); } else if(command == "save") //ulozi hodnoty do suboru ktoreho nazov zvolite vy { log_file << "[INFO]User use command \"save\"\n"; string map_name; cout << "Map Name: "; getline(cin, map_name); //zadate nazov suboru string a = map_name + ".kuma"; map_file.open(a, ios::out); //otvori sa subor pre zapis if(map_file.is_open()) //ak je subor otvoreny ulozia sa hodnoty do suboru za seba oddelene medzerami { int p1 = 0, p2 = 0, p3 = 0; while(1) //Saving Map { map_file << MAP[p1][p2][p3].getID() << " "; SetColor(GREEN, DEFAULT); cout << "X: "; cout << p1 - MAX_X / 2; SetColor(RED, DEFAULT); cout << " Y: "; cout << p2 - MAX_Y / 2; SetColor(BLUE, DEFAULT); cout << " Z: "; cout << p3 - MAX_Z / 2; SetColor(BLACK, DEFAULT); cout << "\n"; if(p3 >= 0 && p3 <= MAX_Z - 1) p3 += 1; else if(p3 == MAX_Z) { p3 = 0; if(p2 >= 0 && p2 <= MAX_Y - 1) p2 += 1; else if(p2 == MAX_Y) { p2 = 0; if(p1 >= 0 && p1 <= MAX_X - 1) p1 += 1; else if(p1 == MAX_X) break; else { msg(err, "Map " + map_name + " can not be saved."); log_file << "[ERROR]Map " << map_name << " can not be saved.\n"; wmsg(err, "Map " + map_name + " can not be saved."); cout << "Press ENTER to EXIT.\n"; cin.get(); exit(1); } } else { msg(err, "Map " + map_name + " can not be saved."); log_file << "[ERROR]Map " << map_name << " can not be saved.\n"; wmsg(err, "Map " + map_name + " can not be saved."); cout << "Press ENTER to EXIT.\n"; cin.get(); exit(1); } } else { msg(err, "Map " + map_name + " can not be saved."); log_file << "[ERROR]Map " << map_name << " can not be saved.\n"; wmsg(err, "Map " + map_name + " can not be saved."); cout << "Press ENTER to EXIT.\n"; cin.get(); exit(1); } } msg(inf, "Map " + map_name + " is saved."); log_file << "[INFO]Map " << map_name << " is saved.\n"; map_file.close(); } else if(!map_file.is_open()) //ak subor nieje otvoreny Zobrazi chybu { msg(err, "Map " + map_name + " can not be saved."); //zobrazi chybu log_file << "[ERROR]Map " << map_name << " can not be saved.\n"; //zapise chybu do suboru wmsg(err, "Map " + map_name + " can not be saved."); //otvori chybovi dialog cout << "Press ENTER to EXIT.\n"; cin.get(); exit(1); //KONIEC } } else if(command == "load") { log_file << "[INFO]User use command \"load\"\n"; string map_name; cout << "Map Name: "; SetColor(BLUE, DEFAULT); getline(cin, map_name); SetColor(BLACK, DEFAULT); string a = map_name + ".kuma"; map_file.open(a, ios::in); if(map_file.is_open()) { int p1 = 0, p2 = 0, p3 = 0; unsigned int p4 = 0; while(!map_file.eof()) //Nacitavanie Mapy pokym subor neskonci { map_file >> p4; MAP[p1][p2][p3].setID(p4); SetColor(GREEN, DEFAULT); cout << "X: "; cout << p1 - MAX_X / 2; SetColor(RED, DEFAULT); cout << " Y: "; cout << p2 - MAX_Y / 2; SetColor(BLUE, DEFAULT); cout << " Z: "; cout << p3 - MAX_Z / 2; SetColor(BLACK, DEFAULT); cout << "\n"; if(p3 >= 0 && p3 <= MAX_Z - 1) p3 += 1; else if(p3 == MAX_Z) { p3 = 0; if(p2 >= 0 && p2 <= MAX_Y - 1) p2 += 1; else if(p2 == MAX_Y) { p2 = 0; if(p1 >= 0 && p1 <= MAX_X - 1) //ak - 1 zamenite za -3 if(p1 >= 0 && p1 <= MAX_X - 3) p1 += 1; /* AK SA TOTO ZMENI NACITA SA CCA O 1/4 OBJEKTOV MENEJ a neviskoci CHYBA*/ else if(p1 == MAX_X) //ak dopisete sem - 2 else if(p1 == MAX_X - 2) break; else { msg(err, "Map " + map_name + " can not be loaded."); log_file << "[ERROR]Map " << map_name << " can not be loaded.\n"; wmsg(err, "Map " + map_name + " can not be loaded."); cout << "Press ENTER to EXIT.\n"; cin.get(); exit(1); } } else { msg(err, "Map " + map_name + " can not be loaded."); log_file << "[ERROR]Map " << map_name << " can not be loaded.\n"; wmsg(err, "Map " + map_name + " can not be loaded."); cout << "Press ENTER to EXIT.\n"; cin.get(); exit(1); } } else { msg(err, "Map " + map_name + " can not be loaded."); log_file << "[ERROR]Map " << map_name << " can not be loaded.\n"; wmsg(err, "Map " + map_name + " can not be loaded."); cout << "Press ENTER to EXIT.\n"; cin.get(); exit(1); } } msg(inf, "Map " + map_name + " is loaded."); log_file << "[INFO]Map " << map_name << " is loaded.\n"; map_file.close(); } else if(!map_file.is_open()) //ak nieje subor urceny na citanie otvoreny pravdepodobne neexistuje tak nas o tom program informuje { msg(err, "Map " + map_name + " does not exist."); log_file << "[ERROR]Map " << map_name << " does not exist.\n"; } } else if(command == "stop" || command == "exit") //koniec programu { cout << "Press ENTER to EXIT\n"; cin.get(); exit(1); } else if(command == "restart") //restart programu { system("cls"); main(); } command = "/0"; //vymaze sa hodnota ulozena v prikaze } }[/c] Pridam aj kod s popisom ked popis (komentare k pochopeniu programu) napisem pridam odpoved.
Naposledy upravil kuma dňa 17.12.2013 23:30, celkovo upravené 1
|
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | |
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 17.12.2013 23:12 | |
|
Bolo by dobré, keby si aspoň trochu presnejšie identifikoval chybu. Keďže si sem dal kód, ktorý si nevieme vyskúšať (nemáme niektoré hlavičkové súbory), tak si môžeme akurát čítať a domýšľať, kde že by mohla nastať runtime chyba. A to je ťažké. Tiež si sem dal ten okomentovaný kód štýlom "tu by malo byť toto, ale nejde to, tak je tu toto" Ja chcem vidieť ten chybný kód, nie ten, čo funguje, ale nesprávne.
Podľa výpisov (či debuggera) urči, kde presne sa to zastaví. Ak máš schopný debugger, napíš aj presnú chybu.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 17.12.2013 23:24 | |
|
DEBUG: Kód: 'KUMACRAFT.exe': Loaded 'C:\Users\mato\Documents\Visual Studio 2010\Projects\KUMACRAFT\Debug\KUMACRAFT.exe', Symbols loaded. 'KUMACRAFT.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file 'KUMACRAFT.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file 'KUMACRAFT.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file 'KUMACRAFT.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded. 'KUMACRAFT.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded. 'KUMACRAFT.exe': Loaded 'C:\Windows\SysWOW64\apphelp.dll', Cannot find or open the PDB file 'KUMACRAFT.exe': Loaded 'ImageAtBase0x4a110000', Loading disabled by Include/Exclude setting. 'KUMACRAFT.exe': Unloaded 'ImageAtBase0x4a110000' First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Tu je ten problem Kód: First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. First-chance exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04. Unhandled exception at 0x01364012 in KUMACRAFT.exe: 0xC0000005: Access violation reading location 0x00244c04.
|
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 17.12.2013 23:27 | |
|
Kebyze si to stiahnes a spustis na svojom PC malo by to ist lebo nemam tam vlozene ziadne vlastne hlavisckove subory je to len jeden cpp subor a vkladam len zakladne kniznice fstream iostream string takze spustiť ti to pojde.
|
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 17.12.2013 23:45 | |
|
jj prepac nejako sa mi lagol PC a neulozilo sa to takze pockaj skopirujem zalozny subor
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 17.12.2013 23:58 | |
|
Už som si poradil, tak som ten prísp. zmazal. Dúfal som, že si to ešte neprečítal. No nevadí...
No to ukladanie a načítanie súboru máš veru divoko. A vôbec máš celý ten program nejaký divoký. Za prvé, čo mi udrelo do očí - voláš metódu main. To nerob. Nikdy. Funkcia main je vstupný bod programu a jej adresa by v programe nemala byť použitá. Tu ti to náhodou funguje, ale inde by nemuselo. V režime -pedantic ti to vyhodí aj warning.
No a teraz tie súbory. Nechce sa mi veľmi lúštiť tie pekelné algoritmy, čo tam používaš, tak sa len spýtam: Prečo to nemôžeš ukladať jednoducho cez tri for cykly? Ukladáš to ako text, čo je jednoduchšie, dobre. No ale aj tak ukladať musíš rovnako, ako načítavaš. Nie som si istý, či pri tých tvojích divokých podmienkach nerobíš niečo zle (a pravdepodobne robíš) Keď si otvorím mapu ako texťák, nevidím tam nič, čo by sa podobalo tomu, čo som do programu zadal.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 18.12.2013 0:02 | |
|
Ja viem že to mam divoke ale nevies mi nejako poradit ako by som do suboru zakodoval informacie ID zo vsetkych objektov od MAP[0][0][0] do MAP [MAX_X][MAX_Y][MAX_Z] ??? a znova nacital do objektov MAP[][][] ?? NAJRADSEJ BY SOM BOL KEBY SOM ZISTIL AKO SA POUZIVA ios::binary pri otvarani suboru ze by som mapu ukladal binarne a nacitaval binarne ?? Ten Algoritmus je jednoduchy len to pocita X Y Z postupne pripocitava k Z od 0 do maximalnej hodnoty ked dosiahne maximalnu hodnotu pripocita sa 1 k Y ked Y dosiahne MAX hodnotu pripocita sa k X Cize ked Z napocita do MAX_Z pripocita sa 1 k Y potom ked Y napocita do MAX_Y pripocita 1 k X a ked X napocita do MAX_X tak sa cyklus ukonci. ZMENIL SOM HORE ULOZTO DOWNLOAD TERAZ SU TAM ORIGINAL SUBORI toho programu vsetko ...
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 18.12.2013 0:17 | |
|
Ak to chceš ako text, musíš si vymyslieť formát. Stanov si nejaký formát, v ktorom sa nepomýliš. Trebárs formát Kód: ID X Y Z ID X Y Z ID X Y Z Ak to do texťáku nasypeš takto, nemôžeš mať problém. A dáš to tam nejako takto: Kód: for( x... ) // nastav správne medze for( y... ) for( z... ) { subor >> MAP[x][y][z].getId() >> " " >> x >> " " >> y >> " " >> z >> " "; }
Načítaš to potom podobne. Len pri načítaní pozor na správne poradie (x, y, z), aby ti naozaj sadlo všetko na správne miesto. Binárny zápis do súboru by ti v tomto ale dosť uľahčil prácu. Stačilo by ti celé pole napachať do binárneho súborua a následne by si ho rovnako vytiahol (celé pole, všetky hodnoty by boli na svojom mieste) V tomto ale nemám s prúdmi v C++ veľké skúsenosti. Vždy radšej používam starý dobrý prístup cez FILE http://www.cplusplus.com/reference/cstdio/FILE/Tam sa dá využiť funkcia fwrite a fread. Funkciou fwrite zapíšeš do súboru celý blok dát tak, ako sú. Tzn. že ak tam dáš svoj pole, do súboru sa uloží celé 3D pole podobne, ako je uložené v RAMke. Funkciou fread potom vieš zase zobrať celý obsah toho súboru a plácnuť ho do RAMky na správne miesto tak, aby každá hodnota bola na svojom mieste.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 18.12.2013 21:02 | |
|
Nejako to uz vymyslim skusim to zmenit uvidim ako to pojde potom napisem ci sa chyba odstranila ... a diki moc A nevies ako by som to mohol ulozit pomocou fstream ?? Kód: ..... fstream map_file; string map_name; cout << "Map Name: "; getline(cin, map_name); string a = map_name + ".kuma"; map_file.open(a, ios::binary); //tu sa to nejako ulozi ???????? cout << "File saved.\n"; .....
|
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 19.12.2013 18:52 | |
|
skusil som tvoju radu s tym for spravil som to takto , zapis do suboru mi funguje: Kód: for(int x = 0; x >= 0 && x <= MAX_X;) { for(int y = 0; y >= 0 && y <= MAX_Y;) { for(int z = 0; z >= 0 && z <= MAX_Z;) { map_file << MAP[x][y][z].getID() << " "; z += 1; } y += 1; } x += 1; } ale nacitanie zo suboru mi nejde a nechapem preco zas ten RUNTIME ERROR ----> Kód: unsigned int pid = 0; for(int x = 0; x >= 0 && x <= MAX_X;) { for(int y = 0; y >= 0 && y <= MAX_Y;) { for(int z = 0; z >= 0 && z <= MAX_Z;) { map_file >> pid; MAP[x][y][z].setID(pid); z += 1; } y += 1; } x += 1; } Tu chybu mi nahodi niekde ked je to v 3/4 nacitavania.
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 20.12.2013 11:01 | |
|
Tak za prvé, ten for máš úplne divne. Naštuduj si ešte raz jeho syntax. Ďalej, pre pole MAP platí, že súradnice idú od 0 do MAP_X (rovnako pre MAP_Y a MAP_Z) - to preto, že polia začínajú od nuly a je tam presne MAP_X prvkov. Tzn. že pole končí na MAP_X-1. Takže ti tam robí šarapatu tá podmienka i <= MAX_X (podobne pre ostatné) Správne to má byť len i < MAX_X; Takto nejako to má vyzerať. Kód: for(int x = 0; x < MAX_X; x++) for(int y = 0; y < MAX_Y; y++) for(int z = 0; z < MAX_Z; z++) map_file << MAP[x][y][z].getID() << " ";
Rovnako uprav načítanie a pôjde to (Teda aj tvoje for-cykly sú správne (až na to i <= MAX_X), ale sú zbytočne zložité)
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 21.12.2013 8:12 | |
|
dik skusim to ...
|
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 24.12.2013 0:43 | |
|
uz mi to ide ale mam dalsi problem neuklada mi to do suboru 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ale ulozi mi na konci aj nezmyselne cisla ... 454546532 0 0 0 0 86741 0 0 5 0 0 0 15 0 0 0 894564 0 0 0 ... vecsina ID sa ulozi a nacita spravne ale na konci mi ich asi 20 obsahuje cisla mimo 0 tak som rozmyslal ze na zaciatku som mal Kód: for(int x = 0; x < MAX_X; x++) for(int y = 0; y < MAX_Y; y++) for(int z = 0; z < MAX_Z; z++) MAP[x][y][z].setID(0); toto malo nastavit vsetkym objektom ID 0 ale asi nenastavilo tak som chcel pridat este Kód: for(int x = 0; x < MAX_X; x++) for(int y = 0; y < MAX_Y; y++) for(int z = 0; z < MAX_Z; z++) { if(MAP[x][y][z].getID() != 0) MAP[x][y][z].setID(0); } a skoncilo to chybou zasa ta RUNTIME ERROR DOWNLOAD zdrojovy kod najnovsia verzia + Visual Studio 2010 Subory Projektu: http://uloz.to/xhnK6sXu/kumacraft-1-1-0-zip
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 24.12.2013 10:35 | |
|
Vieš mi vysvetliť, prečo tam máš v tých for cykloch x < MAX_X + 1 ?!
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 01.01.2014 20:48 | |
|
lebo ked tam bolo iba MAX_X a nie MAX_X +1 tak mi nacitalo len od napriklad -15 -10 -15 do 14 9 14 a ja som chcel od -15 -10 -15 do 15 10 15 ......
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 02.01.2014 9:36 | |
|
Lenže musíš dávať pozor na rozsah pola. Keď si alokuješ pole ako int pole[15], tak tam máš 15 prvkov. To ale nie je od 0 do 15, ale od 0 do 14 (to je 15 prvkov). S tým MAX_X+1 siahaš mimo svojho pola (v tomto príklade sa snažíš pristupovať k prvku pole[15], ktoré ale neexistuje) Toto je dôvod, prečo máš na konci toho súboru bordelné čísla (sú to čísla mimo pola, takže nejaké náhodné hodnoty) A v závislosti na tom, kde program spúšťaš, to môže spôsobovať aj runtime error (presnejšie segmentation fault)
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 17.12.13 Prihlásený: 01.09.14 Príspevky: 54 Témy: 16 | Napísal autor témy kuma: 22.01.2014 19:34 | |
|
aha dik
|
|
| Stránka: 1 z 1
| [ Príspevkov: 18 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|