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.
Ik weet dat het kan, je hebt programma's die het gehele geheugen dat gebruikt word door een programma kunnen lezen/wijzigen weet alleen niet of het met een HWND kanquote:Op zondag 2 januari 2011 21:30 schreef FastFox91 het volgende:
Met windows.h heb ik een HWND van een andere applicatie. De applicatie heeft een tabel die ik wil uitlezen en gebruiken. Is dat mogelijk (met HWND) of ergens anders mee? Ben nog niet zo lang bezig met c++ en ik heb een aanwijzing nodig naar de goede richting.
Ik denk dat hij die HWND verkrijgt uit een .dll-etje ofzo, FastFox91 moet even wat specifieker zijnquote:Op zondag 2 januari 2011 21:31 schreef netolk het volgende:
[..]
Ik weet dat het kan, je hebt programma's die het gehele geheugen dat gebruikt word door een programma kunnen lezen/wijzigen weet alleen niet of het met een HWND kan
Je kan het bij aanvang van het programma op de heap declareren.quote:Op zondag 2 januari 2011 21:28 schreef netolk het volgende:
[..]
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...
Hoe kan je anders iets op de heap zetten dan?
1 | HWND venster = FindWindow( "venster", NULL); |
Oe dat klinkt interessant vertel!quote:Op zondag 2 januari 2011 21:45 schreef thabit het volgende:
[..]
Je kan het bij aanvang van het programma op de heap declareren.
Shared objects/shared memory is denk ik de term die het meeste raakte met wat jij wil.quote:Op zondag 2 januari 2011 21:46 schreef FastFox91 het volgende:
@TeringHenkie Simpel, of bedoel je dit niet?
[ code verwijderd ]
netolk, dat is goed nieuws.Heb nou "Window Detective" gevonden. Gelukkig opensource, dus misschien kan ik daar wat van leren, maar denk dat dat nog te moeilijk voor mij is.
Gewoonquote:Op zondag 2 januari 2011 22:43 schreef netolk het volgende:
[..]
Oe dat klinkt interessant vertel!
Kan ik het dan ook via een pointer verwijderen van de heap?
1 2 3 4 5 6 | Bla *schaap = new Bla(); delete schaap; // EN ALTIJD: schaap = 0; |
joh, alleen werd er gesuggereerd dat het ook zonder new kan...quote:
quote:Op maandag 3 januari 2011 13:37 schreef netolk het volgende:
[..]
joh, alleen werd er gesuggereerd dat het ook zonder new kan...
ten 2e kan je dit niet verwijderen via een pointer...
1 2 3 4 5 6 7 | class PietjePuk { ... }; PietjePuk a, b(123, 456), c(a); int main() { ... } |
Hmm.. tja dat is ook niet echt een oplossing... het gaat om aardig wat objecten die in runtime gemaakt moeten kunnen worden... maar misschien kan ik het met een scope wel maken...quote:Op maandag 3 januari 2011 14:57 schreef thabit het volgende:
Zoiets:
[ code verwijderd ]
Ik zou dit overigens niet met de hand destructen, de destructors worden automatisch aangeroepen bij het afsluiten van het programmen.
1 2 3 4 5 6 7 8 9 10 | class Data{ //blabla }; int main(){ { Data myData(); // doe dingen met data } // dan bestaat myData hier niet meer toch? } |
Yep, alles daarbinnen wordt van de stack geflikkerd na de sluitende haken.quote:Op maandag 3 januari 2011 18:03 schreef netolk het volgende:
[..]
Hmm.. tja dat is ook niet echt een oplossing... het gaat om aardig wat objecten die in runtime gemaakt moeten kunnen worden... maar misschien kan ik het met een scope wel maken...
[ code verwijderd ]
Het klopt dat myData alleen maar in de binnenste scope (waar het gemaakt word) bestaat toch?
maarja dit is niet zo netjes kan dit ook beter?
Maar kan dit ook netter?quote:Op maandag 3 januari 2011 18:05 schreef TeringHenkie het volgende:
[..]
Yep, alles daarbinnen wordt van de stack geflikkerd na de sluitende haken.
Ik heb iets bedacht als ik die data dingen nu eens gewoon in een vector oid zet en zo nu en dan kijk of ze weg kunnen, is dat iets wat redelijk efficiënt is of word het dan gewoon zo'n chaos?quote:Op maandag 3 januari 2011 18:06 schreef netolk het volgende:
[..]
Maar kan dit ook netter?
Het liefst op elk moment van je stack te gooien via een pointer oid.
weg uit dit topic!quote:Op dinsdag 4 januari 2011 18:25 schreef thabit het volgende:
Een andere optie is om geen C++ te gebruiken, maar een taal met ingebouwde garbage collection en op die manier jezelf in de 21ste eeuw te verwelkomen.
Hehe zo oud ben ik nou ook weer niet hoor...quote:Op dinsdag 4 januari 2011 20:43 schreef minibeer het volgende:
[..]
weg uit dit topic!
de jeugd van tegenwoordig... geen respect meer voor mensen van de oude stempel
Ik onderschrijf dit.quote:Op dinsdag 4 januari 2011 18:25 schreef thabit het volgende:
Een andere optie is om geen C++ te gebruiken, maar een taal met ingebouwde garbage collection en op die manier jezelf in de 21ste eeuw te verwelkomen.
Ja? Dus dit is 1337?quote:
1 | std::map<std::string, std::vector<std::pair<double, std::string> > > list; |
Want in C# kun je nietquote:Op woensdag 5 januari 2011 11:36 schreef Thomass het volgende:
[..]
Ja? Dus dit is 1337?Het is eerder troep
[ code verwijderd ]
1 | System.Collections.Generic.Dictionary<System.String, System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<double, System.String>>> list |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |