Dat is inderdaad een onderdeel van de FAQ dat ik graag veranderd zou zien.quote:Op donderdag 9 augustus 2012 01:45 schreef trancethrust het volgende:
[..]
Goed punt, en niet dat alleen; de beschrijving van C++ (een 'verbetering' op C) slaat ook de plank volledig mis. Het is een andere taal dat C als subset heeft puur omdat C veelgebruikt is. Tegenwoordige tijd. C is nog altijd populair in bij high-performance toepassingen.
Ik zou het niet in c++ doen. De ratio werk/profijt is erg laag. Ga liever werken in visualbasic of C# (windows only) , Javascript (kan prima wat jij wil), Java (klotetaal, maar goed crossplatform te krijgen). c++ is handig als je echt programmeren wil leren of als je zeer geavanceerde technieken wil gebruiken of veel snelheid nodig hebt. Anders mijns inziens zonde van je tijd.quote:Op woensdag 8 augustus 2012 23:56 schreef Carlos93 het volgende:
Hallo,
Ik loop al een tijd met een idee om een programma te maken in c++. Ik weet echter niet of het haalbaar is in c++. Het gaat erom dat het veel informatie van Google en social media moet weten te plukken, het te organiseren en er ook grote hoeveelheden weer kan uploaden naar de dit soort sites.
In hoeverre is dit mogelijk in c++ of raden jullie me voor dit soort toepassingen een andere programmeertaal aan?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | void add(vector<int>& a, vector<int>& b) { vector<int>::iterator k; vector<int>::iterator l; for(k=b.rbegin(); k<b.rend(); ++k) { for(l=a.rbegin(); l<a.rend(); ++l) { *k+=*l; if(*k>9 && !(*k==b.rend())) { *k%=10; *(--k)-=1; } else if(*k>9 && *k==b.rend()) { a.insert(a.begin(),1); } if(l==a.rbegin()) break; } if(k==b.rbegin) break; } } |
| 1 2 3 | C:\Documents and Settings\...\C++\test\main.cpp|10|error: no match for 'operator=' in 'k = std::vector<_Tp, _Alloc>::rbegin() [with _Tp = int, _Alloc = std::allocator<int>]()'| |
Ah, dat eerste scheelt alweer een hoop errors. Heb nu geen errors meer maar het antwoord lijkt nergens op. Maar dat is logisch, heb er een rommeltje van gemaakt.quote:Op donderdag 9 augustus 2012 13:42 schreef GS42 het volgende:
De functies rbegin() en rend() leveren reverse_iterators op. Als je deze werkelijk wilt, dan moet je de declaraties van k en l veranderen van iterators naar reverse_iterators.
De fout zegt dat de compiler geen operator= kan vinden die een reverse_iterator aan een iterator-type toe kan kennen, wat natuurlijk klopt.
Waarom niet? Doen ze hier ook.quote:Let ook op dat je bij iterators geen < (of anderen) wilt gebruiken, alleen maar == en !=.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void add(vector<int>& a, vector<int>& b) { vector<int>::reverse_iterator k; vector<int>::reverse_iterator l; k=a.rbegin(); l=b.rbegin(); while(!(k==a.rend()) && !(l==b.rend())) *k+=*l; if(*k>9 && !(k==b.rend())) { *k-=10; *(++k)++; } else if(*k>9 && k==b.rend()) { b.insert(b.begin(),1); } ++k; ++l; } |
Er zijn verschillende soorten iterators en ze ondersteunen niet allemaal dezelfde operaties. Omdat iterators vaak gebruikt worden om algemene dingen te doen (bijvoorbeeld: nieuwe elementen toevoegen aan een willekeurige container) is het het beste om jezelf aan te leren de meest algemene vorm te gebruiken, zodat je later geen rare problemen krijgt.quote:
| 1 2 3 4 | itt const end = s.end(); for (itt i = s.begin(); i != end; ++i) { // code } |
| 1 2 3 | for (size_t idx = 0; idx < a.size(); ++idx) { // code } |
Sorry.quote:Op donderdag 9 augustus 2012 14:15 schreef thenxero het volgende:
Dat ook nog. Wat een drama.... dit bewaar ik voor een regenachtige zondag.
Ik heb altijd een class willen maken voor grote integers.quote:Op woensdag 8 augustus 2012 22:58 schreef thenxero het volgende:
Dat is vast niet zo leerzaam als dit geklooi
Overflow kan je niet opvangen in C++ en is ook moeilijk te detecteren. Je enige optie is zorgen dat het niet gebeurt.quote:Op donderdag 9 augustus 2012 17:23 schreef t4rt4rus het volgende:
Weet iemand hoe de overflow kan opvangen met C++?
In amd64 kan je gewoon 2 registers gebruiken op resultaat op te slaan.
Je kan het natuurlijk met een int en long int doen, maar long int hoeft niet groter te zijn dan int.
(long long ook niet)
Maar is er ook zo iets als RDX:RAX <- RAX * r/m64?quote:Op donderdag 9 augustus 2012 17:52 schreef GS42 het volgende:
[..]
Overflow kan je niet opvangen in C++ en is ook moeilijk te detecteren. Je enige optie is zorgen dat het niet gebeurt.
Dat is natuurlijk heel erg processor-afhankelijk, dus het lijkt me sterk dat zoiets native in een taal als C++ zit. Als je een echt efficiënte library voor grote getallen wilt maken, zul je sowieso veel assembly code erbij moeten doen.quote:Op donderdag 9 augustus 2012 17:53 schreef t4rt4rus het volgende:
[..]
Maar is er ook zo iets als RDX:RAX <- RAX * r/m64?
Wat als je vectoren niet even lang zijn?quote:while(!(k==a.rend()) && !(l==b.rend()))
Kan k==b.rend() uberhaupt op dit punt?quote:if(*k>9 && !(k==b.rend()))
Cute, maar nu lopen je iterators niet gelijk en dus..?quote:*(++k)++;
b?quote:b.insert(b.begin(),1);
Ja dacht ik al. Nouja kan wel inline asm gebruiken.quote:Op donderdag 9 augustus 2012 18:29 schreef thabit het volgende:
[..]
Dat is natuurlijk heel erg processor-afhankelijk, dus het lijkt me sterk dat zoiets native in een taal als C++ zit. Als je een echt efficiënte library voor grote getallen wilt maken, zul je sowieso veel assembly code erbij moeten doen.
Alleen als een gewone int al 64-bits is. Het is een beetje vreemd dat je richting intrinsics/assembler gaat omdat je rekening wilt houden met zo'n (currently) outlandish mogelijkheid.quote:Op donderdag 9 augustus 2012 17:23 schreef t4rt4rus het volgende:
Weet iemand hoe de overflow kan opvangen met C++?
In amd64 kan je gewoon 2 registers gebruiken op resultaat op te slaan.
Je kan het natuurlijk met een int en long int doen, maar long int hoeft niet groter te zijn dan int.
(long long ook niet)
Ik zou de vector::resize method gebruiken om de vectoren groot genoeg te maken. Dat scheelt je weer wat if statements waardoor je code eenvoudiger wordt en je minder snel bugs krijgt.quote:Op donderdag 9 augustus 2012 13:38 schreef thenxero het volgende:
Een nieuwe poging vectors bij elkaar op te tellen alsof het getallen zijn. Dus bijvoorbeeld, als
a = {9, 8, 6, 4}
b = {9, 6, 7}
Dan wil ik dat de functie add(a,b) ervoor zorgt dat b = {1, 0, 8, 3, 1}. De functie moet in ieder geval werken voor vectors b die minstens even lang zijn als a. De moeilijkheid zit hem in de verschillende lengtes van de vector. Volgens mij is dit de beste methode om daarmee om te gaan, alleen krijg ik nog wat errors waar ik geen touw aan vast kan knopen.
Ik kan natuurlijk ook gewoon u_int64, u_int32 gebruiken etc.quote:Op donderdag 9 augustus 2012 20:10 schreef trancethrust het volgende:
[..]
Alleen als een gewone int al 64-bits is. Het is een beetje vreemd dat je richting intrinsics/assembler gaat omdat je rekening wilt houden met zo'n (currently) outlandish mogelijkheid.
Net even gechecked en int is 32bit, long en long long zijn 64bit.quote:Op donderdag 9 augustus 2012 20:10 schreef trancethrust het volgende:
[..]
Alleen als een gewone int al 64-bits is. Het is een beetje vreemd dat je richting intrinsics/assembler gaat omdat je rekening wilt houden met zo'n (currently) outlandish mogelijkheid.
Dat hangt helemaal van je architectuur af. Zou je dit soort dingen ook echt aannemen in je code, dan kunnen andere mensen het dus niet gebruiken.quote:Op donderdag 9 augustus 2012 21:57 schreef t4rt4rus het volgende:
[..]
Net even gechecked en int is 32bit, long en long long zijn 64bit.
size_t is ook 64bit.
Klinkt wel leuk, maar ik weet niet of je veel aan me hebtquote:Op donderdag 9 augustus 2012 17:17 schreef t4rt4rus het volgende:
[..]
Ik heb altijd een class willen maken voor grote integers.
Wil je mee helpen?
Heb je git?
Ja daar zit het probleem dus...quote:Op donderdag 9 augustus 2012 22:34 schreef thabit het volgende:
[..]
Dat hangt helemaal van je architectuur af. Zou je dit soort dingen ook echt aannemen in je code, dan kunnen andere mensen het dus niet gebruiken.
Het punt is dat assembler ook compleet van je architectuur afhangt; dat is als zodanig ook niet echt een oplossing.quote:Op donderdag 9 augustus 2012 23:08 schreef t4rt4rus het volgende:
[..]
Ja daar zit het probleem dus...
| 1 2 3 4 5 | uint64_t x, y; unsigned __int128 z; x = y = 0xffffffffffffffff; z = static_cast<unsigned __int128>(x) * y; |
Ja ik weet dat het geen ISO is.quote:Op vrijdag 10 augustus 2012 19:41 schreef trancethrust het volgende:
Sure, maar het is niet ANSI en het blijft uitstel van executie in de zin van hierboven.
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |