Die discussie ga je verliezen. Je 'moet' leren datastructuren als vectors e.d. zelf te maken, dat is een onderdeel van je opleiding. Je mag bij dit soort opdrachten nooit collections gebruiken.quote:Op zondag 31 oktober 2010 21:42 schreef FastFox91 het volgende:
Persoonlijk wil ik ook liever vectoren gebruiken, maar de opdracht wenst dat er een array gebruikt wordt. Morgen toch maar even discussiėren met mijn docent.
1 2 3 4 | { int x,y,waarde; } |
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 | { private: int* data; unsigned int width; unsigned int height; public: unsigned int getWidth() const {return width;} unsigned int getHeight() const {return height;} Matrix(unsigned int width, unsigned int height) : width(width), height(height) {data = new int[width * height];} ~Matrix() {delete[] data;} int& get(unsigned int x, unsigned int y) {/* todo: check bounds */ return data[x + y * width];} void copyTo(Matrix& pMatrix) {/* for-next loops to copy data */} }; class VariableMatrix { private: Matrix* MyMatrix; public: VariableMatrix() : MyMatrix(0) {} ~VariableMatrix() {delete MyMatrix;} Get(unsigned int x, unsigned int y) {/*check for zero*/ return MyMatrix.Get(x,y);} Set(unsigned int x, unsigned int y) { if (MyMatrix == 0 || x >= MyMatrix.GetWidth() || y >= MyMatrix.GetHeight()) { Matrix* NewMatrix = new Matrix(x+1, y+1); if (MyMatrix) { MyMatrix.copyTo(NewMatrix); delete MyMatrix; MyMatrix = NewMatrix; } } } }; Let niet op m'n vreselijke stijl en alle fouten. want ik gebruik nu m'n persoonlijke- en werk-stijl doorelkaar. |
Klinkt als een enorme teringzooi, maargoed. Als je een 2D array nodig hebt, moet je niet opeens met rare zaken gaan klooien.quote:Op dinsdag 2 november 2010 11:41 schreef Cruise.Elroy het volgende:
Ik zou er een linked list van matrices van maken denk ik. Krijg je echt enorm leuke code, en nog efficient in geheugengebruik ook. (alleen niet heel snel)
Rare zaken?quote:Op dinsdag 2 november 2010 11:44 schreef Catbert het volgende:
[..]
Klinkt als een enorme teringzooi, maargoed. Als je een 2D array nodig hebt, moet je niet opeens met rare zaken gaan klooien.
Hoe maak je zo'n linked list dan?quote:Op dinsdag 2 november 2010 11:53 schreef Cruise.Elroy het volgende:
[..]
Rare zaken?
Ik zou wss apart verticaal en horizontaal resizen afhandelen, en elk nieuw blok erbij in een linked list zetten. Elk blok kan je dan indexen als elke statische 2D array
Dat bedoel ik dus...quote:
Je hoeft mij niet te vertellen wat een linked list is. Het punt is dat hij voor z'n opleiding C++ aan het leren is, en net met arrays begint. Dan zou je moeten snappen dat hij A) de opdracht uit moet voeren zoals beschreven en B) we het niet onnodig complex moeten maken.quote:Op donderdag 4 november 2010 07:54 schreef Cruise.Elroy het volgende:
Oh kom op, een LL is naast een standaard array wel de meest basic manier van data opslaan.
http://en.wikipedia.org/wiki/Linked_list
Het is wat lastig practicumopdrachten uit te voeren als je geen taalen kent waarin je dat uitvoeren kunt doen. Je kunt zoveel theorie leren, maar een DSW tree kunnen implementeren zul je toch echt gewoon een keer moeten doen om 't te snappen.quote:Op donderdag 4 november 2010 10:14 schreef thabit het volgende:
Ik vind het wel raar hoor, dat mensen eerst met programmeertalen beginnen en daarna pas met algoritmen en datastructuren. Andersom zou beter zijn.
Nee, C++ is gewoon saai.quote:Op donderdag 4 november 2010 10:45 schreef FastFox91 het volgende:
Praten jullie nog steeds over dat probleempje van mij?
Heeft C++ geen interessantere, van hoger niveau, onderwerpen waarover te discussiėren valt?
Ow heet dat zo XDquote:Op donderdag 4 november 2010 07:54 schreef Cruise.Elroy het volgende:
Oh kom op, een LL is naast een standaard array wel de meest basic manier van data opslaan.
http://en.wikipedia.org/wiki/Linked_list
Ik heb nog wat lopen spitten, en het lijkt dat er minstens 4 bytes verloren lijken te gaan, iig 3 jaar geleden nog welquote:tried spelunking in STL code that comes with VS2008 SP1 (a.k.a. VC9).
Considering debug builds as per your request, I came to the following conclusions:
In both cases of iterator debugging feature (i.e. _HAS_ITERATOR_DEBUGGING) being enabled or disabled:
1. vector has 3 data members, all pointers. In 32-bit systems, each pointer is 4 bytes, so they occupy 3*4 = 12 bytes.
2. vector is derived from _Vector_val class. This class has an _Alval data member, which is 1 byte big.
However, for alignment reasons, the size cost is rounded to 4 bytes.
So, you have 12 bytes (from 3 vector's pointers) + 4 bytes (from _Vector_val::_Alval) = 16 bytes subtotal.
Now, let's go to sub-cases of iterator debugging feature enabled or disabled.
If iterator debugging feature is enabled:
3a. _Vector_val derives from _Container_base_secure. _Container_base_secure has a data member _Myfirstiter, which is a pointer, so add 4 bytes.
The total becomes: 16 + 4 = 20 bytes (as per your finding).
If iterator debugging feature is disabled:
3b. _Vector_val derives from _Container_base_aux_alloc_real. _Container_base_aux_alloc_real has one data member. Its size is 1 byte, but for alignment reasons rounds up to 4 bytes.
4b. _Container_base_aux_alloc_real derives from _Container_base_aux. _Container_base_aux has one data member _Myownedaux, which is a pointer; so: add 4 bytes.
In this case the total becomes: 16 + 4 + 4 = 24 bytes (as per your finding).
You may want to try this simple C++ program I wrote to try to better understand the total size of STL vector.
Je mag van STL verwachten dat een lege container geen heap gaat aanspreken.quote:Op dinsdag 9 november 2010 14:00 schreef thabit het volgende:
sizeof laat natuurlijk alleen de ruimte zien die het object zelf inneemt, niet de extra geheugenruimte die het reserveert.
Das best wel slecht... wel grappig iddquote:Op dinsdag 9 november 2010 14:04 schreef Cruise.Elroy het volgende:
[..]
Je mag van STL verwachten dat een lege container geen heap gaat aanspreken.
Grappig genoeg gebeurt dit wel op de PS3 of X360 (weet niet meer welke)
Het levert echt vreselijke bugs op als je multi-platform en met heap management werkt.quote:Op dinsdag 9 november 2010 14:52 schreef netolk het volgende:
[..]
Das best wel slecht... wel grappig idd
Hčhč ja dat bedoel ik ja... oké dus als je maar 1 functie nodig hebt kun je die beter apart in een cpp file zetten en die compilen +linken?quote:Op woensdag 24 november 2010 15:34 schreef Catbert het volgende:
Je compiler? Je linker bedoel je. Als je statisch linked wordt alles meegenomen.
Ja maar dat klinkt al moeilijk XDquote:
Je kan de libraries vast wel in een DLL stoppen, maar het beste antwoord op zulke vragen blijft nog altijd: RTFM.quote:Op woensdag 24 november 2010 18:18 schreef netolk het volgende:
[..]
Ja maar dat klinkt al moeilijk XD
ik gebruik minGW kan die dat überhaupt wel?
Hij heeft het volgens mij over compile-tijden. Dan maakt het niet uit of je statisch of dynamisch linkt, de libraries zelf zijn natuurlijk al gecompileerd.quote:Op donderdag 25 november 2010 10:31 schreef Catbert het volgende:
Bovendien, wat boeit het dat je executable wat groter wordt?
Normaal hercompile je alleen de code die gewijzigd is. Als je voor elke build alles opnieuw compiled doe je sowieso iets niet goed.quote:Op donderdag 25 november 2010 11:16 schreef Cruise.Elroy het volgende:
Hij heeft het volgens mij over compile-tijden. Dan maakt het niet uit of je statisch of dynamisch linkt, de libraries zelf zijn natuurlijk al gecompileerd.
Linken is in mijn ervaring vaak een traag onderdeel omdat je het moeilijk distributed kan doen (iaw, er zijn weinig pakketten die dat ondersteunen) tenzij ik moduleinterfaces ga veranderen is linken snel 50% van de buildtijd.quote:Op donderdag 25 november 2010 11:19 schreef Catbert het volgende:
[..]
Normaal hercompile je alleen de code die gewijzigd is. Als je voor elke build alles opnieuw compiled doe je sowieso iets niet goed.
Daarnaast gaf 'ie na mijn reactie aan dat het om het linken ging, en linken gaat sowieso heel snel.
Dat terwijl dat hele gebeuren van headers includen, compilen en linken bedoeld was om het snel te laten werken. In deze tijd van snelle processoren en parallellisatie vertraagt het de boel alleen maar. Een soort QWERTY-achtige taferelen dus.quote:Op donderdag 25 november 2010 13:46 schreef Cruise.Elroy het volgende:
[..]
Linken is in mijn ervaring vaak een traag onderdeel omdat je het moeilijk distributed kan doen (iaw, er zijn weinig pakketten die dat ondersteunen) tenzij ik moduleinterfaces ga veranderen is linken snel 50% van de buildtijd.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include "Error.h" #include "Game.h" #include <iostream> #include <Windows.h> int main(){ srand(unsigned(time(0))); rand(); // voorkomt dat het 1e getal altijd hetzelfde is try{ // het stuk waar Game gebruikt kan worden Game myGame("01.lvl","01.opt"); //myGame.run(); // gameloop } catch(Error e){ std::cerr << e._DATA << '\n'; } std::cout << "?\n"; return 0; } |
Sorry vergeten er bij te zetten maar dat is een const char* waar ik dan een string in stop, maar er word dus geen throw Error gedaan...quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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{ // read data from file } catch(std::ios_base::failure){ Read.close(); throw Error("File Corrupted"); } Read.close(); } else throw Error("Can't open Lvl File"); } |
Heb ik dus gedaan en alles word tot en met onder aan de try uit gevoerd en de catch word niet aangeroepen, wat wel zou moeten aangezien het bestand minder data bevat dan ik probeer te lezen dus zou er een ios_base::failure moeten zijn maar die word dus niet ge-trowed...quote:Op vrijdag 26 november 2010 19:29 schreef thabit het volgende:
Misschien moet je wat couts in je code plaatsen ter debugging (wel met endl eindigen anders komen ze misschien niet op het scherm). Zo kun je zien wat er waar gebeurt.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |