abonnement Unibet Coolblue Bitvavo
pi_115322373
quote:
3s.gif 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.
Dat is inderdaad een onderdeel van de FAQ dat ik graag veranderd zou zien. :P

Muggenziftmodus: je opmerking "Het is een andere taal dat C als subset heeft puur omdat C veelgebruikt is" klopt volgens mij op twee punten niet. Ten eerste is C geen subset van C++ en ten tweede is C++ wel degelijk begonnen als uitbreiding van C ("C with classes") en is het dus niet puur omdat C veelgebruikt is dat C++ erop lijkt en het grotendeels ondersteunt. Het klopt wel dat veel legacy C-onderdelen om die reden aangehouden zijn, maar je 'puur' is volgens mij onwaar.

[ Bericht 0% gewijzigd door GS42 op 09-08-2012 02:06:06 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115327317
Kan zijn, ik heb begin nooit meegemaakt (kom van '84), maar de huidige staat is dat (zo goed als) alles wat in C kan, ook in C++ werkt. Tegelijkertijd doe je liever niet alles wat in C kan letterlijk in C++; in deze zin is het m.i. een subset, maar eigenlijk toch een compleet andere taal.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  donderdag 9 augustus 2012 @ 12:31:18 #243
85514 ralfie
!Yvan eht nioj
pi_115331078
quote:
0s.gif 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?
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.
pi_115333544
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.

De functie:
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;
    }
}

En alle errors zien er (ongeveer) als volgt uit:
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>]()'|

Wat heeft dit te betekenen?
pi_115333704
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.

Let ook op dat je bij iterators geen < (of anderen) wilt gebruiken, alleen maar == en !=.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115333922
quote:
0s.gif 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.
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:
Let ook op dat je bij iterators geen < (of anderen) wilt gebruiken, alleen maar == en !=.
Waarom niet? Doen ze hier ook.
pi_115334734
Volgens mij lijkt dit al meer op wat ik wil. Ik heb nu < en > vermeden, maar krijg nu een infinite loop :? .
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;
}
pi_115334770
quote:
0s.gif Op donderdag 9 augustus 2012 13:48 schreef thenxero het volgende:

Waarom niet? Doen ze hier ook.
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.

In dit geval is het misschien een beetje overdreven (want in je voorbeeld gaat het goed, hoor), maar het is sowieso goed in om een for-loop met iterators altijd de volgende vorm aan te houden:

1
2
3
4
itt const end = s.end();
for (itt i = s.begin(); i != end; ++i) {
    // code
}

Dit is altijd juist.

Je code heeft trouwens nog een subtieler probleem: zodra je een container verandert (met insert(), push_back(), clear() etc.) zijn alle bestaande iterators mogelijk ongeldig en kunnen niet meer veilig gebruikt worden. Na jouw insert() kan je l dus niet meer gebruiken voordat je 'em opnieuw toekent.

Dit maken met iterators is vrij lastig. Misschien kan je beter twee for-loops met indexen gebruiken van de volgende vorm:

1
2
3
for (size_t idx = 0; idx < a.size(); ++idx) {
   // code
}

Als je nu een push_back doet, blijft idx geldig en groeit a.size() automatisch mee.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115334937
Dat ook nog. Wat een drama.... dit bewaar ik voor een regenachtige zondag.
pi_115335140
quote:
10s.gif Op donderdag 9 augustus 2012 14:15 schreef thenxero het volgende:
Dat ook nog. Wat een drama.... dit bewaar ik voor een regenachtige zondag.
Sorry. :) Dat is het grote nadeel van C++: je moet erg veel leren voordat je het een beetje kunt gebruiken.

Er is ook een voordeel: de standard template library bevat veel nuttige code. Bijvoorbeeld valarray. Daarmee kan je gewoon a + b op arrays uitvoeren en dat is volgens mij precies wat jij wilt. Het enige dat je dan nog moet doen, is zorgen dat alle waarden <10 zijn na elke optelling. Een groot deel van goede C++-code schrijven is ook weten wat de STL in de aanbieding heeft.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115335457
Daar ga ik een keer naar kijken. Bedankt!

Op zich heb ik wel veel geleerd van vectors ondertussen (ook de beperkingen ervan), dus ik zie het niet als verspilde tijd.

Mijn doel is gewoon om een beetje handig met C++ te worden, totdat ik genoeg vertrouwen in mezelf heb om een wat groter project te starten. Uiteindelijk wil ik een app maken die de kortste route tussen een paar punten vindt, daar een plaatje van maakt, en dat alles in een mooie GUI die ik gemaakt heb met Qt. Dat plaatje zal ook nog erg lastig worden denk ik.
pi_115343133
quote:
0s.gif Op woensdag 8 augustus 2012 22:58 schreef thenxero het volgende:

Dat is vast niet zo leerzaam als dit geklooi :)
Ik heb altijd een class willen maken voor grote integers.
Wil je mee helpen? :P

Heb je git?
pi_115343311
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)
pi_115344266
quote:
0s.gif 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)
Overflow kan je niet opvangen in C++ en is ook moeilijk te detecteren. Je enige optie is zorgen dat het niet gebeurt.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115344300
quote:
0s.gif 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.
Maar is er ook zo iets als RDX:RAX <- RAX * r/m64?
pi_115345252
quote:
0s.gif Op donderdag 9 augustus 2012 17:53 schreef t4rt4rus het volgende:

[..]

Maar is er ook zo iets als RDX:RAX <- RAX * r/m64?
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.
pi_115346392
quote:
while(!(k==a.rend()) && !(l==b.rend()))
Wat als je vectoren niet even lang zijn?

quote:
if(*k>9 && !(k==b.rend()))
Kan k==b.rend() uberhaupt op dit punt?

quote:
*(++k)++;
Cute, maar nu lopen je iterators niet gelijk en dus..?

quote:
b.insert(b.begin(),1);
b?

Ook is t waar dat dit de iterator invalideert, maar is dat erg in deze toepassing? Afhankelijk van je while conditie wel (in de huidige ook), maar bedenk i.h.a. ook dat insert weer een (valide) iterator teruggeeft.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115346399
quote:
0s.gif 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.
Ja dacht ik al. Nouja kan wel inline asm gebruiken. :D
pi_115348932
quote:
0s.gif 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)
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.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115351112
quote:
0s.gif 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 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.
pi_115352907
quote:
3s.gif 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.
Ik kan natuurlijk ook gewoon u_int64, u_int32 gebruiken etc.
Maar met asm kan ik 128 bit als opslag gebruiken...
pi_115355669
quote:
3s.gif 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.
size_t is ook 64bit.
pi_115358783
quote:
0s.gif 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.
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.
pi_115360511
quote:
0s.gif 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? :P

Heb je git?
Klinkt wel leuk, maar ik weet niet of je veel aan me hebt :P
pi_115360723
quote:
0s.gif 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.
Ja daar zit het probleem dus... :P
pi_115361266
quote:
0s.gif Op donderdag 9 augustus 2012 23:08 schreef t4rt4rus het volgende:

[..]

Ja daar zit het probleem dus... :P
Het punt is dat assembler ook compleet van je architectuur afhangt; dat is als zodanig ook niet echt een oplossing.
Ook is een truc om toch maar 128-bits precisie te gebruiken voor detectie eigenlijk uitstel van executie; wat als je dan toch ook maar met 128-bits waarden wilt gaan werken, als het toch kan? Je blijft bezig.

Ik zou dan ook per applicatie bekijken of overflows daadwerkelijk problemen geven; als je enige operatie een telkens 1 optellen is, dan is een i == static_cast< unsigned int >( -1 ) genoeg om overflow te detecteren. Als het twee ints optellen is, dan hoef je alleen iets speciaals te doen als een van de getallen de 32e meest significante bit heeft gezet. Als je RNGs aan het maken bent en je hebt elk stukje performance nodig, dan kijk je naar Schrage's truc; enzovoorts.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115388507
Kan ik niet gewoon __int128 gebruiken?
pi_115390333
edit:
Het werkt :)

1
2
3
4
5
uint64_t x, y;
unsigned __int128 z;

x = y = 0xffffffffffffffff;
z = static_cast<unsigned __int128>(x) * y;
pi_115391921
Sure, maar het is niet ANSI en het blijft uitstel van executie in de zin van hierboven.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115394428
quote:
2s.gif 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.
Ja ik weet dat het geen ISO is.

Dus dan moet ik maar uint32_t en uint64_t gebruiken.
En dan met ifdef gaan werken.

Of is er een andere mogelijk om de grootste integer te krijgen en een integer die 2 keer zo klein is.
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')