játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5476
FZoli:    4893
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2526

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2195
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1654
syam:    1491
Frissebbek | Korábbi postok
[1] [2] [3] [4] [5] [6] > 7 < [8] [9] [10] [15] [20] [25] [30] [35] [40] [45] [50] [55] [60] [65] [70] [75] [80] [85] [90] [95] [100] [105] [110] [115] [120] [125] [130] [135] [140] [142]
Nomad - Tag | 4 hsz       Online status #205762   2014.12.08 18:12 GMT+1 óra  
versio
mielott meg beleelned magad abba hogy tudsz optimizalni

nem éltem bele magam, csak egy kicsit
versio
megmutatom hogy nez ki egy optimizalt kod, amit a microsoftnal keszitenek

hát... az első 4 és az utolsó 2 sort értem belőle
de tőlem (pár hónap hobby programozás után) ne is várja el senki, hogy értsem, ezt meghagyom a versio féle nagy okos embereknek
na mindegy köszi az okosítást ) neked is LBandy

szerk.: a "nagy okos" kifejezést ne egybe olvassátok (mert versio tényleg elég okos)

   
LBandy - Tag | 271 hsz       Online status #205761   2014.12.08 17:55 GMT+1 óra  
Csak hogy "trollkodás" mellett értelmes válasz is legyen itt: nem gyorsabb.
   
versio - Tag | 673 hsz       Online status #205760   2014.12.08 17:18 GMT+1 óra  
mielott meg beleelned magad abba hogy tudsz optimizalni, megmutatom hogy nez ki egy optimizalt kod, amit a microsoftnal keszitenek

Kód:
// Find the cross product of two constant vectors and return it.
Vector4 SSE_CrossProduct(const Vector4 &Op_A, const Vector4 &Op_B)
{
        Vector4 Ret_Vector;
        __asm
        {
                MOV EAX Op_A                               // Load pointers into CPU regs
                MOV EBX, Op_B

                MOVUPS XMM0, [EAX]                 // Move unaligned vectors to SSE regs
                MOVUPS XMM1, [EBX]   
                MOVAPS XMM2, XMM0               // Make a copy of vector A
                MOVAPS XMM3, XMM1               // Make a copy of vector B

                SHUFPS XMM0, XMM0, 0xD8      // 11 01 10 00  Flip the middle elements of A
                SHUFPS XMM1, XMM1, 0xE1       // 11 10 00 01 Flip first two elements of B
                MULPS  XMM0, XMM1                 // Multiply the modified register vectors
               
                SHUFPS XMM2, XMM2, 0xE1      // 11 10 00 01 Flip first two elements of the A copy
                SHUFPS XMM3, XMM3, 0xD8     // 11 01 10 00  Flip the middle elements of the B copy
                MULPS XMM2, XMM3                 // Multiply the modified register vectors
               
                SUBPS  XMM0, XMM2                  // Subtract the two resulting register vectors
               
                MOVUPS [Ret_Vector], XMM0      // Save the return vector
        }
        return Ret_Vector;
}
   
Nomad - Tag | 4 hsz       Online status #205759   2014.12.08 17:10 GMT+1 óra  
Sziasztok!
Elkezdtem pár matematikai osztály kidolgozását 3d-s grafikához (vektor, mátrix, stb.). A célom az lenne, hogy minél gyorsabb legyen a kód.
Nos az lenne a kérdésem, hogy bizonyos for ciklusok, melyen nem futnak le 256-nál többször, pl
Kód:
inline void ClearMatrix4x4(const Matrix4x4& mat)
{
          for(int i=0;i<4;i++)
                     for(int j=0;j<4;j++)
                               mat.m[i][j]=0;
}

gyorsabbak-e unsigned char használatával és ha gyorsabbak mennyivel:
Kód:
inline void ClearMatrix4x4(const Matrix4x4& mat)
{
          for(unsigned char i=0;i<4;i++)
                     for(unsigned char j=0;j<4;j++)
                               mat.m[i][j]=0;
}

   
Asylum - Törzstag | 5476 hsz       Online status #205613   2014.11.24 10:06 GMT+1 óra  
Akkor fejlődne a nyelv, ha az ilyen dolgokat amiért megkövezés jár kibasznák már végre (a.k.a. visszafelé kompatibilitás). Persze, nagy hőbörgés lenne miatta, de kevésbé lehetne hülye kódokat írni. Csak az meg már nem C++ Úgyhogy nekem a C++98 marad örökre, nem fogok semmi újdonságot használni.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Instalok - Tag | 590 hsz       Online status #205601   2014.11.24 07:28 GMT+1 óra  
Engem a legtöbb dolog az inkább zavart a c++11ben sajnos. Ott van például az auto, attól a falra tudok mászni. shared_ptr és társaitól szintén, ha ilyet akarok, akkor programozok c#-ban.

Ami tetszett:
- foreach jellegű ciklus
- override kulcsszó
- delete kulcsszó függvényekhez
de ezek is inkább kényelmi funkciók, minden megoldható ezek nélkül is. Itt összeszedtek 10 dolgot, ami elvileg nagyon jó, de ezek közül igazából egyik sem hiányzik.

No persze kinek a pap, kinek a paplan.

   
Parallax - Tag | 604 hsz       Online status #205600   2014.11.24 03:41 GMT+1 óra  
Matzi++;

Haladni kell a korral, különben egész egyszerűen kikopik a nyelv a többi mellől. Így modernebb is és gyorsabb is nem csak a program, hanem a fejlesztése is. VS15-ben az újabb C++ al eggyütt jön az Android cross-platform natív fejlesztgettyű is emulátorral, mindennel.

   
Matzi - Szerkesztő | 2526 hsz       Online status #205597   2014.11.23 21:39 GMT+1 óra  
Nem értek egyet. Szerintem az, hogy újra raknak új elemeket a nyelvbe, és kicsit korszerűsítik nagyon is kedvező. Nyilván nem szabad átesni a ló túloldalára, de arra eddig is volt bőven lehetőség, lásd mondjuk operátor overload vagy a template-ek. Ez még nem ügy arra, hogy maradi legyen a nyelv.

És egy lambdás crasht sem sokkal nehezebb kinyomozni, mint egy template-eset, főleg ami az std névtér alól jön. És bár nem a lambda a leghasznosabb benne, de szerintem az is hasznos. Sokkal jobb, mint függvény objektumokkal hadonászni, elég ha a fordító szórakozik ilyenekkel a háttérben.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
   
Instalok - Tag | 590 hsz       Online status #205593   2014.11.23 00:04 GMT+1 óra  
A legtöbb funkcióját én sem használnám, talán ez az override volt, ami tetszett, meg a delete. Persze mindkettő nélkül lehet élni, valószínűleg nem is fogok küzdeni vele csak ezért.

   
Asylum - Törzstag | 5476 hsz       Online status #205592   2014.11.22 21:40 GMT+1 óra  
VS2010 részben tudja már. De nekem feláll a szőr a hátamon a c++11 től, főleg amikor egy olyan crash-t kell kinyomoznom ami egy lambda kif-ben szállt el -.- A C++ az a C++98. Pont.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
LBandy - Tag | 271 hsz       Online status #205562   2014.11.20 17:18 GMT+1 óra  
Én c++11-et csak vs2013-mal és mingw-vel használtam, nem tudom/hiszem, hogy be lehet tolni 2008 alá.
   
Instalok - Tag | 590 hsz       Online status #205560   2014.11.20 12:04 GMT+1 óra  
Próbált már valaki 2008-as visual studioval c++11 compilert használni? Ahogy néztem vcc compilerem nem lesz alá, ahhoz vs13 kellene. Esetleg gcc-t valahogy belőni alá?

   
Instalok - Tag | 590 hsz       Online status #204497   2014.08.11 16:24 GMT+1 óra  
Ezeket a prefix dolgokat nem annyira szeretem, főleg nem a "My" szót. Szóval egyelőre lett belőle Rect, aztán, ha nem leszek lusta valamilyen regexet írni, akkor az egész projektet berakom egy namespace-be, és ezzel megoldódik a kevés ilyen probléma.

   
Asylum - Törzstag | 5476 hsz       Online status #204496   2014.08.11 13:45 GMT+1 óra  
Megolás (amit évmilliók óta használnak a programozók): prefix.

Kód:
struct MyRectangle;


Én annyira pro vagyok, hogy még namespacebe is rakom a prefixelt osztálynevet, hogy biztosan ne ütközzön XDDD
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Instalok - Tag | 590 hsz       Online status #204464   2014.08.07 15:38 GMT+1 óra  
Ebben is van valami. Ráadásul a namespace sem egy rossz dolog, csak néha igencsak meg tudja növelni egy változó típusának hosszát, ha nem használok using namespace-t, vagy éppen szimbólumütközés van, és egyértelműsíteni kell.

   
Matzi - Szerkesztő | 2526 hsz       Online status #204463   2014.08.07 14:56 GMT+1 óra  
Csak akkor tehetnél bármilyen nevű osztályt a globális névtérbe, ha nem lenne ott alapból semmi. De akkor jobb lenne, ha te sem tehetnél oda, és kötelező lenne mindig névtereket használni, mint a C#ban. Ami nem lenne rossz ötlet, csak a visszafelé kompatibilitási okokból kivitelezhetetlen.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
   
Instalok - Tag | 590 hsz       Online status #204462   2014.08.07 14:47 GMT+1 óra  
Igen, végül átnevezés lett, de ez azért szerintem egy igen csúnya dolog, hogy nem csinálhatok a global namespace-be bármilyen nevű osztályt.

   
syam - Törzstag | 1491 hsz       Online status #204460   2014.08.07 14:32 GMT+1 óra  
A Rectangle osztályod Vagy átnevezed vagy saját namespace rakod.
alias aalberik
   
Instalok - Tag | 590 hsz       Online status #204456   2014.08.07 12:36 GMT+1 óra  
A global namespace-be szeretnék egy Rectangle structot csinálni, azonban, ha használni szeretném, összeakad a Winapis Rectangle függvénnyel. Sajnos nem igazán értem, hogy miért, hiszen az alábbi kód sem fordul le:
Kód:
struct Rectangle;

class Graphics
{
public:
    void drawRectangle(const Rectangle& rect);
};

Hiba:
Kód:
missing type specifier - int assumed. Note: C++ does not support default-int.

Amit ugye akkor szokott generálni, ha ismeretlen számára a típus. Ha Rectangle helyett Foo-t írok, akkor működik a dolog. Undef sajnos nem segített.

   
Seeting - Törzstag | 2306 hsz       Online status #202024   2014.03.16 17:31 GMT+1 óra  
Idézet
Pretender :
Az eredetileg egy warning egyébként, és arra figyelmeztet, hogy inicializálatlan változót adsz át.



Kösz, még mindig tudok olvasni .

Idézet
Pretender :
Mellesleg átállítottam a projektet, hogy "treat warnings as errors"



Akkor azért történik egyre több furcsaság
   
Pretender - Törzstag | 2498 hsz       Online status #202022   2014.03.16 16:13 GMT+1 óra  
Az eredetileg egy warning egyébként, és arra figyelmeztet, hogy inicializálatlan változót adsz át. De egyébként igen, jó lesz, ha az ref. Vagy char*** és &words
Mellesleg átállítottam a projektet, hogy "treat warnings as errors"

   
Seeting - Törzstag | 2306 hsz       Online status #202021   2014.03.16 15:29 GMT+1 óra  
Kód:
char **words;
    int count = strSplit(data, words, ".");
    for (int i = 0; i < count; i++) {
        printf("%s\n", words[i]);
    }


Az strSplit() allokálja a words-t, mivel csak ő tudja, hogy mennyi helyre van szükség. Amit kapok:

error C4700: unitialized local variable 'words' used

Amit csinálok, gcc-ben 100% legális. A VC++ compiler meg panaszkodik. Miért?

Edit: Nevermind, elrontottam. A megoldás:

Módosítani ezt:
Kód:
int strSplit(const char* source, char ** out, char* delimeters)


Erre:

Kód:
int strSplit(const char* source, char **& out, char* delimeters)


Ugyanis másképpen nem módosulna a címérték.

Ezt a hozzászólást Seeting módosította (2014.03.16 15:39 GMT+1 óra, ---)
   
glezmen - Törzstag | 381 hsz       Online status #201920   2014.03.10 11:05 GMT+1 óra  
Idézet
M4 :
Én wxWidgets-et használtam. Szerintem egyszerű.
https://www.wxwidgets.org/



En is wxwidgets-szel kezdtem a GUIs fejlesztest, de mar az elejen sem igazan tetszett, aztan amikor egy verziovaltasnal lenyegeben lehetett kidobni az elozo kodot, akkor mondtam azt hogy eleg volt...
   
M4 - Tag | 187 hsz       Online status #201919   2014.03.10 10:44 GMT+1 óra  
Én wxWidgets-et használtam. Szerintem egyszerű.
https://www.wxwidgets.org/

   
glezmen - Törzstag | 381 hsz       Online status #201917   2014.03.10 10:38 GMT+1 óra  
Idézet
Eldor :
Qt: easy to use, hard to learn.



azert annyira nem hard, csak meg kell erteni a logikajat
   
Eldor - Tag | 163 hsz       Online status #201914   2014.03.09 23:13 GMT+1 óra  
Qt: easy to use, hard to learn.

   
Elodin - Tag | 181 hsz       Online status #201913   2014.03.09 23:09 GMT+1 óra  
Tudtok ajánlani valami easy to use lib-et, amivel lehet könnyen csili-vili GUI-t lehet elővarázsolni a semmiből Linux-ra, Windows-ra és Mac-re egyaránt?

   
Pretender - Törzstag | 2498 hsz       Online status #201867   2014.03.07 20:59 GMT+1 óra  
Én úgy tudom, hogy ilyen esetekben nem fog inlineosítani. Legalábbis a vc++ biztosan nem. De a többitől is logikátlanság lenne egy ilyen függvényt inlineosítani.
Tudom, ezzel nem segítettem túl sokat, nekem minden esetre vc++ alatt még nem volt ilyesmivel gondom.
Egyébként c++ban van többszörös öröklődés. Miért nem csinálsz egy olyan base classt, ami az eddigi(ek)nek is, meg a különleges típusnak is az őse? És akkor nem kell template quadtree.

   
Dookle - Tag | 478 hsz       Online status #201859   2014.03.07 19:29 GMT+1 óra  
Hi ! Írtam egy szép quadtree class-t.Nagyonszépen működik... Az egyetlen szépséghiba hogy bejött a képbe még egy "különleges tipus" ami nem ugyanabból az osztályból ered mint a többi elem a játékban. Ezért kénytelen leszek megcsinálni a quadtree-t templates-re , egy két template specializáció és a kód szép áttekinhető lesz.. A kérdés az hogy szerintetek mennyire megbízhatóak a rekurzív inline metódusok ?? Persze a compiler nem minden esetben fog inlineolni , de arra még sem lehet építeni hogy talán jó lesz talán nem... Ráadásul a kód crossplatform szóval minden c++ fordítón fordulnia kell...
STEVIE RAY VAUGHAN FOREVER !!!!!

http://pinkcatgames.ucoz.com/
   
Pretender - Törzstag | 2498 hsz       Online status #201498   2014.02.21 23:52 GMT+1 óra  
Az is ezt csinálja, csak figyelembe veszi a negatív értékeket is. Azt hiszem. Minden esetre teljesen jól működik, meg minden, csak hát akkor is... na!

@glezmen:
Ja, nem voltam elég pontos. De érted, hogy hogy értem...
Static_cast meg azért, hogy a fordító ne dobjon warningot. Merthogy warning treated as error. C-s castot meg ugyebár nem használunk c++ban

   
glezmen - Törzstag | 381 hsz       Online status #201497   2014.02.21 23:52 GMT+1 óra  
Idézet
Pretender :
Igen, én is rájöttem, hogy levágja. De pont ez-az. Ugye van néhány szám, amit nem tud ábrázolni, és valami olyasmi lesz az eredmény, amit versio írt. Így aztán egy intre vágás után 149 lesz belőle. Nyilván az egyszerű megoldás annyi, hogy cast előtt + 0.5f (nyilván pozitívakra, de én jelen esetben azzal dolgozok)



ez nem pontossag, hanem a kettes szamrendszerbeli szamabrazolas eredmenye.
Rakj bele olyan floatot amit kettes szamrendszerben pontosan lehet abrazolni, es meglesz az

amugy meg minek a static_cast?
   
ddbwo - Tag | 1654 hsz       Online status #201496   2014.02.21 23:51 GMT+1 óra  
Kód:
floor();
round();
A Half-Life 2: Deathmatch promóció megszűnt! [B¤°
Kezdetben volék az üresség. Ám akkor a Struktúrfüggöny megteremté az Urat.
DrunkenDragon* Blackwolf
   
Pretender - Törzstag | 2498 hsz       Online status #201495   2014.02.21 22:50 GMT+1 óra  
Igen, én is rájöttem, hogy levágja. De pont ez-az. Ugye van néhány szám, amit nem tud ábrázolni, és valami olyasmi lesz az eredmény, amit versio írt. Így aztán egy intre vágás után 149 lesz belőle. Nyilván az egyszerű megoldás annyi, hogy cast előtt + 0.5f (nyilván pozitívakra, de én jelen esetben azzal dolgozok)

   
LugaidVandroiy - Törzstag | 504 hsz       Online status #201494   2014.02.21 22:46 GMT+1 óra  
Mivel semmi fele kerekites nem tortenik, levagja a tort reszt. Nincs itt baj a float pontossagaval.

   
versio - Tag | 673 hsz       Online status #201493   2014.02.21 22:39 GMT+1 óra  
szerintem levagja, mert a float azert ennyire nem rossz
149.9999999999999 lehet az eredmeny
   
Pretender - Törzstag | 2498 hsz       Online status #201492   2014.02.21 22:28 GMT+1 óra  
Hehe, imádom azért a float-pontosságot...
Kód:
uint32 base = 100;
uint32 percent = 150;
uint32 result = static_cast<uint32>(base * percent * 0.01f);

Eredmény: result = 149

   
Geri - Törzstag | 2195 hsz       Online status #201235   2014.02.15 22:13 GMT+1 óra  
key[(unsigned char)'Ű']=0;

   
M4 - Tag | 187 hsz       Online status #200944   2014.02.10 08:35 GMT+1 óra  
Javában csak fordításkor ellenőrzi, hogy a generikus típusokkal helyes-e a kód (ha nem helyes, nem fordul). Aztán törlődnek a típus paraméterek (type erasure). Futáskor pl. nem List<Srting> van, hanem csak List. Tehát a generikus osztályból csak egy (paraméternélküli) változat kell futáskor.

   
Pretender - Törzstag | 2498 hsz       Online status #200898   2014.02.08 15:44 GMT+1 óra  
Persze, teljesen máshogy működik a kettő. c++ban nem runtime, hanem compile time tudni kell a típusokat, és a templatet igazából csak "kifejti" az adott típusra (vagy valami ilyesmi )
Java esetén meg valóban runtime dől el a típus, és az adott függvényből egy létezik csak. Persze ez így nem pontos egyik sem, de valami ilyesmi. És így belegondolva, teljesen érthető, hogy a lenti kódrészlet miért működik úgy, ahogy.

   
__z - Tag | 72 hsz       Online status #200897   2014.02.08 14:58 GMT+1 óra  
Én még régebben olvastam valahol néhány cikket, hogy a hasonló szintaktika ellenére elvi különbségek vannak a c++ "template" és a c#/java "generics" között...

   
Pretender - Törzstag | 2498 hsz       Online status #200896   2014.02.08 14:19 GMT+1 óra  
Ja, annyi lehet a hátterében, hogy fordításidőben tényleg tudnia kell, hogy milyen függvényt fog meghívni. Javaban ez fejlettebb, ott ugye nem egy fordításidőben elkészített függvényt fog meghívni, mint a c++ template fgvek esetén. Így viszont teljesen jogos, hogy mindnenképpen a "legkisebb közös többszörös" elvét követi.

   
zeller - Törzstag | 486 hsz       Online status #200894   2014.02.08 11:37 GMT+1 óra  
esetleges extra alternativak winre:
http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows

amugy ami a template-es kerdest illeti, sztem a reason behind the stuff is that template types are non polymorphic. Javaban van KOlbasz<? extends Gyulai> meg Roberto<? super Giorgo> de c++-ban nem lattam meg ilyet.

   
Pretender - Törzstag | 2498 hsz       Online status #200888   2014.02.08 08:50 GMT+1 óra  
Valgrind az linux-only szerintem, ez meg windowsos cucc. A valgrind egyébként jó lenne, a cégnél használtuk, vannak hozzá jópofa pluginek is.
Most ezt az AMD CodeAnalystet használom, ez sem olyan rossz, csak érteni kellene assembly nyelven is.

   
zeller - Törzstag | 486 hsz       Online status #200887   2014.02.08 08:07 GMT+1 óra  
A feladatkezelo altal szolgaltatott informacio teljesen invalid. valgrinddel nem tudod megnezni?

ha auto deklaracioval adsz tipust a ternaris operator kimenetenek, az mi lessz? ezt kerdeztem. de ha korabbi deklaracio, akkor ertelmetlen kerdes.

   
Pretender - Törzstag | 2498 hsz       Online status #200880   2014.02.07 16:44 GMT+1 óra  
@zeller: mi?

Tud valaki egy easy to use profilert? Főleg memóriára lennék most kíváncsi. A windowsos feladatkezelő azt mondja, hogy 80 megát eszik a cucc, de ezt nem tudom elhinni. Főleg, hogy 9-ről 20-ra ugrik néhány kb-nyi adat betöltése után. Meg szeretném mérni, hogy ténylegesen mennyi, mikor változik, stb.

   
zeller - Törzstag | 486 hsz       Online status #200873   2014.02.07 07:19 GMT+1 óra  
suscks. autoval mi lesz? compile error?

   
Pretender - Törzstag | 2498 hsz       Online status #200872   2014.02.07 00:46 GMT+1 óra  
Teljesen jogos egyébként, de nem gond, ifekkel kivédhető, csak így mennyivel szebb lett volna már...

   
Wolfee - Törzstag | 1337 hsz       Online status #200871   2014.02.06 23:29 GMT+1 óra  
Idézet
__z :
Pretender :
Asszem ez a ternáris operátor ("a.empty() ? b : a" ) miatt van, ahol a-nak és b-nek azonos típusúnak kell lennie, mivel a kifejezés egy bizonyos típusú értéket ad vissza, és pl.: függvényben sincs olyan, aminek egy feltételtől függően más típusú a visszatérési értéke (vagy ilyesmi)...


szo tru, kozos tipusra fogja kasztolni a felteteles kifejezes parametereit.
FZoli jóváhagyásával XD

   
__z - Tag | 72 hsz       Online status #200870   2014.02.06 23:10 GMT+1 óra  
Pretender :
Asszem ez a ternáris operátor ("a.empty() ? b : a" ) miatt van, ahol a-nak és b-nek azonos típusúnak kell lennie, mivel a kifejezés egy bizonyos típusú értéket ad vissza, és pl.: függvényben sincs olyan, aminek egy feltételtől függően más típusú a visszatérési értéke (vagy ilyesmi)...

Ezt a hozzászólást __z módosította (2014.02.06 23:19 GMT+1 óra, ---)

   
Pretender - Törzstag | 2498 hsz       Online status #200866   2014.02.06 21:03 GMT+1 óra  
Találtam egy furcsaságot, még nem teljesen értem, hogy miért is van így.
Kód:
struct A
{
};
struct B : public A
{
};
class C
{
public:
    template <typename T>
    void foo(const Array<T>& bigyo)
    {
    }
};

void alma()
{
    Array<A> a;
    Array<B> b;

    foo(a.empty() ? b : a);
}

Valahogy minden esetben a T típus A lesz, hiába üres a, és végül b-t adok át neki.

   
Frissebbek | Korábbi postok
[1] [2] [3] [4] [5] [6] > 7 < [8] [9] [10] [15] [20] [25] [30] [35] [40] [45] [50] [55] [60] [65] [70] [75] [80] [85] [90] [95] [100] [105] [110] [115] [120] [125] [130] [135] [140] [142]