Tuurlijk maar dat is dus redelijk lang...quote:Op vrijdag 26 november 2010 21:04 schreef thabit het volgende:
Kun je de code posten die de file inleest?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include "Game.h" #include "Error.h" #include "BitField.h" #include <fstream> Game::Game(const char* lvlfile,const char* optfile){ // load from file /* _OPTIONS = Options(optfile); */ std::ifstream Read(lvlfile,std::ios::binary); if(Read.is_open()){ BitField::I16 rI16; BitField::I32 rI32; try{ /* Lvl Data */ /* get demensions of lvl */ rI16.c0 = Read.get(); rI16.c1 = Read.get(); unsigned short _X = *(unsigned short*)(&rI16); rI16.c0 = Read.get(); rI16.c1 = Read.get(); unsigned short _Y = *(unsigned short*)(&rI16); /* allocate lvl space */ Piece data[_X*_Y]; /* get lvl data */ for(unsigned short y=0; y < _Y; y++){ for(unsigned short x=0; x < _X; x++){ data[y*_X+x].set_Fertile(Read.get()); // evt. de bools van Piece in 1 byte opslaan data[y*_X+x].set_Used(Read.get()); } } _LEVEL = Level(_X,_Y,data); /* Atmosphere Data */ /* CO2 */ rI32.c0 = Read.get(); rI32.c1 = Read.get(); rI32.c2 = Read.get(); rI32.c3 = Read.get(); _ATMOSPHERE.set_CO2(*(unsigned short*)(&rI32)); /* O2 */ rI32.c0 = Read.get(); rI32.c1 = Read.get(); rI32.c2 = Read.get(); rI32.c3 = Read.get(); _ATMOSPHERE.set_O2(*(unsigned short*)(&rI32)); /* H2O */ rI32.c0 = Read.get(); rI32.c1 = Read.get(); rI32.c2 = Read.get(); rI32.c3 = Read.get(); _ATMOSPHERE.set_H2O(*(unsigned short*)(&rI32)); /* N2 */ rI32.c0 = Read.get(); rI32.c1 = Read.get(); rI32.c2 = Read.get(); rI32.c3 = Read.get(); _ATMOSPHERE.set_N2(*(unsigned short*)(&rI32)); /* NOx */ rI32.c0 = Read.get(); rI32.c1 = Read.get(); rI32.c2 = Read.get(); rI32.c3 = Read.get(); _ATMOSPHERE.set_NOX(*(unsigned short*)(&rI32)); /* O3 */ rI32.c0 = Read.get(); rI32.c1 = Read.get(); rI32.c2 = Read.get(); rI32.c3 = Read.get(); _ATMOSPHERE.set_O3(*(unsigned short*)(&rI32)); /* Player */ rI16.c0 = Read.get(); rI16.c1 = Read.get(); unsigned short x = *(unsigned short*)(&rI16); rI16.c0 = Read.get(); rI16.c1 = Read.get(); unsigned short y = *(unsigned short*)(&rI16); _PLAYER = Player(x,y); } catch(std::ios_base::failure){ Read.close(); throw Error("File Corrupted"); } Read.close(); } else throw Error("Can't open Lvl File"); } |
Ja ik weet het maar omdat het binair is, gebruik ik bitfields om naar unsigned short te kunnen casten... hoe kan je zoiets dan compacter opschrijven??quote:Op vrijdag 26 november 2010 21:33 schreef thabit het volgende:
Tjezus wat een hoop code voor zo'n simpele handeling. Zoiets moet je echt compacter proberen te schrijven, zonder alles tig keer te herhalen. Verder kan ik niet direct zien wat er fout is. Zou natuurlijk ook in dingen als Level, Player en BitField of zo kunnen zitten. Kun je dat ook misschien posten?
1 2 3 4 5 6 7 8 9 10 11 12 | namespace BitField{ struct I16{ unsigned char c0:8; unsigned char c1:8; }; struct I32{ unsigned char c0:8; unsigned char c1:8; unsigned char c2:8; unsigned char c3:8; }; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Player{ unsigned short _X,_Y; // location left upper corner of screen bool _GAMEOVER; /* Buildings */ StockHouse _myStockHouse; std::vector<SawMill> _mySawMill; std::vector<Quarry> _myQuarry; public: Player(); Player(unsigned short x,unsigned short y); ~Player(){} bool Is_GameOver(){return _GAMEOVER;} unsigned short get_X(){return _X;} unsigned short get_Y(){return _Y;} void Build(unsigned short x,unsigned short y); void Draw(); //Graphics.cpp }; Player::Player(unsigned short x,unsigned short y):_X(x),_Y(y){ _myStockHouse.set_Building(_X+16,_Y+9,0,1); // staat in midden van beeld 16:9 verhouding _mySawMill.clear(); _myQuarry.clear(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Level{ unsigned short _X,_Y; // map demensions Piece *_DATA; public: Level():_X(0),_Y(0),_DATA(0){} Level(unsigned short x,unsigned short y,Piece *data):_X(x),_Y(y),_DATA(data){} ~Level(){delete[] _DATA; _DATA = 0;} unsigned short get_X(){return _X;} unsigned short get_Y(){return _Y;} Piece& operator()(unsigned short x,unsigned short y); Piece operator()(unsigned short x,unsigned short y) const; }; |
Ow hèhè dat klinkt idd wel logisch, helemaal vergeten dat ik dat aangepast had zonder te kijken of het wel kon...quote:Op vrijdag 26 november 2010 22:58 schreef thabit het volgende:
Level is niet goed, je initialiseert een pointer die naar een array verwijst die je na het verlaten van de constructor van Game weggooit. Kortom, die informatie ben je dan gewoon kwijt. Daarbij wordt er in de destructor van Level ook nog een array gedeletet die niet met new is aangemaakt, naar een weggegooide datastructuur verwijst en dus volkomen ongedefineerd is. Ik denk dat het programma wel eens vast zou kunnen lopen bij het uitvoeren van deze destructor.
1 2 3 4 | Piece *data; data = new Piece[_X*_Y]; _LEVEL = Level(_X,_Y,&data); |
Je kan bijvoorbeeld een aparte functie schrijven die als input een fstream& heeft en als output een unsigned short, en ook eentje voor een unsigned long.quote:Op vrijdag 26 november 2010 22:40 schreef netolk het volgende:
[..]
Ja ik weet het maar omdat het binair is, gebruik ik bitfields om naar unsigned short te kunnen casten... hoe kan je zoiets dan compacter opschrijven??
Maar krijg je dan niet dat je progje het bestand opent,sluit,opent,sluit ect?quote:Op vrijdag 26 november 2010 23:15 schreef thabit het volgende:
[..]
Je kan bijvoorbeeld een aparte functie schrijven die als input een fstream& heeft en als output een unsigned short, en ook eentje voor een unsigned long.
Lijkt me een foutgevoelige oplossing. Ik zou _DATA gewoon als vector<Piece> definieren en geen array Piece data[nogwat] in Game::Game aanmaken (sowieso moet je geen arrays op de stack aanmaken, kun je stack overflows van krijgen), maar ook gewoon als vector definieren (of direct _LEVEL._DATA aanspreken, gaat sneller).quote:Op vrijdag 26 november 2010 23:07 schreef netolk het volgende:
[..]
Ow hèhè dat klinkt idd wel logisch, helemaal vergeten dat ik dat aangepast had zonder te kijken of het wel kon...
kan ik het dan zo oplossen?
[ code verwijderd ]
Want ik kan data niet deleten omdat _DATA (uit level) het zelfde gebruikt toch?
Nee, je kan dat ding toch geopend houden tot hem niet meer nodig hebt. Die functie die die informatie inleest moet natuurlijk zelf geen bestanden openen en sluiten.quote:Op vrijdag 26 november 2010 23:19 schreef netolk het volgende:
[..]
Maar krijg je dan niet dat je progje het bestand opent,sluit,opent,sluit ect?
Als er in de header file alleen iets staat alsquote:Op zaterdag 27 november 2010 20:11 schreef minibeer het volgende:
Hoi, ik ben nu een programma (ContextFree heet het, ik ben de commandline aan het debuggen) geschreven in C++ aan het debuggen, omdat hij een 'gdi+ error' gaf (een invalid parameter om precies te zijn). Ik weet dat het programma wel werkt op mijn andere computer, met win vista (hij werkt niet op windows 7). Ik weet nu vrij zeker dat de error in een bepaalde functie voorkomt. Deze functie is gedefinieerd in een header file, maar als ik de header file vervang heeft dit volgens mij weinig zin, omdat de functie zelf zich in een andere file bevindt (toch?). Ik vroeg me af hoe je kan weten in welke file deze functie dan wel zit.
1 | void function(int par,char* string); |
1 2 3 | void function(int par,char* string){ // code die iets met de parameters doet } |
Bedankt man nu is mn code even een stukje overzichtelijkerquote:Op vrijdag 26 november 2010 23:26 schreef thabit het volgende:
[..]
Nee, je kan dat ding toch geopend houden tot hem niet meer nodig hebt. Die functie die die informatie inleest moet natuurlijk zelf geen bestanden openen en sluiten.
Beh ik snap er niks van. De maker heeft gereageerd met dit:quote:Op maandag 29 november 2010 11:26 schreef netolk het volgende:
[..]
Als er in de header file alleen iets staat als
[ code verwijderd ]
dan word de functie in een ander bestand gedefiniëerd. dan moet je op zoek naar iets als dit:
[ code verwijderd ]
Ow enne die int par, char* string zijn voorbeeld parameters ze kunnen van alles zijn
Heh, ik snap het. Ergens werd een functie aangeroepen op deze manier:quote:Op zondag 28 november 2010 10:40 schreef MtnViewJohn het volgende:
...
The GDI+ png file encoder does not take any encoder parameters. So I was building an encoder parameter structure with zero parameters. This worked fine until Windows 7. With Windows 7 the png encoder fails if you provide an encoder list, even if it has zero elements. Instead you must pass a NULL pointer.
1 2 3 | EncoderParameters encoderParameters; encoderParameters.Count = 0; Status s = saveBM->Save(wpath, &encClsid, &encoderParameters); |
1 | Status s = saveBM->Save(wpath, &encClsid, NULL); |
De code mist libs ofzo, maar bij compileert het niet zo 1, 2, 3quote:Op dinsdag 21 december 2010 11:35 schreef Flaccid het volgende:
Ik weet niet hoe moeilijk het is, maar is er iemand die voor mij de source can compilen zodat ik de software zonder al te veel moeite kan gebruiken? Ben bezig met een project waar we van een houten picnictafel een interactieve willen maken, en tracking is dan best relaxt
http://sites.google.com/site/tarandeep/fingermouse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream> struct Data{ unsigned short i; Data():i(8){} ~Data(){i=0;} }; int main(){ Data myData; Data *ptr; ptr = &myData; std::cout << "myData: " << myData.i << '\n'; std::cout << "ptr: " << ptr->i << '\n'; ptr->~Data(); std::cout << "myData: " << myData.i << '\n'; std::cout << "ptr: " << ptr->i << '\n'; return 0; } |
ok, is er een manier om hem te verwijderen zonder met scopes te hoeven werken?quote:Op zondag 2 januari 2011 18:26 schreef thabit het volgende:
Het enige wat die destructor doet is myData.i op 0 zetten, verder bestaat myData nog wel gewoon.
myData op de heap aanmaken ipv. op de stack?quote:Op zondag 2 januari 2011 19:01 schreef netolk het volgende:
[..]
ok, is er een manier om hem te verwijderen zonder met scopes te hoeven werken?
Ja, dat zou idd kunnen want dan kan ik hem gewoon opruimen met delete toch?quote:Op zondag 2 januari 2011 19:16 schreef TeringHenkie het volgende:
[..]
myData op de heap aanmaken ipv. op de stack?
Mits je hem aanmaakt met new. De destructor die je daar hebt is trouwens vrij zinloos: je zet iets op 0 wat je daarna toch weggooit.quote:Op zondag 2 januari 2011 20:16 schreef netolk het volgende:
[..]
Ja, dat zou idd kunnen want dan kan ik hem gewoon opruimen met delete toch?
Ik weet dat de destructor hier zinloos is, dacht in eerste instantie dat ie dan weggegooid werd bij het aanroepen van de destructor maar dat is dus niet zo...quote:Op zondag 2 januari 2011 20:27 schreef thabit het volgende:
[..]
Mits je hem aanmaakt met new. De destructor die je daar hebt is trouwens vrij zinloos: je zet iets op 0 wat je daarna toch weggooit.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |