FOK!forum / Digital Corner / [C(++)] voor dummies - Deel 4
FastFox91maandag 12 maart 2012 @ 18:57
C+for+Dummies.jpgC%2B%2B+for+Dummies+book+cover.JPG
Nu mét gratis web-support!

Als je vragen hebt over C of C++, dan zit je hier goed met een (hopelijk later grote) kliek guru's.
Beperk je vragen niet tot "hij doet het niet" of "hij geeft een fout" - onze glazen bol is kapot en we willen graag van je weten wát er niet lukt en wélke foutmelding je precies krijgt. ;)

En onthoud: lieve modjes maken dit topic centraal! O+

Vorige delen:
[C(++)] voor dummies - Deel 1
[C(++)] voor dummies - Deel 2
[C(++)] voor dummies - Deel 3
[C(++)] voor dummies - Deel 4

:? FAQ :?

:? Ik wil beginnen met C/C++, wat voor IDE is het beste voor mij?
Dat ligt eraan. Als je alléén voor MS Windows wilt gaan developen, is Visual Studio de beste optie. Deze kun je bovendien als je student bent via Microsoft DreamSpark of MSDN Academic Alliance gratis downloaden. :)
Wil je echter cross-platform (dat wil zeggen: voor b.v. Windows én Linux, of Linux én Mac) gaan developen, dan zijn Dev-C++ en Code::Blocks de beste optie voor C++. Eclipse (ook voor C) en NetBeans zijn ook goede keuzes, alleen zijn deze meer op Java gericht. Een ander IDE, van Nokia's hand, is Qt Creator. Dit IDE maakt gebruik van het Qt-framework, een set van functies, types, variabelen etc. om programmeren makkelijker te maken. Dit framework is cross-platform. :)

:? Hoe gebruik ik x/wat houdt y in?
Stop! Voor vragen hoe je bepaalde ingebouwde functies, types of classes gebruikt kun je de C referentie of de C++ referentie gebruiken. Hier staat alles in wat je nodig hebt. :)

:? Wat is het verschil tussen C en C++?
C++ is, eenvoudig gezegd, een nieuwere versie van C (vandaar ook de naam, C++ wil zeggen: verhoog de waarde van C met 1). Het biedt onder andere betere klasse-ondersteuning en verschillende nieuwe types, zoals vectors en maps, om er maar een paar te noemen.
Als je wilt beginnen met leren, is C++ beter, want C wordt eigenlijk niet vaak meer gebruikt.

:? Wat is het Windows SDK?
Het Windows SDK is een set van functies, gemaakt door Microsoft, om het programmeren voor Windows te vereenvoudigen.
Als je ervoor kiest het Windows SDK te gebruiken, houd er dan rekening mee dat je applicatie Windows-only wordt!
Je kunt de laatste versie hier vinden ter download. :)

Handige links:

Referenties en tutorials:
Leer C en/of C++ (engels)
Leer programmeren met het Windows SDK (engels)
Info over het Windows SDK (engels)

Deze OP vind je hier.

[ Bericht 1% gewijzigd door FastFox91 op 12-03-2012 19:12:02 ]
FastFox91maandag 12 maart 2012 @ 18:58
Laatste berichten van het vorige topic:
quote:
0s.gif Op maandag 12 maart 2012 18:24 schreef Computerfluisteraar het volgende:

[..]

Is dit de beste IDE of zijn er nog meer die geschikt zijn?
quote:
0s.gif Op maandag 12 maart 2012 18:56 schreef FastFox91 het volgende:

[..]

Qt is niet alleen een IDE, maar ook een UI cross-platform framework. http://qt.nokia.com/products/


[ Bericht 7% gewijzigd door FastFox91 op 12-03-2012 19:20:22 ]
FastFox91maandag 12 maart 2012 @ 19:01
quote:
0s.gif Op maandag 12 maart 2012 18:22 schreef thabit het volgende:

[..]

Die parameters worden direct aan main() gevoerd. Ik zie niet waarom je allerlei vage libraries daarvoor nodig zou hebben.
1
2
3
4
5
6
7
8
9
10
while( ( opt = getopt( argc, argv, "f:s" ) ) != -1 ) {
    switch( opt ) { 
        case f':  // input file
            // iets
            break;
        case 's':
            // iets
            break;
     }
}
Wat moet ik dan aanpassen zodat ik niet meer -s moet doen maar -scan? In dat 'case' stukje is het gewoon s -> scan, maar hoe pas ik het aan in de getopt functie?

Of bedoel je dat ik sowieso geen getopt moet gebruiken?
GS42dinsdag 13 maart 2012 @ 15:47
quote:
0s.gif Op maandag 12 maart 2012 19:01 schreef FastFox91 het volgende:

[..]
[ code verwijderd ]

Wat moet ik dan aanpassen zodat ik niet meer -s moet doen maar -scan? In dat 'case' stukje is het gewoon s -> scan, maar hoe pas ik het aan in de getopt functie?
Als je 's' naar "scan" verandert, krijg je hier een compileerfout omdat opt (in de switch) een character is. Ik denk dat je het beste getopt_long (de eerste google-hit...) kunt gebruiken.
FastFox91dinsdag 13 maart 2012 @ 15:51
quote:
0s.gif Op dinsdag 13 maart 2012 15:47 schreef GS42 het volgende:

[..]

Als je 's' naar "scan" verandert, krijg je hier een compileerfout omdat opt (in de switch) een character is. Ik denk dat je het beste getopt_long (de eerste google-hit...) kunt gebruiken.
Dat snap ik, en die getopt_long had ik ook gevonden, maar thabit zegt dat het niet nodig is om andere libraries te gebruiken.
thabitdinsdag 13 maart 2012 @ 15:52
quote:
0s.gif Op maandag 12 maart 2012 19:01 schreef FastFox91 het volgende:

[..]
[ code verwijderd ]

Wat moet ik dan aanpassen zodat ik niet meer -s moet doen maar -scan? In dat 'case' stukje is het gewoon s -> scan, maar hoe pas ik het aan in de getopt functie?

Of bedoel je dat ik sowieso geen getopt moet gebruiken?
Iets als getopt heb je niet echt nodig. Het lijkt er vooral op dat dat gemaakt is om een soort standaard voor command line opties te definiëren. Maar je kan net zo makkelijk, zo niet makkelijker, met de hand de opties parsen.
GS42dinsdag 13 maart 2012 @ 15:53
quote:
0s.gif Op vrijdag 9 maart 2012 10:05 schreef netolk het volgende:
Klopt het dat std::thread nog niet werkt voor g++ onder windows?
Oh, daar had ik nog helemaal niet aan gedacht. Nee, MinGW zal de threads nog wel niet ondersteunen omdat dit een hele nieuwe aanpak van de compiler vereist. MinGW heeft altijd geprobeerd standaard C(++) te ondersteunen, maar heeft altijd gezegd POSIX-dingen (zoals file system en threads) te laten voor wat het is en dus niet te ondersteunen.

Nu C++ zelf threads ondersteunt, moeten ze hier wel iets mee. Ik denk dat het nog wel even kan duren voordat MinGW iets met threads doet.
GS42dinsdag 13 maart 2012 @ 15:56
quote:
0s.gif Op dinsdag 13 maart 2012 15:51 schreef FastFox91 het volgende:

[..]

Dat snap ik, en die getopt_long had ik ook gevonden, maar thabit zegt dat het niet nodig is om andere libraries te gebruiken.
Het is niet nodig, nee. Zoals je waarschijnlijk weet, kan je de command-line argumenten lezen via de eerste en tweede parameter van de main(). Maar dat betekent dat je ze wel zelf moet parsen. Dit is niet heel veel werk, maar ook werk dat je prima uit handen kunt geven. Gewoon doen wat je zelf het gemakkelijkste vindt werken, zou ik zeggen.
GS42dinsdag 13 maart 2012 @ 16:19
quote:
5s.gif Op vrijdag 9 maart 2012 08:21 schreef Computerfluisteraar het volgende:
Een vraagje aan de mensen met verstand van C++:

Ik wil leren ontwikkelen in C++. Hoe zijn jullie begonnen? En kan ik C++ applicaties werkende krijgen op Linux én Windows?
Ik ben begonnen met een flinke cursus van een half jaar lang, zeker 8 uur per week. Daarvoor had ik met andere programmeer- en scripttalen gewerkt. C++ is aan de ene kant een goede taal om mee te beginnen omdat het een redelijk consistente en bekende taal is, maar aan de andere kant ook een lastige, vooral omdat het zo groot is.

Als je het echt wilt leren, raad ik aan om een paar goede boeken uit de winkel of de bieb te halen en geen tijd verspillen met online lesprogramma's of dergelijke. Vrijwel alle online C++-cursussen die ik heb gezien, bevatten flinke fouten. Zie bijvoorbeeld Stroustrups suggesties. Zijn eigen boek, Principles and Practice Using C++, is ook aan te raden.

Bovendien raad ik aan om geen IDE te gebruiken terwijl je C++ leert. Deze verstopt namelijk veel van wat er nu eigenlijk gebeurt, waardoor je leert werken met een programma en niet met C++. Als je wilt, kan je later natuurlijk overstappen. (Let op, ik ben wel lichtelijk bevooroordeeld omdat ik een hekel heb aan IDE's.)

En als laatste: Ja, je kunt programma's werkend krijgen voor Windows en Linux. Simpele programma's die alleen standaard C++ gebruiken, zullen sowieso op elk besturingsysteem werken. Als je ingewikkelder dingen wilt, zoals werken met een GUI of het filesystem, dan wordt het wat lastiger en ben je meestal afhankelijk van externe libraries, zoals Qt of Boost. Hiermee kan je prima werken, maar alles naar je zin maken is soms lastig. Vergelijk het met (ingewikkelde) HTML schrijven die er in elke browser hetzelfde uitziet: het kan wel maar is soms een hoop geknoei.
GS42dinsdag 13 maart 2012 @ 16:43
quote:
0s.gif Op vrijdag 9 maart 2012 08:13 schreef netolk het volgende:

[..]

maar dit stukje code blijft wel een error geven:
[ code verwijderd ]

dan geeft ie dus de volgende error:
[ code verwijderd ]

De code die je post, geeft bij mij andere compileerfouten. Zou je een minimaal voorbeeld kunnen geven - met een main() - die jouw compileerfout geeft?

De foutmelding impliceert dat je een verkeerde toekenning doet, zoals
1int() = 23;
Hierbij ken je een waarde toe aan een anonieme variabele (wat natuurlijk niet kan).
netolkdinsdag 13 maart 2012 @ 20:36
quote:
0s.gif Op dinsdag 13 maart 2012 16:43 schreef GS42 het volgende:

[..]

De code die je post, geeft bij mij andere compileerfouten. Zou je een minimaal voorbeeld kunnen geven - met een main() - die jouw compileerfout geeft?

De foutmelding impliceert dat je een verkeerde toekenning doet, zoals
[ code verwijderd ]

Hierbij ken je een waarde toe aan een anonieme variabele (wat natuurlijk niet kan).
Dat bleek het idd te zijn, na veel zoeken (en in back-ups kijken) bleek dat er inderdaad ergens een & was verdwenen...

Das dan wel het kutte aan die nieuwe compiler:
1
2
error: new declaration 'long unsigned int Threader_Key(void*)' 
error: ambiguates old declaration 'long unsigned int Threader_Key(void*)'
Kan nu dus geen Threads meer maken omdat de "ambiguates old declaration" niet meer ondersteund word maar de std::Thread ook nog steeds niet...
Ai_KaRaMBawoensdag 14 maart 2012 @ 14:50
Ik ben het wel met de compiler eens: ik vind 'long unsigned int' ook een raar datatype. Waarom kies je niet voor int of long (al dan niet unsigned)?

Volgens mij is "long int" echt al heul lang depricated?

(edit: los daarvan heb ik geen idee of dat ook daadwerkelijk jouw compileer probleem is)

edit2: Volgens http://en.wikipedia.org/wiki/C_data_types is het "unsigned long int" en niet "long unsigned int"
GS42woensdag 14 maart 2012 @ 16:03
quote:
15s.gif Op woensdag 14 maart 2012 14:50 schreef Ai_KaRaMBa het volgende:
Ik ben het wel met de compiler eens: ik vind 'long unsigned int' ook een raar datatype. Waarom kies je niet voor int of long (al dan niet unsigned)?

Volgens mij is "long int" echt al heul lang depricated?

(edit: los daarvan heb ik geen idee of dat ook daadwerkelijk jouw compileer probleem is)

edit2: Volgens http://en.wikipedia.org/wiki/C_data_types is het "unsigned long int" en niet "long unsigned int"
'long' is een verkorte vorm van 'long int', net zoals 'short' een korte naam is voor 'short int'. Ze zijn dus hetzelfde. Ook de volgorde van de signed/unsigned of eventuele cv-qualifiers heeft veel vrijheid. Zo mag het volgende:

1long int signed volatile long const x = 0;

(Wie weet (a) welk fundamenteel datatype dit is en (b) waarom deze declaratie qua betekenis raar is?)

Dus een 'long unsigned int' is precies hetzelfde als een 'unsigned long'.
netolkwoensdag 14 maart 2012 @ 17:04
quote:
0s.gif Op woensdag 14 maart 2012 16:03 schreef GS42 het volgende:

[..]

'long' is een verkorte vorm van 'long int', net zoals 'short' een korte naam is voor 'short int'. Ze zijn dus hetzelfde. Ook de volgorde van de signed/unsigned of eventuele cv-qualifiers heeft veel vrijheid. Zo mag het volgende:
[ code verwijderd ]

(Wie weet (a) welk fundamenteel datatype dit is en (b) waarom deze declaratie qua betekenis raar is?)

Dus een 'long unsigned int' is precies hetzelfde als een 'unsigned long'.
a) Ik weet niet precies wat volatile doet, maar ik zou zeggen dat je een constante integer hebt die zowel positief als negatief kan zijn (signed) en de grootte van long long heeft (en als waarde 0)
b) Ik weet niet precies wat volatile doet, dus geen idee
FastFox91woensdag 14 maart 2012 @ 17:21
Bedankt voor de reacties GS42 en thabit.
thabitwoensdag 14 maart 2012 @ 17:34
quote:
0s.gif Op woensdag 14 maart 2012 17:04 schreef netolk het volgende:

[..]

a) Ik weet niet precies wat volatile doet, maar ik zou zeggen dat je een constante integer hebt die zowel positief als negatief kan zijn (signed) en de grootte van long long heeft (en als waarde 0)
b) Ik weet niet precies wat volatile doet, dus geen idee
Volatile wil zeggen dat de waarde van de variabele door een extern proces veranderd kan worden en dat de compiler bij het optimaliseren daar dus rekening mee moet houden.
netolkwoensdag 14 maart 2012 @ 23:01
quote:
0s.gif Op woensdag 14 maart 2012 17:34 schreef thabit het volgende:

[..]

Volatile wil zeggen dat de waarde van de variabele door een extern proces veranderd kan worden en dat de compiler bij het optimaliseren daar dus rekening mee moet houden.
ahh, dan is het rare dat het veranderd kan worden terwijl het een const is
GS42woensdag 14 maart 2012 @ 23:24
quote:
0s.gif Op woensdag 14 maart 2012 17:04 schreef netolk het volgende:

a) Ik weet niet precies wat volatile doet, maar ik zou zeggen dat je een constante integer hebt die zowel positief als negatief kan zijn (signed) en de grootte van long long heeft (en als waarde 0)
Het datatype is inderdaad 'long long int', wat jij volgens mij ook zegt hierboven. De 'int' is overbodig en mag dus weggelaten worden. Dit geldt ook voor de 'signed': dit is immers standaard zo.

quote:
0s.gif Op woensdag 14 maart 2012 23:01 schreef netolk het volgende:

ahh, dan is het rare dat het veranderd kan worden terwijl het een const is
:Y En dat klopt ook: een variabele zowel const als volatile declareren is vreemd omdat de termen elkaar tegenspreken. Toch kan het zo zijn dat je aan wilt geven dat jouw programma de waarde niet mag veranderen terwijl een extern proces de waarde wel kan veranderen; daarom keurt de compiler het wel goed.
netolkdonderdag 15 maart 2012 @ 17:19
quote:
0s.gif Op woensdag 14 maart 2012 23:24 schreef GS42 het volgende:

[..]

Het datatype is inderdaad 'long long int', wat jij volgens mij ook zegt hierboven. De 'int' is overbodig en mag dus weggelaten worden. Dit geldt ook voor de 'signed': dit is immers standaard zo.

[..]

:Y En dat klopt ook: een variabele zowel const als volatile declareren is vreemd omdat de termen elkaar tegenspreken. Toch kan het zo zijn dat je aan wilt geven dat jouw programma de waarde niet mag veranderen terwijl een extern proces de waarde wel kan veranderen; daarom keurt de compiler het wel goed.
*O* *G* *O*
thabitdonderdag 15 maart 2012 @ 17:34
quote:
0s.gif Op woensdag 14 maart 2012 23:24 schreef GS42 het volgende:

[..]

Het datatype is inderdaad 'long long int', wat jij volgens mij ook zegt hierboven. De 'int' is overbodig en mag dus weggelaten worden. Dit geldt ook voor de 'signed': dit is immers standaard zo.
Is het niet sowieso veel handiger om types als int64_t te gebruiken als je expliciet het aantal bits wilt benoemen?
netolkdonderdag 15 maart 2012 @ 17:39
quote:
0s.gif Op donderdag 15 maart 2012 17:34 schreef thabit het volgende:

[..]

Is het niet sowieso veel handiger om types als int64_t te gebruiken als je expliciet het aantal bits wilt benoemen?
Ja, misschien wel....
maar dat doet me aan typedefs denken die door Windows bedacht zijn en dat idee staat me gewoon tegen
Trollface.donderdag 15 maart 2012 @ 19:52
quote:
0s.gif Op donderdag 15 maart 2012 17:34 schreef thabit het volgende:

[..]

Is het niet sowieso veel handiger om types als int64_t te gebruiken als je expliciet het aantal bits wilt benoemen?
Dit dus, in dit geval komt stdint.h/cstdint erg goed van pas.

De OP is iets bijgewerkt, tevens.
GS42vrijdag 16 maart 2012 @ 12:50
quote:
0s.gif Op donderdag 15 maart 2012 17:34 schreef thabit het volgende:

[..]

Is het niet sowieso veel handiger om types als int64_t te gebruiken als je expliciet het aantal bits wilt benoemen?
Ja, als je precies dat aantal bits nodig hebt, is het handiger om die typedefs te gebruiken. Volgens mij zitten deze types echter niet in de standaard en kunnen ze dus problemen opleveren voor andere compilers.

Daarnaast zijn die typedefs ook alleen handig wanneer je een precies aantal bits nodig hebt. Voor de meeste toepassingen is dat echter niet nodig en kan je beter de standaard types gebruiken - omdat deze standaard zijn en mogelijk beter geoptimaliseerd kunnen worden.
FastFox91vrijdag 16 maart 2012 @ 14:22
quote:
14s.gif Op donderdag 15 maart 2012 19:52 schreef Trollface. het volgende:
De OP is iets bijgewerkt, tevens.
De "vorige delen" alinea mag er ook uit nu het een reeks is.
Dale.maandag 16 april 2012 @ 02:24
Vraagje... heb zelf niet C / C++ op m'n computer atm dus weet niet hoe het compileert...

Maaar hoe gaat C en C++ (eventueel C++11) om met
- a[-1] met negatieve constante index dus? (retouneert het een error bij het compileren? ofzo)
- a[i] met i een negatieve integer?
thabitmaandag 16 april 2012 @ 09:30
quote:
7s.gif Op maandag 16 april 2012 02:24 schreef Dale. het volgende:
Vraagje... heb zelf niet C / C++ op m'n computer atm dus weet niet hoe het compileert...

Maaar hoe gaat C en C++ (eventueel C++11) om met
- a[-1] met negatieve constante index dus? (retouneert het een error bij het compileren? ofzo)
- a[i] met i een negatieve integer?
Dat kan gewoon. a[i] is in principe syntactic sugar voor *(a + i).
Ai_KaRaMBamaandag 16 april 2012 @ 12:00
Negatieve array index is inderdaad geen probleem (en hoewel wat tricky, soms zelfs handig!)

Sterker nog, doordat het (zoals thabit al zij) gewoon syntactic suger voor rekenen met pointers is, is zelfs -1[a] geldige C syntax :)
netolkmaandag 16 april 2012 @ 12:33
quote:
7s.gif Op maandag 16 april 2012 02:24 schreef Dale. het volgende:
Vraagje... heb zelf niet C / C++ op m'n computer atm dus weet niet hoe het compileert...

Maaar hoe gaat C en C++ (eventueel C++11) om met
- a[-1] met negatieve constante index dus? (retouneert het een error bij het compileren? ofzo)
- a[i] met i een negatieve integer?
bij mij is a[-1] het zelfde als het laatste element van a
Ai_KaRaMBamaandag 16 april 2012 @ 12:55
Uhm, nee? lijkt me dat a[-1] het element voor a[0] terug geeft?

Mogelijk als a niet een array van een primitief type is en het datatype de [] heeft geimplementeerd, dan zou het misschien wel kunnen dat a[-1] iets anders doet, maar in "normaal" C geeft a[-1] niet het laatste element!
netolkmaandag 16 april 2012 @ 13:02
quote:
15s.gif Op maandag 16 april 2012 12:55 schreef Ai_KaRaMBa het volgende:
Uhm, nee? lijkt me dat a[-1] het element voor a[0] terug geeft?

Mogelijk als a niet een array van een primitief type is en het datatype de [] heeft geimplementeerd, dan zou het misschien wel kunnen dat a[-1] iets anders doet, maar in "normaal" C geeft a[-1] niet het laatste element!
nope bij bij doet (of deed in mn oude compiler) int a[10], dan is a[-1] = a[9]

EDIT: idd even met mn "nieuwe" compiler gecheckt en nu is: a[-1] != a[9] evenals a[10] != a[0] wat bij mijn oude compiler dus ook het geval was

[ Bericht 9% gewijzigd door netolk op 16-04-2012 13:08:41 ]
Ai_KaRaMBamaandag 16 april 2012 @ 13:09
Serieus??? Welke compiler?

En iets als dit dan?

1
2
3
4
int a[10] = {0};
int *b = &a[1];
b[-1] = 0xCAFE;
printf("%X %X", a[0], a[9]);

Edit: uit jouw edit lijkt het alsof de compiler bij bekende array-grootte een extra modulo operatie invoegt? Dat lijkt mij zeer onwenselijk eigenlijk!!
netolkmaandag 16 april 2012 @ 13:14
MinGW versie 3.x volgens mij maar die versie weet ik niet zeker nu heb ik 5.x en die doet dat idd niet
GS42maandag 16 april 2012 @ 15:47
Een goede C++ compiler zou niet mogen doen wat netolk beschrijft. De standaard beschrijft precies wat er gebeurt bij array-indexering:
quote:
8.3.4.6:
Except where it has been declared for a class (13.5.5), the subscript operator [] is interpreted in such a way that E1[E2] is identical to *((E1)+(E2)).
Dus, zoals al is gezegd, is a[i] gelijk aan *(a + i) en hier mag de compiler niets aan veranderen. Met een negatieve i zou dit vrijwel altijd betekenen dat je uit je array loopt, wat resulteert in ongedefinieerd gedrag en dus gevaarlijk is. Als je echter midden in een array zit, kan een negatieve index geldig zijn.

Zoals ook al gezegd is, geldt dit natuurlijk alleen voor array-types. Als het een klasse betreft met een overloaded operator[](), gaan andere regels op.

Als laatste opmerking, sommige implementaties slaan de grootte van een dynamisch gealloceerde array op in positie array[-1]. (De grootte van een dynamisch gealloceerde array moet immers ergens opgeslagen worden, zodat delete[] weet hoeveel waardes verwijderd moeten worden.) Dus het zou kunnen zijn dat:

1
2
3
4
5
int const size = 42;
int *arr = new int[size];
if (arr[-1] == size) {
   // Compiler slaat array-grootte voor array op
}

Nogmaals, dit voorbeeld is dus geen goede C++ code omdat het gedrag per compiler kan (en zal) verschillen. Het programma kan zelfs prima crashen, als het toevallig uit verboden geheugen leest.
netolkdonderdag 7 juni 2012 @ 17:21
zou iemand mij kunnen helpen met threads in c++?
ik gebruik de mingw compiler (weet eerlijk gezegd niet welke versie dacht 5.x oid)

Ik heb een thread nodig om toets aanslagen af te kunnen vangen (onder windows) vroeger kon ik met deze code volstaan:
SPOILER
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
class Key{
            void *_HANDLE;
            bool _KEY_PRESSED[256];
            
            void Start_Thread(); // Thread.cpp
            void Stop_Thread(); // Thread.cpp
            friend unsigned long Threader_Key(void *Data);
            public:
                
                Key(){Start_Thread();}
                ~Key()throw(){Stop_Thread();}
                
                // operators ed moeten nog
                bool operator[](const unsigned char &n){return _KEY_PRESSED[n];}
                
        };

unsigned long WINAPI Threader_Key(void *Data){
    Key *myKey = reinterpret_cast<Key*>(Data);
    
    HANDLE hStdin;
    DWORD cNumRead,fdwMode,fdwSaveOldMode;
    INPUT_RECORD irInBuf[128];
    unsigned count=0;
    
    // get the standard input handle
    hStdin = GetStdHandle(STD_INPUT_HANDLE);
    if(hStdin == INVALID_HANDLE_VALUE)
        throw Error("GetStdHandle");
    
    // save the current input mode, to be restored on exit
    if(!GetConsoleMode(hStdin, &fdwSaveOldMode))
        throw Error("GetConsoleMode");
    
    fdwMode = ENABLE_WINDOW_INPUT /*| ENABLE_MOUSE_INPUT*/;
    if(!SetConsoleMode(hStdin,fdwMode))
        throw Error("SetConsoleMode");
    
    // loop to read and handle the input events
    while(true){
        // wait for events
        if(!ReadConsoleInput(hStdin,irInBuf,128,&cNumRead))
            throw Error("ReadConsoleInput");
        
        //dispatch the events to the appropriate handler.
        for(unsigned i=0; i < cNumRead;i++){
            switch(irInBuf[i].EventType){
                case KEY_EVENT:
                    if(irInBuf[i].Event.KeyEvent.bKeyDown)
                        myKey->_KEY_PRESSED[irInBuf[i].Event.KeyEvent.wVirtualKeyCode] = true;
                    else
                        myKey->_KEY_PRESSED[irInBuf[i].Event.KeyEvent.wVirtualKeyCode] = false;
                    break;
                case MOUSE_EVENT:
                    switch(irInBuf[i].Event.MouseEvent.dwEventFlags){
                        case 0:
                            if(irInBuf[i].Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
                                myKey->_KEY_PRESSED[VK_LBUTTON] = true;
                            else
                                myKey->_KEY_PRESSED[VK_LBUTTON] = false;
                            if(irInBuf[i].Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
                                myKey->_KEY_PRESSED[VK_RBUTTON] = true;
                            else
                                myKey->_KEY_PRESSED[VK_RBUTTON] = false;
                            break;
                        /*case MOUSE_MOVED:
                            myKey->_Mouse_Coord = irInBuf[i].Event.MouseEvent.dwMousePosition;
                            break; */
                    }
                    break;
                case WINDOW_BUFFER_SIZE_EVENT:
                case FOCUS_EVENT:
                case MENU_EVENT:
                    break;
            }
        }
    }
}

void Key::Start_Thread(){
    _HANDLE = CreateThread(0,0,Threader_Key,this,0,0);
    
}
void Key::Stop_Thread(){
    if(_HANDLE != 0)
        CloseHandle(_HANDLE);
    _HANDLE = 0;
}
maar nu werkt dit niet meer onder de compiler die ik nu dus gebruik (schijnt oud te zijn oid) ik weet dat threads tegenwoordig door C++ ondersteund worden en ik dus geen specifieke Windows code meer nodig heb, maar is het dan ook mogelijk om toets (en muis) aanslagen te registreren buiten Windows om?

dan heb ik nog een vraag: Zelfs met de optie: -std=c++0x kan ik de volgende code niet compileren omdat thread geen member van std zou zijn:
1
2
3
4
5
6
7
8
#include <thread>

int main(){
    
    std::thread mythread;
    
    return 0;
}
Ai_KaRaMBadonderdag 7 juni 2012 @ 17:47
Als je een windows applicatie bouwt, ben je sowieso aan de windows API gebonden. Die CreateThread functie zit daar (nog steeds) in, dus ik zou niet weten waarom je oude code het niet meer zou doen? Link je wel goed? Include je windows.h wel?

En die threads functionaliteit zit pas sinds kort in de nieuwste C++ specificatie; mogelijk ondersteund je compiler ze nog niet?

Het hele user interface gebeuren (oa muis en toetsenbord aanslagen) zijn platform specifiek en daarvoor zit je nog steeds aan een GUI toolkit vast. Dat kan gewoon de Win32 API zijn. Als je het platform onafhankelijk wil doen, kun je ook kijken naar Qt, wxWidgets of OpenGL/GLUT.
netolkdonderdag 7 juni 2012 @ 22:05
quote:
0s.gif Op donderdag 7 juni 2012 17:47 schreef Ai_KaRaMBa het volgende:
Als je een windows applicatie bouwt, ben je sowieso aan de windows API gebonden. Die CreateThread functie zit daar (nog steeds) in, dus ik zou niet weten waarom je oude code het niet meer zou doen? Link je wel goed? Include je windows.h wel?

En die threads functionaliteit zit pas sinds kort in de nieuwste C++ specificatie; mogelijk ondersteund je compiler ze nog niet?

Het hele user interface gebeuren (oa muis en toetsenbord aanslagen) zijn platform specifiek en daarvoor zit je nog steeds aan een GUI toolkit vast. Dat kan gewoon de Win32 API zijn. Als je het platform onafhankelijk wil doen, kun je ook kijken naar Qt, wxWidgets of OpenGL/GLUT.
ik krijg de volgend foutmelding als ik de eerder geplaatste code probeer te compileren:
1
2
error: ambiguates old declaration 'long unsigned int Threader_Key(vo
id*)'

ook lijkt het me logisch dat de compiler thread zou moeten ondersteunen aangezien het meegeleverd is.
het probleem is dus dat de vorige versie van de compiler deze code prima compileerde en dat ik nu dus zowel de "oude" (via Win32 API) als de "nieuwe" thread niet kan gebruiken
Ai_KaRaMBadonderdag 7 juni 2012 @ 22:26
Komt dat niet omdat je je functie Threader_Key binnen je Key klasse anders declareert, dan bij het implementeren van de functie?

(hint: je implementeert het met een WINAPI calling convention, terwijl je 'm daar niet mee declareert)

En voor wat betreft de C++11 threads, gaf google me: http://stackoverflow.com/(...)cy-features-in-mingw

[ Bericht 21% gewijzigd door Ai_KaRaMBa op 07-06-2012 22:57:36 ]
netolkvrijdag 8 juni 2012 @ 01:07
quote:
0s.gif Op donderdag 7 juni 2012 22:26 schreef Ai_KaRaMBa het volgende:
Komt dat niet omdat je je functie Threader_Key binnen je Key klasse anders declareert, dan bij het implementeren van de functie?

(hint: je implementeert het met een WINAPI calling convention, terwijl je 'm daar niet mee declareert)

En voor wat betreft de C++11 threads, gaf google me: http://stackoverflow.com/(...)cy-features-in-mingw
Ja, dat weet ik idd maar de vorige compiler gaf dus problemen als WINAPI in een class stond en werkte deze code. Heb net voor de zekerheid nog even gecheckt maar krijg deze melding:
1error: 'WINAPI' is neither function nor member function; cannot be declared friend

Update:
Ik heb de fout gevonden. Uiteindelijk was het even puzzelen maar het kwam er op neer dat de compiler WINAPI niet accepteerde omdat er blijkbaar ergens een #include<windows.h> weg gevallen was. Dus eigenlijk een stomme fout 8)7

in ieder geval bedankt voor de hulp en het meedenken

[ Bericht 12% gewijzigd door netolk op 08-06-2012 01:30:10 ]
-tape-woensdag 13 juni 2012 @ 15:33
Ik heb een probleem; ik heb een tentamen van vorig jaar bekeken over programmeren in C#. Nu snap ik eigenlijk alle opdrachten alleen kom ik er uit 1 niet uit:

g6SAm.jpg

Ik hoef niet de volledige uitwerking, alleen maar even een opzetje hoe dit aangepakt zou moeten worden. Ik dacht zelf aan een for-loop of een while-loop maar kan er niet achter komen hoe je dan individueel al die karakters omzet naar een getal. Iemand enig idee? Alvast bedankt :P
thabitwoensdag 13 juni 2012 @ 16:08
C# is een hele andere programmeertaal dan C of C++, dus ik weet niet of veel mensen hier ermee bekend zijn. Ik neem aan dat je het i-de karakter van string s gewoon kunt ophalen met s[i].
Faux.woensdag 13 juni 2012 @ 16:33
Vraagje, ik wil wel weer 's een nieuwe programmeertaal leren, maar is C++ niet een beetje ouderwets? Kan ik dan niet beter een iets recentere taal leren?
netolkwoensdag 13 juni 2012 @ 17:38
quote:
11s.gif Op woensdag 13 juni 2012 16:33 schreef Faux. het volgende:
Vraagje, ik wil wel weer 's een nieuwe programmeertaal leren, maar is C++ niet een beetje ouderwets? Kan ik dan niet beter een iets recentere taal leren?
nee, C++ is niet ouderwets heel veel word nog steeds in C++ geschreven in veel games zijn de belangrijke delen geschreven in C++, ook word C++ vaak voor modellen gebruikt
thabitwoensdag 13 juni 2012 @ 18:27
quote:
11s.gif Op woensdag 13 juni 2012 16:33 schreef Faux. het volgende:
Vraagje, ik wil wel weer 's een nieuwe programmeertaal leren, maar is C++ niet een beetje ouderwets? Kan ik dan niet beter een iets recentere taal leren?
C++ is een hele goede taal om te leren programmeren, maar zodra je het eenmaal kunt raad ik je aan naar andere talen over te stappen.
Faux.woensdag 13 juni 2012 @ 19:10
quote:
7s.gif Op woensdag 13 juni 2012 18:27 schreef thabit het volgende:

[..]

C++ is een hele goede taal om te leren programmeren, maar zodra je het eenmaal kunt raad ik je aan naar andere talen over te stappen.
Ik kan al programmeren, maar ben wel geïnteresseerd in hoe computers vanbinnen werken en zo.
GS42woensdag 13 juni 2012 @ 19:35
quote:
0s.gif Op woensdag 13 juni 2012 15:33 schreef -tape- het volgende:
Ik heb een probleem; ik heb een tentamen van vorig jaar bekeken over programmeren in C#. Nu snap ik eigenlijk alle opdrachten alleen kom ik er uit 1 niet uit:

[ afbeelding ]

Ik hoef niet de volledige uitwerking, alleen maar even een opzetje hoe dit aangepakt zou moeten worden. Ik dacht zelf aan een for-loop of een while-loop maar kan er niet achter komen hoe je dan individueel al die karakters omzet naar een getal. Iemand enig idee? Alvast bedankt :P
Als ik je goed begrijp, dan staat je antwoord al in de opgave. Je vraagt hoe een karakter 'x' om te zetten naar getal n, toch? We nemen aan dat je op een of andere manier de karakters individueel aan kunt spreken. Nu moet je 'a' omzetten naar 1, 'b' naar 2 enzovoorts.

In de opgave staat dat je 'a' om kunt zetten naar het getal 97. Karakter 'b' kan je op dezelfde manier omzetten naar 98. Deze getallen zou je kunnen gebruiken om de karakters om te rekenen naar hun getal-code. Er zijn andere manieren (een groot switch-statement, bijvoorbeeld), maar deze aanpak ligt voor de hand.
GS42woensdag 13 juni 2012 @ 19:39
quote:
11s.gif Op woensdag 13 juni 2012 16:33 schreef Faux. het volgende:
Vraagje, ik wil wel weer 's een nieuwe programmeertaal leren, maar is C++ niet een beetje ouderwets? Kan ik dan niet beter een iets recentere taal leren?
Ik ben wel nieuwsgierig - waarom denk je dat C++ ouderwets is?

Een antwoord op je vraag is natuurlijk niet te geven. Het klinkt alsof je het voor de lol doet. In dat geval maakt het natuurlijk niet uit hoe nuttig de programmeertaal is en zou ik zeggen: kies wat je leuk lijkt.
thabitwoensdag 13 juni 2012 @ 21:05
quote:
7s.gif Op woensdag 13 juni 2012 19:10 schreef Faux. het volgende:

[..]

Ik kan al programmeren, maar ben wel geïnteresseerd in hoe computers vanbinnen werken en zo.
In dat opzicht kan C++ handig zijn. Het dwingt je om te 'denken' als de computer/compiler.
netolkdonderdag 14 juni 2012 @ 00:10
quote:
0s.gif Op woensdag 13 juni 2012 21:05 schreef thabit het volgende:

[..]

In dat opzicht kan C++ handig zijn. Het dwingt je om te 'denken' als de computer/compiler.
ahh, ik wist het!

AI bestaat al lang :P
Faux.donderdag 14 juni 2012 @ 08:16
quote:
0s.gif Op woensdag 13 juni 2012 19:39 schreef GS42 het volgende:

[..]

Ik ben wel nieuwsgierig - waarom denk je dat C++ ouderwets is?

Een antwoord op je vraag is natuurlijk niet te geven. Het klinkt alsof je het voor de lol doet. In dat geval maakt het natuurlijk niet uit hoe nuttig de programmeertaal is en zou ik zeggen: kies wat je leuk lijkt.
Programmeren doe ik inderdaad voor de lol. Het is natuurlijk wel handig om er uiteindelijk een mooi programma mee te kunnen schrijven, maar het is niet zo dat ik persé de beste programmeertaal wil leren.

quote:
0s.gif Op woensdag 13 juni 2012 21:05 schreef thabit het volgende:

[..]

In dat opzicht kan C++ handig zijn. Het dwingt je om te 'denken' als de computer/compiler.
Dat lijkt me leuk. Ik ga het proberen, dank jullie :)
ralfiedonderdag 14 juni 2012 @ 10:07
quote:
0s.gif Op woensdag 13 juni 2012 15:33 schreef -tape- het volgende:
Ik heb een probleem; ik heb een tentamen van vorig jaar bekeken over programmeren in C#. Nu snap ik eigenlijk alle opdrachten alleen kom ik er uit 1 niet uit:

[ afbeelding ]

Ik hoef niet de volledige uitwerking, alleen maar even een opzetje hoe dit aangepakt zou moeten worden. Ik dacht zelf aan een for-loop of een while-loop maar kan er niet achter komen hoe je dan individueel al die karakters omzet naar een getal. Iemand enig idee? Alvast bedankt :P
1
2
3
4
string outp = string.empty;
foreach( char c in string.ToLower())
   outp+='-' + (((int)c - 'a')+1).ToString();
return outp.Substring(1);
Vergeleken met c++ is C# zoo makkelijk.
Ai_KaRaMBadonderdag 14 juni 2012 @ 11:22
quote:
9s.gif Op donderdag 14 juni 2012 10:07 schreef ralfie het volgende:

[..]
[ code verwijderd ]

Vergeleken met c++ is C# zoo makkelijk.
Dat is in C toch niet heel veel moeilijker?
1
2
3
4
5
6
7
8
char tmp[33];
char outp[1024] = {0};
for(char *c=in; *c; c++)
{
    strcat(outp, "-"); 
    strcat(outp, itoa(toupper(*c)-'A'+1, tmp, 10));
}
return strdup(&outp[1]);
GS42donderdag 14 juni 2012 @ 13:06
Ha, nu wil ik ook meedoen met een echte C++ oplossing:

1
2
3
4
5
std::string encode(std::string const &input) {
    std::ostringstream ss;
    std::for_each(input.begin(), input.end(), [&ss](char c){ ss << c - 96 << '-'; });
    return ss.str();
}

Ik vind het wel wat hebben.
Ai_KaRaMBadonderdag 14 juni 2012 @ 13:11
Je vergeet de laatste '-' eraf te strippen, en een toupper/tolower ergens :P

Maar goed: de algemene aanpak in C, C++ en C# is hetzelfde; zitten wat kleine API/syntax verschillen in, maar ik zie niet waarom het ene fundamenteel makkelijker zou zijn dan het andere
GS42donderdag 14 juni 2012 @ 13:13
quote:
3s.gif Op donderdag 14 juni 2012 13:11 schreef Ai_KaRaMBa het volgende:
Je vergeet de laatste '-' eraf te strippen, en een toupper/tolower ergens :P
Volgens de opgave is de input altijd in kleine letters en mag de laatste '-' blijven staan. Wel lezen he? ;)
quote:
Maar goed: de algemene aanpak in C, C++ en C# is hetzelfde; zitten wat kleine API/syntax verschillen in, maar ik zie niet waarom het ene fundamenteel makkelijker zou zijn dan het andere
Maar je hebt gelijk, natuurlijk. De oplossingen zijn precies hetzelfde. De programmeertaal is voorkeur.
thabitdonderdag 14 juni 2012 @ 13:17
quote:
9s.gif Op donderdag 14 juni 2012 10:07 schreef ralfie het volgende:

[..]
[ code verwijderd ]

Vergeleken met c++ is C# zoo makkelijk.
1return "-".join([str(ord(c) - ord("a") + 1) for c in string])
Nog makkelijker! String parsing moet je niet in C-watdanook willen doen.

[ Bericht 1% gewijzigd door thabit op 14-06-2012 15:06:10 ]
Ai_KaRaMBadonderdag 14 juni 2012 @ 13:28
quote:
0s.gif Op donderdag 14 juni 2012 13:13 schreef GS42 het volgende:

[..]

Volgens de opgave is de input altijd in kleine letters en mag de laatste '-' blijven staan. Wel lezen he? ;)
Oh, ik had de opgave niet gelezen... Ik had mijn code gelijk getrokken aan die van ralfie :P
thabitdonderdag 14 juni 2012 @ 13:32
Als je de opgave nog eens goed leest, dan zie je dat het weghalen van de laatste "-" punten oplevert.
GS42donderdag 14 juni 2012 @ 14:44
quote:
14s.gif Op donderdag 14 juni 2012 13:17 schreef thabit het volgende:

Nog makkelijker! String parsing moet je niet in C-watdanook willen doen.
Tsja, uiteindelijk doet Python het ook in C. Er zijn natuurlijk ook parsergeneratoren die het parsen van tekst prachtig doen, zoals de combinatie van Flex en Bison. Daarmee kan je tekst parsen in een soort meta-taaltje waarna de parsergenerator de broncode voor je genereert en je zelf niets hoeft te schijven. De programma's worden daarom ook wel compiler-compilers genoemd. :)

Trouwens, nu we zo enthousiast met een simpel opdrachtje bezig zijn, vraag ik me af of jullie Project Euler ook kennen. Het is een website met programmeerpuzzels, meestal gecombineerd met een beetje wiskunde. Het begin is goed te doen, maar de opgaves worden steeds lastiger. Iemand die het kent of zelfs meedoet?
thabitdonderdag 14 juni 2012 @ 15:02
quote:
0s.gif Op donderdag 14 juni 2012 14:44 schreef GS42 het volgende:

[..]

Trouwens, nu we zo enthousiast met een simpel opdrachtje bezig zijn, vraag ik me af of jullie Project Euler ook kennen. Het is een website met programmeerpuzzels, meestal gecombineerd met een beetje wiskunde. Het begin is goed te doen, maar de opgaves worden steeds lastiger. Iemand die het kent of zelfs meedoet?
Zeker, erg leuke site! Ik moet bekennen dat ik er uit zelfbescherming niet te vaak op zit, omdat ik anders hele dagen niks anders doe.
Ai_KaRaMBadonderdag 14 juni 2012 @ 15:59
Ik ken 't idd! Dat soort programmeer uitdagingen zijn trouwens altijd leuk.

Ik heb in het verleden ook wel deelgenomen aan USACO, TopCoder, Codecup en de ACM-ICPC (nooit verder gekomen dan de NWERC trouwens). Allemaal net wat anders van opzet, maar ook allemaal leuk om aan deel te nemen.

Helaas heb ik op het moment een beetje last van tijdgebrek }:|
netolkvrijdag 15 juni 2012 @ 14:35
quote:
0s.gif Op donderdag 14 juni 2012 14:44 schreef GS42 het volgende:

Trouwens, nu we zo enthousiast met een simpel opdrachtje bezig zijn, vraag ik me af of jullie Project Euler ook kennen. Het is een website met programmeerpuzzels, meestal gecombineerd met een beetje wiskunde. Het begin is goed te doen, maar de opgaves worden steeds lastiger. Iemand die het kent of zelfs meedoet?
Nee had ik nog nooit van gehoord maar zit er idd zeer interessant uit, ik ga na mijn tentamens denk ik maar eens even goed bekijken (als ik het er voor doe haal ik mijn tentamens waarschijnlijk niet meer)
t4rt4rusvrijdag 15 juni 2012 @ 14:44
Ik heb als fysicus een c++ cursus gedaan op de universiteit.
En ik vind het altijd leuk om dummies te helpen. :)
t4rt4rusvrijdag 15 juni 2012 @ 14:45
quote:
0s.gif Op donderdag 14 juni 2012 14:44 schreef GS42 het volgende:
Trouwens, nu we zo enthousiast met een simpel opdrachtje bezig zijn, vraag ik me af of jullie Project Euler ook kennen. Het is een website met programmeerpuzzels, meestal gecombineerd met een beetje wiskunde. Het begin is goed te doen, maar de opgaves worden steeds lastiger. Iemand die het kent of zelfs meedoet?
Ik ben daar mee bezig met amd64 assembly en wiskunde, voor sommige heb je geen programma nodig.
thenxerozaterdag 28 juli 2012 @ 17:00
quote:
0s.gif Op donderdag 14 juni 2012 14:44 schreef GS42 het volgende:
Trouwens, nu we zo enthousiast met een simpel opdrachtje bezig zijn, vraag ik me af of jullie Project Euler ook kennen. Het is een website met programmeerpuzzels, meestal gecombineerd met een beetje wiskunde. Het begin is goed te doen, maar de opgaves worden steeds lastiger. Iemand die het kent of zelfs meedoet?
Ik ben pas begonnen met C++ te leren. Ik probeer het te doen aan de hand van die projecteuler site. Het is me gelukt de eerste drie vragen op te lossen. Het is misschien niet moeilijk als je weet hoe C++ in elkaar zit, maar voor mij is het een hele opgave (maar wel een leuke :) ).

Ik ben nu aanbeland bij het volgende probleem:
quote:
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

Find the largest palindrome made from the product of two 3-digit numbers.
Mijn aanpak is als volgt:
1. Maak een functie die een getal opsplitst in zijn cijfers. Dus bvb: 123 --> 1, 2, 3
2. Maak een functie die het eerste en laatste cijfer vergelijkt, het tweede en het één na laatste, etc. Als die allemaal hetzelfde zijn dan is het een palindroom.
3. Genereer alle producten van 3 cijfers en pas 1. en 2. toe. (dat kan vast ook efficiënter)

Ik loop al vast bij stap 1. Het is me wel gelukt om die functie te maken, die van een getal 123 een array {1,2,3} maakt, alleen het lukt me niet om die in zijn geheel te "returnen". Ik heb ook van alles geprobeerd met pointers en vectors en van alles bij elkaar gegoogled, maar ik kom er maar niet verder mee.

Dit is mijn huidige code, waar ik ter illustratie een getal return. De hele array lukt niet, dus als iemand me daarmee kan helpen, graag!

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
#include <iostream>
#include <vector>
using namespace std;

//Deze functie bepaalt het aantal cijfers in een getal
int numDigits(int q){
    if(q>0 && q<10){return(1);};
    if(q>9 && q<100){return(2);};
    if(q>99 && q<1000){return(3);};
    if(q>999 && q<10000){return(4);};
    if(q>9999 && q<1000000){return(5);};
    if(q>99999 && q<10000000){return(6);};
    if(q>999999 && q<100000000){return(7);};
    if(q>9999999 && q<1000000000){return(8);};
    }

//Deze functie splitst het getal op in zijn cijfers
int digit(int p){
    int z;
    int k(1);
    int l(1);
    int i(0);
    int m[numDigits(p)];
    for(z=0; z<numDigits(p); z++){
        k=(p/l)%10;
        l=10*l;
        m[i]=k;
        i++;
        }
        return m[1];
    }

int main(){
    cout << digit(52);
    return 0;
    }
GS42zaterdag 28 juli 2012 @ 19:43
quote:
0s.gif Op zaterdag 28 juli 2012 17:00 schreef thenxero het volgende:

Ik loop al vast bij stap 1. Het is me wel gelukt om die functie te maken, die van een getal 123 een array {1,2,3} maakt, alleen het lukt me niet om die in zijn geheel te "returnen". Ik heb ook van alles geprobeerd met pointers en vectors en van alles bij elkaar gegoogled, maar ik kom er maar niet verder mee.

Ik heb het zelf opgelost door het getal om te zetten naar een std::string en in de string het getal op palindromiteit te controleren. Dit is een mogelijkheid die je kunt overwegen. Ook kan je een std::vector gebruiken om de getallen in op te slaan. Een std::vector of std::string kan je beide gewoon returnen.

Het is niet mogelijk een array te returnen uit een functie. Wel is het mogelijk een pointer naar een dynamisch gealloceerde array terug te geven, maar dit zou ik in dit geval niet aanraden.

Denk je dat je hiermee verder komt?
thenxerozaterdag 28 juli 2012 @ 21:33
quote:
0s.gif Op zaterdag 28 juli 2012 19:43 schreef GS42 het volgende:

[..]

Ik heb het zelf opgelost door het getal om te zetten naar een std::string en in de string het getal op palindromiteit te controleren. Dit is een mogelijkheid die je kunt overwegen. Ook kan je een std::vector gebruiken om de getallen in op te slaan. Een std::vector of std::string kan je beide gewoon returnen.

Het is niet mogelijk een array te returnen uit een functie. Wel is het mogelijk een pointer naar een dynamisch gealloceerde array terug te geven, maar dit zou ik in dit geval niet aanraden.

Denk je dat je hiermee verder komt?
Met zo'n string is ook wel handig. Maar ik wil het proberen als array of vector (dan leer ik daar ook mee omgaan). Ik had al gevonden op internet dat je een array niet kon returnen en een vector wel, maar toch lukte het me niet met een vector.

Ik heb bijvoorbeeld het volgende geprobeerd:

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
#include <iostream>
#include <vector>
using namespace std;

//Deze functie bepaalt het aantal cijfers in een getal
int numDigits(int q){
    if(q>0 && q<10){return(1);};
    if(q>9 && q<100){return(2);};
    if(q>99 && q<1000){return(3);};
    if(q>999 && q<10000){return(4);};
    if(q>9999 && q<1000000){return(5);};
    if(q>99999 && q<10000000){return(6);};
    if(q>999999 && q<100000000){return(7);};
    if(q>9999999 && q<1000000000){return(8);};
    }

//Deze functie splitst het getal op in zijn cijfers
int digit(int p){
    int z;
    int k(1);
    int l(1);
    int i(0);
    vector<int> m;
    for(z=0; z<numDigits(p); z++){
        k=(p/l)%10;
        l=10*l;
        m.push_back(k);
        i++;
        }
        return m;
    }

int main(){
    cout << digit(52);
    return 0;
    }

Maar dan krijg ik:
1error: cannot convert 'std::vector<int, std::allocator<int> >' to 'int' in return|
GS42zaterdag 28 juli 2012 @ 22:53
quote:
0s.gif Op zaterdag 28 juli 2012 21:33 schreef thenxero het volgende:

[..]

Met zo'n string is ook wel handig. Maar ik wil het proberen als array of vector (dan leer ik daar ook mee omgaan). Ik had al gevonden op internet dat je een array niet kon returnen en een vector wel, maar toch lukte het me niet met een vector.

Ik heb bijvoorbeeld het volgende geprobeerd:
[ code verwijderd ]

Maar dan krijg ik:
[ code verwijderd ]

Ah, dat is een vrij duidelijk foutmelding. Je weet dat je een functie begint door aan te geven welk type een functie returnt? Deze foutmelding geeft aan dat je een ander type teruggeeft dan volgens de functie-declaratie zou moeten. Dat klopt ook, want je schrijft int digit(), terwijl je een vector<int> teruggeeft. Dat moet veranderd worden.

Daarnaast kan je een vector niet afdrukken door deze gelijk in std::cout te stoppen. Jouw regel 35 kan dus ook niet: je zult de elementen van de vector 1 voor 1 af moeten drukken.

Verder gebruik je de vector echter op de juiste manier, dus dat zit goed. Er zijn nog wat andere op- en aanmerkingen, maar die zijn van minder belang. (Heb je toevallig eerder iets met C gedaan?)
thenxerozaterdag 28 juli 2012 @ 23:04
quote:
0s.gif Op zaterdag 28 juli 2012 22:53 schreef GS42 het volgende:

[..]

Ah, dat is een vrij duidelijk foutmelding. Je weet dat je een functie begint door aan te geven welk type een functie returnt? Deze foutmelding geeft aan dat je een ander type teruggeeft dan volgens de functie-declaratie zou moeten. Dat klopt ook, want je schrijft int digit(), terwijl je een vector<int> teruggeeft. Dat moet veranderd worden.
Dank! Hier ben ik dus uren mee bezig geweest, heb geprobeerd in de return aan te geven dat hij een vector moet returnen, etc. En dan is het zo simpel :D .

quote:
Daarnaast kan je een vector niet afdrukken door deze gelijk in std::cout te stoppen. Jouw regel 35 kan dus ook niet: je zult de elementen van de vector 1 voor 1 af moeten drukken.

Verder gebruik je de vector echter op de juiste manier, dus dat zit goed. Er zijn nog wat andere op- en aanmerkingen, maar die zijn van minder belang. (Heb je toevallig eerder iets met C gedaan?)
Heb geen ervaring met C. Heb alleen een beetje geprogrammeerd in Mathematica en Matlab.
thenxerozaterdag 28 juli 2012 @ 23:54
Heb het nu ook eindelijk voor elkaar dat mijn code palindromen herkent en opslaat in een vector. Nu nog al die producten genereren, of iets slims gaan bedenken want ik weet niet hoe lang het duurt als ik ze allemaal ga genereren :P
thabitzondag 29 juli 2012 @ 00:02
quote:
7s.gif Op zaterdag 28 juli 2012 23:54 schreef thenxero het volgende:
Heb het nu ook eindelijk voor elkaar dat mijn code palindromen herkent en opslaat in een vector. Nu nog al die producten genereren, of iets slims gaan bedenken want ik weet niet hoe lang het duurt als ik ze allemaal ga genereren :P
Alle produkten van 2 driecijferige getallen controleren op palindroom zijn, dat zou op de meest naïeve wijze niet meer dan een fractie van een seconde moeten duren.
Wolfjezondag 29 juli 2012 @ 00:43
quote:
7s.gif Op zaterdag 28 juli 2012 23:54 schreef thenxero het volgende:
Heb het nu ook eindelijk voor elkaar dat mijn code palindromen herkent en opslaat in een vector. Nu nog al die producten genereren, of iets slims gaan bedenken want ik weet niet hoe lang het duurt als ik ze allemaal ga genereren :P
Bij dit soort problemen kun je als vuistregel gebruiken dat je ongeveer 50 miljoen groepjes van simpele operaties per seconde kunt doen. Met brute force heb je minder dan 1k*1k = 1M mogelijkheden en de palindroom test vergt 6 stappen. Dus gaat makkelijk lukken binnen een seconde. Het is wel handig om zulk soort worst case analyses te doen, zeker als je een exponentieel algoritme hebt bedacht :).
Morgen ga ik ook weer eens project euler proberen, maar dan wel in python ;).
thenxerozondag 29 juli 2012 @ 02:14
quote:
12s.gif Op zondag 29 juli 2012 00:02 schreef thabit het volgende:

[..]

Alle produkten van 2 driecijferige getallen controleren op palindroom zijn, dat zou op de meest naïeve wijze niet meer dan een fractie van een seconde moeten duren.
quote:
2s.gif Op zondag 29 juli 2012 00:43 schreef Wolfje het volgende:

[..]

Bij dit soort problemen kun je als vuistregel gebruiken dat je ongeveer 50 miljoen groepjes van simpele operaties per seconde kunt doen. Met brute force heb je minder dan 1k*1k = 1M mogelijkheden en de palindroom test vergt 6 stappen. Dus gaat makkelijk lukken binnen een seconde. Het is wel handig om zulk soort worst case analyses te doen, zeker als je een exponentieel algoritme hebt bedacht :).
Morgen ga ik ook weer eens project euler proberen, maar dan wel in python ;).
Ah, handig zo'n vuistregel. Dan moet je waarschijnlijk wel wat beter programmeren dan dat ik het gedaan heb, want hier duurt het 21 sec :D . Hij geeft nu wel het goede antwoord. Waar gaat al die tijd heen?
-code weg-

[ Bericht 13% gewijzigd door thenxero op 29-07-2012 10:35:51 ]
GS42zondag 29 juli 2012 @ 02:48
quote:
0s.gif Op zondag 29 juli 2012 02:14 schreef thenxero het volgende:

Ah, handig zo'n vuistregel. Dan moet je waarschijnlijk wel wat beter programmeren dan dat ik het gedaan heb, want hier duurt het 21 sec :D . Hij geeft nu wel het goede antwoord. Waar gaat al die tijd heen?
[ code verwijderd ]

Ik denk dat het netter is om geen complete oplossingen te posten. Immers, andere mensen willen het ook zelf oplossen. Misschien kan je de code weghalen en vervangen door pseudo-code van de relevante gedeeltes?

Maar als antwoord over waar al die tijd heen gaat: hoe vaak roep je digit() en numDigits() aan per getal dat je controleert? Zou je dat terug kunnen brengen?

En is er een snelle controle die je kunt doen om te kijken of je een getal [s] uberhaupt hoeft te controleren? Gecombineerd met deze lopmerking kan je ook wat tijd winnen door te bedenken waar het getal dat je zoekt zich waarschijnlijk bevindt in je zoekgebied en de zoekruimte in een andere volgorde doorlopen.
Wolfjezondag 29 juli 2012 @ 09:58
quote:
0s.gif Op zondag 29 juli 2012 02:14 schreef thenxero het volgende:

[..]

[..]

Ah, handig zo'n vuistregel. Dan moet je waarschijnlijk wel wat beter programmeren dan dat ik het gedaan heb, want hier duurt het 21 sec :D . Hij geeft nu wel het goede antwoord. Waar gaat al die tijd heen?
[ code verwijderd ]

Geheugenallocatie is vrij duur en dat doe je nu juist heel vaak met de vector<int> in de digit() methode. Een bijkomend nadeel is dat je veel zogenaamde cache misses zult hebben. Een cpu kan data in lokaal geheugen (op de cpu zelf) opslaan om het later weer snel op te kunnen vragen. Maar als je de hele tijd nieuwe data maakt, kan de cpu er ook geen gebruik van maken.
thenxerozondag 29 juli 2012 @ 10:54
Heb het met die tips teruggebracht naar 0.4sec (die staan natuurlijk ook op EP, dus daar ging het eigenlijk niet om). Maar omdat thabit zei dat het op de meest naïeve manier nog een fractie van een seconde zou duren als je alle palindromen zou controleren, dacht ik dus dat er een soort fout in mijn code zat.

Maar als ik het goed begrijp kost het steeds callen van een functie veel tijd. Is het dan beter om die functie te verwerken in de main?
Ai_KaRaMBazondag 29 juli 2012 @ 11:12
Het callen van een functie opzich kost niet persee veel tijd. Wel is het zo dat iedere keer als je een functie binnenkomt, de compiler het benodigde geheugen wat die functie nodig heeft voor lokale variabelen moet alloceren, en weer vrij moet geven bij het verlaten van een functie. Enkele kleine variabelen (int, char, float, etc) worden op de stack gealloceerd en kosten nauwelijks tijd, maar als je classen gebruikt binnen je functie komen die op de heap (wat wel relatief veel tijd kost).

In jou geval hoeft de compiler het initialiseren/vrijgeven van die vector<int> slechts 1 keer te doen als je die digit() functie opneemt in je main, en 18000000 keer (als ik je code goed kan herinneren; hij is nu weg) als je 'm steeds als funtie aanroept...
thenxerozondag 29 juli 2012 @ 11:21
quote:
0s.gif Op zondag 29 juli 2012 11:12 schreef Ai_KaRaMBa het volgende:
Het callen van een functie opzich kost niet persee veel tijd. Wel is het zo dat iedere keer als je een functie binnenkomt, de compiler het benodigde geheugen wat die functie nodig heeft voor lokale variabelen moet alloceren, en weer vrij moet geven bij het verlaten van een functie. Enkele kleine variabelen (int, char, float, etc) worden op de stack gealloceerd en kosten nauwelijks tijd, maar als je classen gebruikt binnen je functie komen die op de heap (wat wel relatief veel tijd kost).

In jou geval hoeft de compiler het initialiseren/vrijgeven van die vector<int> slechts 1 keer te doen als je die digit() functie opneemt in je main, en 18000000 keer (als ik je code goed kan herinneren; hij is nu weg) als je 'm steeds als funtie aanroept...
Wat bedoel je met classen?

Maar als je een functie vaak callt dan is het dus vaak aan te raden om het in je main te verwerken.. Vind ik wel jammer eigenlijk, want als je het erbuiten doet ziet het er veel overzichtelijker uit.

Maar goed, op naar het volgende probleem :) .
Ai_KaRaMBazondag 29 juli 2012 @ 11:33
quote:
0s.gif Op zondag 29 juli 2012 11:21 schreef thenxero het volgende:

[..]

Wat bedoel je met classen?

Maar als je een functie vaak callt dan is het dus vaak aan te raden om het in je main te verwerken.. Vind ik wel jammer eigenlijk, want als je het erbuiten doet ziet het er veel overzichtelijker uit.

Maar goed, op naar het volgende probleem :) .
Hmm... simpel gezegt een classe is een complex data type wat zowel data als functies bevat. Ik was trouwens niet helemaal corrct: ook classen kunnen op de stack worden gealloceerd. Maar in dit geval gebruik je een vector, dat is een lijst van dynamische grootte, en die wordt wel op de heap geallocceerd.

Vaak is het helemaal niet aan te raden functies die je veel gebruikt in je main te verwerken!! Dat wordt er enorm onoverzichtelijk van. Loop unroling en handmatig inlinen zijn acties die je maar heeeeel zelden nodig hebt.

Als het echter een bottleneck is, kun je overwegen wat overhead weg te nemen. In jouw geval had dat bijvoorbeeld ook gekunt door je vector globaal te maken... Dat scheelt volgens mij ook (twee?) kopieer acties bij het returnen van de vector... Of wat ik vaak doe: de caller een variabele laten alloceren, en een pointer meegeven aan de functie waarin hij z'n resultaat moet wegschrijven.

Daarnaast is het gebruik van dynamische containers als vector<> of string sowieso af te raden als het tijd-critisch is!
thenxerozondag 29 juli 2012 @ 11:45
quote:
0s.gif Op zondag 29 juli 2012 11:33 schreef Ai_KaRaMBa het volgende:

[..]

Hmm... simpel gezegt een classe is een complex data type wat zowel data als functies bevat. Ik was trouwens niet helemaal corrct: ook classen kunnen op de stack worden gealloceerd. Maar in dit geval gebruik je een vector, dat is een lijst van dynamische grootte, en die wordt wel op de heap geallocceerd.

Vaak is het helemaal niet aan te raden functies die je veel gebruikt in je main te verwerken!! Dat wordt er enorm onoverzichtelijk van. Loop unroling en handmatig inlinen zijn acties die je maar heeeeel zelden nodig hebt.

Als het echter een bottleneck is, kun je overwegen wat overhead weg te nemen. In jouw geval had dat bijvoorbeeld ook gekunt door je vector globaal te maken... Dat scheelt volgens mij ook (twee?) kopieer acties bij het returnen van de vector... Of wat ik vaak doe: de caller een variabele laten alloceren, en een pointer meegeven aan de functie waarin hij z'n resultaat moet wegschrijven.

Daarnaast is het gebruik van dynamische containers als vector<> of string sowieso af te raden als het tijd-critisch is!
Bedankt! Nu is het een stuk duidelijker.

Ondertussen alweer het volgende probleem opgelost. Begin die syntax nu wel goed onder de knie te krijgen :) .
GS42zondag 29 juli 2012 @ 11:50
Mijn vraag was: hoe vaak roep je digit() en numDigit() per getal aan? Het probleem zit 'em niet in de functie-aanroep, maar in al het dubbele werk dat je deed. Het is beter het resultaat op te slaan dan om de (relatief dure) functie digit() elke keer te gebruiken.

Wat Ai_KaRaMBa zegt over functie-aanroepen klopt grotendeels: in principe kost een functie-aanroep niet veel en gaat de meeste tijd zitten in het kopieren van grote objecten. Dit laatste wordt echter meestal voorkomen (door (const) references mee te geven in plaats van de objecten zelf) en is een keuze: geen feit. De echte kosten van een functie (die dus niet voorkomen kunnen worden) zijn het op de stack zetten van alle argumenten (het liefst dus kleine argument of (const) references), de stack pointer aanpassen en van en naar de nieuwe code springen.

Als je deze overhead wilt voorkomen, dan laat je je functie gewoon staan en zet je er 'inline' voor, zodat de compiler weet dat jij wilt dat deze functie niet 'extern' aangeroepen moet worden, maar in de code moet worden verwerkt waar jij die aanroept. Dit doe je meestal met kleine functies (het liefst 1 regel), omdat je je voor kan stellen hoe groot de code wordt als je 20 regels code gaat plakken op elke plek waar je een functie aanroept. Let op dat 'inline' mogelijk door de compiler genegeerd wordt, als deze dat beter vindt.

Er is dus een klein tijdsverlies, maar deze is minimaal als je het goed doet. Als je een kleine functie hebt die je vaak aanroept, kun je deze 'inline' labelen, maar dit is geen zekerheid. Als het er echt, echt op aan komt, kan je erover denken om de functie-aanroep te verwijderen en de code direct op de juiste plek te zetten. Ik heb het 1 keer gedaan in een klasse voor rekenen met ongelimiteerd grote getallen in de binnenste loop van een deelfunctie. Bij PE is het niet nodig en zeker niet als het je ook doet om een programmeertaal te leren.

quote:
Daarnaast is het gebruik van dynamische containers als vector<> of string sowieso af te raden als het tijd-critisch is!
Ben ik het niet helemaal mee eens. Ook hier gaat het weer op de manier waarop je het gebruikt. Als je geen dynamische allocatie nodig hebt, is het inderdaad meestal sneller het niet te doen. Maar als je het wel nodig hebt (grote of onbekend grote input, bijvoorbeeld) dan zijn de dynamische containers een goede keuze.

Ook hier kan je tijd winnen door ze juist te gebruiken. De std::vector klasse heeft bijvoorbeeld members reserve() en resize(), waarmee je de vector bij aanmaak de juiste grootte kan geven (als je deze weet, ten minste). Dit scheelt een mogelijke re-allocatie (het dure gedeelte) bij een push_back. Ook helpt het de eigenschappen van de containers te kennen, zodat je de juiste kiest.

Over het algemeen vind ik de stl-containers helemaal geen slechte keuze, ook niet als tijd erg belangrijk is.
Ai_KaRaMBazondag 29 juli 2012 @ 13:12
Ik ben het trouwens eens met de nuanceringen van GS42, ik was iets te kort door de bocht :@
thenxerozondag 29 juli 2012 @ 19:10
Bedankt nog voor de reacties.

Ik loop nu tegen iets heel raars aan. Hoe kan het verschil in output verklaard worden?

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

using namespace std;

int main()
{
    string mystring = "73";
    cout << mystring[0] <<endl;
    int a=mystring[0];
    cout << a;
}
Geeft als output

1
2
7
55

Kennelijk herkent ie een element van de string niet als integer. Hoe kan je het in een int converteren?

[ Bericht 5% gewijzigd door thenxero op 29-07-2012 19:27:18 ]
thabitzondag 29 juli 2012 @ 19:27
quote:
9s.gif Op zondag 29 juli 2012 19:10 schreef thenxero het volgende:
Bedankt nog voor de reacties.

Ik loop nu tegen iets heel raars aan. Hoe kan het verschil in output verklaard worden?
[ code verwijderd ]

Geeft als output
[ code verwijderd ]

Een string bestaat uit bytes, en a is de eerste byte van je string, te weten de byte die overeenkomt met het ascii-karakter "7". En dat is 48 + 7 = 55, want cijfers lopen in ascii van "0"=48 tot "9"=48+9=57.
thenxerozondag 29 juli 2012 @ 19:29
quote:
0s.gif Op zondag 29 juli 2012 19:27 schreef thabit het volgende:

[..]

Een string bestaat uit bytes, en a is de eerste byte van je string, te weten de byte die overeenkomt met het ascii-karakter "7". En dat is 48 + 7 = 55, want cijfers lopen in ascii van "0"=48 tot "9"=48+9=57.
Oké, en hoe vertaal je dit weer terug naar het juiste getal? Altijd -48?
thabitzondag 29 juli 2012 @ 19:31
quote:
0s.gif Op zondag 29 juli 2012 19:29 schreef thenxero het volgende:

[..]

Oké, en hoe vertaal je dit weer terug naar het juiste getal? Altijd -48?
Hoe bedoel je dat?
thenxerozondag 29 juli 2012 @ 19:32
quote:
0s.gif Op zondag 29 juli 2012 19:31 schreef thabit het volgende:

[..]

Hoe bedoel je dat?
Ik wil het eerste getal uit de string opslaan als integer. Dus in dit geval wil ik dat a=7.
thabitzondag 29 juli 2012 @ 19:38
O zo. Ja, je kan er 48 aftrekken. Iets netter is misschien om '0' (met enkele aanhalingstekens) af te trekken.
thenxerozondag 29 juli 2012 @ 21:42
quote:
0s.gif Op zondag 29 juli 2012 19:38 schreef thabit het volgende:
O zo. Ja, je kan er 48 aftrekken. Iets netter is misschien om '0' (met enkele aanhalingstekens) af te trekken.
Bedankt, met deze truc is het gelukt om EP9 op te lossen.

1Discover the largest product of five consecutive digits in the 1000-digit number.

Weet je een goede link waar ik wat meer kan lezen over die '0'? ik weet niet echt waar ik op moet zoeken.
thabitzondag 29 juli 2012 @ 22:08
quote:
0s.gif Op zondag 29 juli 2012 21:42 schreef thenxero het volgende:

[..]

Bedankt, met deze truc is het gelukt om EP9 op te lossen.
[ code verwijderd ]

Weet je een goede link waar ik wat meer kan lezen over die '0'? ik weet niet echt waar ik op moet zoeken.
'0' is niets anders dan de char die met het ascii-teken '0' overeenkomt. Wordt opgeslagen in een byte en heeft de waarde 48. Zo heeft elke character een numerieke waarde: 'A' is bijvoorbeeld 65, en een spatie ' ' is 32.

Een char is in principe gewoon een byte, maar wordt ook gebruikt om characters mee te representeren.
thenxerozondag 29 juli 2012 @ 22:55
quote:
0s.gif Op zondag 29 juli 2012 22:08 schreef thabit het volgende:

[..]

'0' is niets anders dan de char die met het ascii-teken '0' overeenkomt. Wordt opgeslagen in een byte en heeft de waarde 48. Zo heeft elke character een numerieke waarde: 'A' is bijvoorbeeld 65, en een spatie ' ' is 32.

Een char is in principe gewoon een byte, maar wordt ook gebruikt om characters mee te representeren.
Duidelijk
thenxerowoensdag 1 augustus 2012 @ 23:58
Ik loop weer ergens mee vast. Wat ik wil doen is de vereniging van twee willekeurig grote verzamelingen bepalen. De verzamelingen codeer ik als vectors. Het idee van de code is als volgt. Stel ik wil de vereniging van vector a en van b. Dan definieer ik een vector c die bestaat uit alle elementen uit b, en alle elementen uit a die niet in b zitten (zodat ik geen duplicaten creëer).

Ik heb er een hele tijd naar zitten staren, en gedebugged, maar ik kan maar niet de fout vinden in mijn code.
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
#include <iostream>
#include <vector>

using namespace std;

vector<int> vereniging(vector<int> a, vector<int> b)
{
    vector<int> c=b;
    for(int k=0; k<a.size(); k++)
    {
        int check=-1;
        int l(0);
        for(l=0; l<b.size(); l++)
        {
            if(a[l]==b[k])
            {
                check++;
                break;
            }
        }
        if(check<0)
        {
            c.push_back(a[k]);
        }
    }
    return c;
}

int main()
{
    int a[]={3,0,45,55,66};
    vector<int> m;
    m.assign(a,a+5);
    int b[]={3,4};
    vector<int> n;
    n.assign(b,b+2);
    cout << vereniging(m,n)[0] << endl << vereniging(m,n)[1] << endl << vereniging(m,n)[2] << endl<< vereniging(m,n)[3] << endl << vereniging(m,n)[4] << endl << vereniging(m,n)[5];
}

Zou natuurlijk als output de vector [3,4,0,45,55,66] moeten geven. Maar ik krijg [3,4,0,55,55,1112944187] :?
thabitdonderdag 2 augustus 2012 @ 00:00
quote:
0s.gif Op woensdag 1 augustus 2012 23:58 schreef thenxero het volgende:
Ik loop weer ergens mee vast. Wat ik wil doen is de vereniging van twee willekeurig grote verzamelingen bepalen. De verzamelingen codeer ik als vectors.
STL heeft een datatype set, zou je ook kunnen gebruiken.
thenxerodonderdag 2 augustus 2012 @ 00:04
quote:
0s.gif Op donderdag 2 augustus 2012 00:00 schreef thabit het volgende:

[..]

STL heeft een datatype set, zou je ook kunnen gebruiken.
Wat zijn de voordelen van dat datatype? Kan je daar wel makkelijk verenigingen mee maken?

En ik wil alsnog wel graag weten wat er mis is met mijn code, heb er echt uren naar zitten turen :(
thabitdonderdag 2 augustus 2012 @ 00:07
quote:
0s.gif Op donderdag 2 augustus 2012 00:04 schreef thenxero het volgende:

[..]

Wat zijn de voordelen van dat datatype? Kan je daar wel makkelijk verenigingen mee maken?
Jouw code heeft looptijd O(nm), een verzamelingendatatype kan het in O((n+m)log(n+m)).
thenxerodonderdag 2 augustus 2012 @ 00:09
OK dat moet ik dan maar gaan bestuderen. Zie je zo snel geen fout in mijn algoritme?
thabitdonderdag 2 augustus 2012 @ 00:10
quote:
0s.gif Op donderdag 2 augustus 2012 00:09 schreef thenxero het volgende:
OK dat moet ik dan maar gaan bestuderen. Zie je zo snel geen fout in mijn algoritme?
Weet je wat copy-constructors zijn en waar ze in je code impliciet aangeroepen worden?
thenxerodonderdag 2 augustus 2012 @ 00:12
quote:
0s.gif Op donderdag 2 augustus 2012 00:10 schreef thabit het volgende:

[..]

Weet je wat copy-constructors zijn en waar ze in je code impliciet aangeroepen worden?
Nee.

edit; even snel gegoogled, bedoel je de regel: vector<int> c=b;?
thabitdonderdag 2 augustus 2012 @ 00:14
quote:
0s.gif Op donderdag 2 augustus 2012 00:12 schreef thenxero het volgende:

[..]

Nee
Het kan handig zijn om je daar over in te lezen. ;).
thabitdonderdag 2 augustus 2012 @ 00:14
quote:
0s.gif Op donderdag 2 augustus 2012 00:12 schreef thenxero het volgende:

[..]

Nee.

edit; even snel gegoogled, bedoel je de regel: vector<int> c=b;?
Onder andere, maar ook bijvoorbeeld in de functie-aanroep worden ze gebruikt, en in het returnen van die vector.
thabitdonderdag 2 augustus 2012 @ 00:18
Punt is dat je die vectors beter als reference kunt passen in de functie, maar daar zit de fout op zich niet. Die zit namelijk hier:

1 if(a[l]==b[k])
Je hebt k en l verwisseld.
thenxerodonderdag 2 augustus 2012 @ 00:22
quote:
0s.gif Op donderdag 2 augustus 2012 00:18 schreef thabit het volgende:
Punt is dat je die vectors beter als reference kunt passen in de functie, maar daar zit de fout op zich niet. Die zit namelijk hier:
[ code verwijderd ]

Je hebt k en l verwisseld.
O M G :') . Bedankt!

Ik snap niet echt wat je bedoeld met die reference. Ik weet net pas wat pointers zijn, waar ik ook het nut nog niet echt van snap.
thabitdonderdag 2 augustus 2012 @ 00:31
quote:
0s.gif Op donderdag 2 augustus 2012 00:22 schreef thenxero het volgende:

[..]

O M G :') . Bedankt!

Ik snap niet echt wat je bedoeld met die reference. Ik weet net pas wat pointers zijn, waar ik ook het nut nog niet echt van snap.
Okee, dan zou ik me daar ook over inlezen, dit soort dingen zijn zo ongeveer hétgene waar C++ van aan elkaar hangt.

Dit is wel een goede bron voor de basics van C++ (aangenomen dat je enigszins met C bekend bent): http://www.drbio.cornell.(...)one-html/Frames.html
Dale.donderdag 2 augustus 2012 @ 00:58
quote:
0s.gif Op donderdag 2 augustus 2012 00:31 schreef thabit het volgende:

[..]

Okee, dan zou ik me daar ook over inlezen, dit soort dingen zijn zo ongeveer hétgene waar C++ van aan elkaar hangt.

Dit is wel een goede bron voor de basics van C++ (aangenomen dat je enigszins met C bekend bent): http://www.drbio.cornell.(...)one-html/Frames.html
Als hij nog niet zoveel van pointers weet dan is hij eigenlijk niet bekend met C :P
thenxerodonderdag 2 augustus 2012 @ 00:59
quote:
0s.gif Op donderdag 2 augustus 2012 00:31 schreef thabit het volgende:

[..]

Okee, dan zou ik me daar ook over inlezen, dit soort dingen zijn zo ongeveer hétgene waar C++ van aan elkaar hangt.

Dit is wel een goede bron voor de basics van C++ (aangenomen dat je enigszins met C bekend bent): http://www.drbio.cornell.(...)one-html/Frames.html
Bedankt. Ik ben niet bekend met C. Het enige wat ik weet is alles wat hier staat, tot het over pointers gaat. Ik heb daarmee nu de eerste 10 problemen van PE opgelost, dus ik wil nu weer verder leren.
Ik zal het een keer gaan lezen en dan zie ik wel hoe ver ik kom.
netolkdonderdag 2 augustus 2012 @ 13:08
Voor een goede pointer uitleg kun je ook op youtube kijken dan moet je even zoeken naar pointer fun ik zit nu op mijn mobiel alleen dan doet youtube raar als ik de link van het filmpje wil. Een reference is eigenlijk een soort pointer, hij wijst naar een bepaald object die je vervolgens kan bewerken (is heel handig als functies bijvoorbeeld wat toe moeten voegen aan een vector)
thabitdonderdag 2 augustus 2012 @ 13:57
Een reference is een pointer waarbij je in de notatie het sterretje weglaat. Andere verschillen: een reference kan niet 0 zijn, moet direct geïnitialiseerd worden, en kan daarna niet veranderd worden.
thabitdonderdag 2 augustus 2012 @ 14:08
Een toepassing van references in jouw code zou bijvoorbeeld kunnen zijn dat je
1vector<int> vereniging(vector<int> a, vector<int> b)
vervangt door
1vector<int> vereniging(vector<int>& a, vector<int>& b)
In het bovenste geval worden er bij het doorgeven van de vectoren copy-constructors op a en b uitgevoerd, en destructors bij het verlaten van de functie. In het onderste geval worden er references naar reeds bestaande vectoren doorgegeven, en hoeven er op a en b geen constructors of destructors te worden uitgevoerd.
GS42donderdag 2 augustus 2012 @ 14:10
quote:
0s.gif Op donderdag 2 augustus 2012 13:57 schreef thabit het volgende:
[...] een reference kan niet 0 zijn [...]
1int const &a = 0;
:)
thabitdonderdag 2 augustus 2012 @ 14:17
quote:
0s.gif Op donderdag 2 augustus 2012 14:10 schreef GS42 het volgende:

[..]
[ code verwijderd ]

:)
Okee, okee, maar de C++ standaard definieert geen null references, in tegenstelling tot Java, waar references null by default zijn en ook kunnen veranderen.
t4rt4rusdonderdag 2 augustus 2012 @ 17:49
quote:
0s.gif Op donderdag 2 augustus 2012 14:08 schreef thabit het volgende:
Een toepassing van references in jouw code zou bijvoorbeeld kunnen zijn dat je
[ code verwijderd ]

vervangt door
[ code verwijderd ]

In het bovenste geval worden er bij het doorgeven van de vectoren copy-constructors op a en b uitgevoerd, en destructors bij het verlaten van de functie. In het onderste geval worden er references naar reeds bestaande vectoren doorgegeven, en hoeven er op a en b geen constructors of destructors te worden uitgevoerd.
Neem dan ook gelijk een constant reference, is wat netter. :)
thenxerodonderdag 2 augustus 2012 @ 22:27
quote:
0s.gif Op donderdag 2 augustus 2012 14:08 schreef thabit het volgende:
Een toepassing van references in jouw code zou bijvoorbeeld kunnen zijn dat je
[ code verwijderd ]

vervangt door
[ code verwijderd ]

In het bovenste geval worden er bij het doorgeven van de vectoren copy-constructors op a en b uitgevoerd, en destructors bij het verlaten van de functie. In het onderste geval worden er references naar reeds bestaande vectoren doorgegeven, en hoeven er op a en b geen constructors of destructors te worden uitgevoerd.
Wordt de code daar sneller door? Of wat zijn anders de voordelen?
thabitdonderdag 2 augustus 2012 @ 22:28
quote:
0s.gif Op donderdag 2 augustus 2012 22:27 schreef thenxero het volgende:

[..]

Wordt de code daar sneller door?
In het algemeen wel, al kan het nooit kwaad om het te testen.
thenxerodonderdag 2 augustus 2012 @ 23:11
quote:
0s.gif Op donderdag 2 augustus 2012 13:08 schreef netolk het volgende:
Voor een goede pointer uitleg kun je ook op youtube kijken dan moet je even zoeken naar pointer fun

_O-
t4rt4rusdonderdag 2 augustus 2012 @ 23:58
in C++ heb je trouwens iets veel beters dan malloc :)

Daar kan je gewoon dit doen:
int *iptr = new int;

ipv
int *iptr = malloc(sizeof(int));
thenxerovrijdag 3 augustus 2012 @ 00:43
quote:
0s.gif Op donderdag 2 augustus 2012 23:58 schreef t4rt4rus het volgende:
in C++ heb je trouwens iets veel beters dan malloc :)

Daar kan je gewoon dit doen:
int *iptr = new int;

ipv
int *iptr = malloc(sizeof(int));
Ja zo heb ik het ook geleerd. Dat malloc vond ik al vaag, maar dat is dus voor C.
netolkvrijdag 3 augustus 2012 @ 01:00
Ja er bestaat er ook een voor c++ het enige verschil is dat malloc word vervangen door new
Ai_KaRaMBavrijdag 3 augustus 2012 @ 09:46
Let daarmee op dat je in C++ 2 soorten "free()" hebt!! Als je het verkeerd doet, krijg je memory leaks...

1
2
3
4
5
6
7
int *a = new int;
int *b = new int[10];

// ...

delete a;
delete[] b;

versus

1
2
3
4
5
6
7
int *a = (int*)malloc(sizeof(int));
int *b = (int*)malloc(sizeof(int)*10);

//...

free(a);
free(b);
Dale.vrijdag 3 augustus 2012 @ 09:58
quote:
0s.gif Op vrijdag 3 augustus 2012 00:43 schreef thenxero het volgende:

[..]

Ja zo heb ik het ook geleerd. Dat malloc vond ik al vaag, maar dat is dus voor C.
Het is niet vaag. Het enigste wat het doet is memory alloceren voor waar de integer in geplaatst kan worden. Met sizeof(int) vraagt hij de grootte op van een integer in bytes. Met malloc reserveerd hij vervolgens dus die grootte.
netolkvrijdag 3 augustus 2012 @ 17:18
Klopt idd alleen is new veel duidelijker en overzichtelijker in gebruik
t4rt4rusvrijdag 3 augustus 2012 @ 17:33
quote:
0s.gif Op vrijdag 3 augustus 2012 09:46 schreef Ai_KaRaMBa het volgende:
Let daarmee op dat je in C++ 2 soorten "free()" hebt!! Als je het verkeerd doet, krijg je memory leaks...
[ code verwijderd ]

versus
[ code verwijderd ]

Het nut daarvan begrijp ik nog niet echt...

En was het niet zo dat je delete[] bij alles kon gebruiken?
1
2
int *i = new int;
delete[] i;

Oh wacht is het mogelijk om dit te doen?
1
2
3
4
int *i = new int[4];
delete &i[3];
delete[] &i[1];
delete i;
t4rt4rusvrijdag 3 augustus 2012 @ 17:35
quote:
0s.gif Op vrijdag 3 augustus 2012 17:33 schreef t4rt4rus het volgende:

[..]

Het nut daarvan begrijp ik nog niet echt...

En was het niet zo dat je delete[] bij alles kon gebruiken?
[ code verwijderd ]

Oh wacht is het mogelijk om dit te doen?
[ code verwijderd ]

edit zo te zien niet...
Waar is die delete[] dan voor nodig? :P
Lijkt me dat er maar 1 geheugen block gereserveerd word en niet allemaal losse.
Ai_KaRaMBavrijdag 3 augustus 2012 @ 17:38
De officiele verklaring is, dat er een andere destructor wordt aangeroepen. Maar eigenlijk begrijp ik zelf ook niet helemaal waarom daar een andere delete voor nodig is... (en waarom je de verkeerde delete wel kan gebruiken zonder een compile time / runtime waarschuwing)
t4rt4rusvrijdag 3 augustus 2012 @ 17:40
Ah wacht bedankt nu weet ik het weer. :)
delete[] called alle destructors delete niet.

Nog een vraagje... delete throws toch een exception als die faalt?
Ik heb een delete in try catch block en krijg gewoon runtime error, vaag.
thabitvrijdag 3 augustus 2012 @ 19:06
delete verwijdert alleen de int op plek i, delete[] verwijdert de hele array
t4rt4rusvrijdag 3 augustus 2012 @ 19:11
quote:
0s.gif Op vrijdag 3 augustus 2012 19:06 schreef thabit het volgende:
delete verwijdert alleen de int op plek i, delete[] verwijdert de hele array
Wat versta je onder verwijderen?

Volgens mij deallocaten delete en delete[] beide een array,
delete callt alleen de destructor van de eerste.

Of denk ik fout?
thabitvrijdag 3 augustus 2012 @ 19:43
Wat delete precies dealloceert in dit geval is volgens mij niet door de standaard gedefinieerd. Als delete zo geïmplementeerd is dat het free() gebruikt, dan zal die waarschijnlijk de hele array dealloceren, maar dat is dus allemaal implementatie-afhankelijk.
t4rt4rusvrijdag 3 augustus 2012 @ 20:51
quote:
0s.gif Op vrijdag 3 augustus 2012 19:43 schreef thabit het volgende:
Wat delete precies dealloceert in dit geval is volgens mij niet door de standaard gedefinieerd. Als delete zo geïmplementeerd is dat het free() gebruikt, dan zal die waarschijnlijk de hele array dealloceren, maar dat is dus allemaal implementatie-afhankelijk.
Ik kijk wel even in mijn C++11 documentation van x aantal euro's...
t4rt4rusvrijdag 3 augustus 2012 @ 22:06
Ik ben nu ook met Project Euler bezig.
In C++ en asm amd64. :)
GS42vrijdag 3 augustus 2012 @ 23:01
quote:
0s.gif Op vrijdag 3 augustus 2012 19:11 schreef t4rt4rus het volgende:

[..]

Wat versta je onder verwijderen?

Volgens mij deallocaten delete en delete[] beide een array,
delete callt alleen de destructor van de eerste.

Of denk ik fout?
Nee, volgens mij klopt dit niet. Opzich zijn new en delete niet lastig:

De operator new doet twee dingen:
1. Alloceert ruimte voor het object en
2. Initialiseert het object met diens constructor tenzij het een basistype betreft en geen constuctor-notitie is gebruikt, dan wordt het misschien niet geinitialiseerd, zie de annotations.

Hetzelfde maar omgekeerde geldt voor operator delete. Deze:
1. Roept de destructor van het object aan (als deze bestaat) en
2. Geeft het gealloceerde geheugen weer vrij.

Idem voor operator new[] en delete[], behalve dat deze het voor meerdere objecten doen.

Jij vraagt je volgens mij af wat er gebeurt als je delete aanroept op een pointer die met new[] is aangemaakt. Het simpele antwoord: geen idee. C++ zegt hier niets over. In het allerbeste geval snapt jouw compiler wat je bedoelt en verwijdert deze de hele array. In het slechtste geval crasht je programma. In ieder geval is je code slecht. Oftewel, niet doen. ;)

Ik weet niet waarom gekozen is voor twee verschillende vormen van delete. Ik kan wel gokken: waarschijnlijk het is sneller. Als je voor elk enkel gealloceerd object moet onthouden dat het om een array van 1 object gaat, of altijd bij elke delete moet controleren of je een enkel object of een array verwijdert, verlies je tijd.
t4rt4ruszaterdag 4 augustus 2012 @ 00:34
Ok zullen we het nu over `operator new' en `placement new' hebben? :P
Zijn ook nog vormen van new.
thenxerozaterdag 4 augustus 2012 @ 00:35
quote:
0s.gif Op vrijdag 3 augustus 2012 22:06 schreef t4rt4rus het volgende:
Ik ben nu ook met Project Euler bezig.
In C++ en asm amd64. :)
Hoe ver ben je? Ik heb 1 tm 10 en 12 nu gedaan. Voor 11 moet ik nog uit zien te vogelen hoe je een matrix laadt.
t4rt4ruszaterdag 4 augustus 2012 @ 00:37
quote:
0s.gif Op zaterdag 4 augustus 2012 00:35 schreef thenxero het volgende:

[..]

Hoe ver ben je? Ik heb 1 tm 10 en 12 nu gedaan. Voor 11 moet ik nog uit zien te vogelen hoe je een matrix laadt.
Heb 1 en 2 vandaag gedaan. :P
Wil je mijn oplossing zien?

Nummer 2 is echt nice in asm :)
thenxerozaterdag 4 augustus 2012 @ 00:40
quote:
0s.gif Op zaterdag 4 augustus 2012 00:37 schreef t4rt4rus het volgende:

[..]

Heb 1 en 2 vandaag gedaan. :P
Wil je mijn oplossing zien?

Nummer 2 is echt nice in asm :)
Doe maar via DM
t4rt4ruszaterdag 4 augustus 2012 @ 14:55
thenxero had een vraag over hoe je kan zien hoe een getal even of oneven is.
Hij deed dit zelf met `x % 2', maar dit kan echter ook met `x & 1'.

De eerst maakt gebruik van de modulo operator.
`x % y' geeft je de rest (remainder) van het delen van x door y.
Als x deelbaar is door y geeft dit 0.

Even getallen zijn deelbaar door 2,
met `x % 2' kan je dus kijken of x even of oneven is.

Er is echter ook een andere mogelijkheid en dat is de bitwise AND operator `&'.
`x & y' geeft de logical AND van x en y per bit.

Bijvoorbeeld:
11 & 6,
in binaire weergave
1011 & 0110 = 0010

Omdat even getallen een 0 hebben in de eerste bit,
kan je met `x & 1' testen of x even of oneven is.


Andere bitwise operators in C zijn:
`|' inclusive OR;
`^' exclusive OR;
`~' complement;
en de right en left shift, `>>' en `<<'.

[ Bericht 10% gewijzigd door t4rt4rus op 04-08-2012 15:03:11 ]
thenxerozaterdag 4 augustus 2012 @ 16:25
Bedankt, dat wist ik niet. Jouw methode is ongetwijfeld sneller omdat er niet gerekend hoeft te worden. :)

[ Bericht 21% gewijzigd door thenxero op 04-08-2012 16:30:52 ]
thabitzaterdag 4 augustus 2012 @ 16:29
Dat is toch de rest? Het enige probleem is dat C(++) er vreemde conventies op nahoudt wat betreft positief en negatief.
thenxerozaterdag 4 augustus 2012 @ 16:31
Je hebt gelijk.

En over wat voor vreemde conventies heb je het? Met modulus?
thabitzaterdag 4 augustus 2012 @ 17:03
a%b heeft in C hetzelfde teken als a, dus -9 % 2 = -1 en niet 1. Dat is een nogal debiele conventie, het zou alleen van de restklasse van a moeten afhangen, niet van het teken.
thenxerozaterdag 4 augustus 2012 @ 18:43
quote:
0s.gif Op zaterdag 4 augustus 2012 17:03 schreef thabit het volgende:
a%b heeft in C hetzelfde teken als a, dus -9 % 2 = -1 en niet 1. Dat is een nogal debiele conventie, het zou alleen van de restklasse van a moeten afhangen, niet van het teken.
Komt dat niet gewoon doordat -9%2 geïnterpreteerd wordt als -(9%2) ?
thabitzaterdag 4 augustus 2012 @ 18:47
quote:
0s.gif Op zaterdag 4 augustus 2012 18:43 schreef thenxero het volgende:

[..]

Komt dat niet gewoon doordat -9%2 geïnterpreteerd wordt als -(9%2) ?
Nee, de unaire - heeft prioriteit over %.
GS42zaterdag 4 augustus 2012 @ 19:05
quote:
0s.gif Op zaterdag 4 augustus 2012 17:03 schreef thabit het volgende:
a%b heeft in C hetzelfde teken als a, dus -9 % 2 = -1 en niet 1. Dat is een nogal debiele conventie, het zou alleen van de restklasse van a moeten afhangen, niet van het teken.
Zover ik weet was dit vroeger afhankelijk van de implementatie: C en C++ gaven geen garanties over het teken van het resultaat als een van de argumenten van de modulo-operator negatief was.

In de C++11 standaard staat dit:

quote:
5.6.4
The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined. For integral operands the / operator yields the algebraic quotient with any fractional part discarded; if the quotient a/b is representable in the type of the result, (a/b)*b + a%b is equal to a.
Dit laat zien waarom je wel wilt dat het resultaat negatief is. Immers, je wilt dat (-10/3) * 3 + (-10%3) == -10 en dat geldt alleen als het resultaat van beide negatief is. Maar ga er in oudere C++ versies dus niet zomaar vanuit dat het resultaat werkelijk negatief is: oppassen dus.

quote:
0s.gif Op zaterdag 4 augustus 2012 16:25 schreef thenxero het volgende:
Bedankt, dat wist ik niet. Jouw methode is ongetwijfeld sneller omdat er niet gerekend hoeft te worden. :)

Ik verwacht in de praktijk van niet. De compiler optimaliseert hier ongetwijfeld voor: deze zal dezelfde code genereren voor beide statements.
thabitzaterdag 4 augustus 2012 @ 19:10
De / operator is dus ook niet goed, die zou a/b altijd naar beneden moeten afronden als b>0. Naar 0 afronden is duidelijk bedacht door iemand die geen wiskundig inzicht heeft.
thabitzaterdag 4 augustus 2012 @ 19:24
Gelukkig doet Python het wel goed:
1
2
3
4
5
6
7
8
>>> 5 / 3
1
>>> -5 / 3
-2
>>> 5 % 3
2
>>> -5 % 3
1
t4rt4ruszaterdag 4 augustus 2012 @ 20:30
gcc 4.7.1-5 met -std=c++11 geeft daar
1
2
3
4
5
5 / 3 = 1
-5 / 3 = -1

5 % 3 = 2
-5 % 3 = -2

edit:
En dit klopt toch ook gewoon...?
Volgens mij klopt python niet echt.

edit 2:
Euh beiden kloppen...
Als -5/3 = -2 is dan moet -5%3 = 1 zijn.
Is -5/3 = -1 dan moet -5%3 = -2 zijn.

Ik vind de laatste echter wat logischer...

-5/3 = -(5/3)
-5%3=-(5%3)

[ Bericht 13% gewijzigd door t4rt4rus op 04-08-2012 20:46:02 ]
thabitzaterdag 4 augustus 2012 @ 21:22
Logischer is als (a + b) / b altijd gelijk is aan a / b + 1. Dat is bij C niet het geval.
t4rt4ruszaterdag 4 augustus 2012 @ 21:49
Ohja voor referenties zie deze site http://cppreference.com
die is wel goed :)
thenxerozaterdag 4 augustus 2012 @ 23:57
quote:
0s.gif Op zaterdag 4 augustus 2012 19:05 schreef GS42 het volgende:

[..]

Ik verwacht in de praktijk van niet. De compiler optimaliseert hier ongetwijfeld voor: deze zal dezelfde code genereren voor beide statements.
Ik heb het even getest door dergelijke expressies miljarden keren uit te voeren. Het blijkt dat de & statement 1.8 keer sneller is dan de % statement, dus er zit wel degelijk verschil in.
thabitzondag 5 augustus 2012 @ 00:00
quote:
0s.gif Op zaterdag 4 augustus 2012 23:57 schreef thenxero het volgende:

[..]

Ik heb het even getest door dergelijke expressies miljarden keren uit te voeren. Het blijkt dat de & statement 1.8 keer sneller is dan de % statement, dus er zit wel degelijk verschil in.
Heb je optimalisatieflags meegegeven?
thenxerozondag 5 augustus 2012 @ 00:03
quote:
0s.gif Op zondag 5 augustus 2012 00:00 schreef thabit het volgende:

[..]

Heb je optimalisatieflags meegegeven?
Nee, ik weet niet hoe dat werkt
thabitzondag 5 augustus 2012 @ 00:05
Welke compiler gebruik je?
thenxerozondag 5 augustus 2012 @ 00:08
quote:
0s.gif Op zondag 5 augustus 2012 00:05 schreef thabit het volgende:
Welke compiler gebruik je?
GNU GCC
thabitzondag 5 augustus 2012 @ 00:10
Okee, dan kun je gewoon -O3 (of -O2, is soms sneller) meegeven. Interessant om te kijken of dat nog steeds zo veel tijdsverschil geeft.
thenxerozondag 5 augustus 2012 @ 00:18
quote:
0s.gif Op zondag 5 augustus 2012 00:10 schreef thabit het volgende:
Okee, dan kun je gewoon -O3 (of -O2, is soms sneller) meegeven. Interessant om te kijken of dat nog steeds zo veel tijdsverschil geeft.
Waar moet ik die -O3 of -O2 neerzetten?
thabitzondag 5 augustus 2012 @ 00:26
Bijvoorbeeld: gcc (of g++) -O3 blabla.cpp etc.
thenxerozondag 5 augustus 2012 @ 00:40
Dan is er geen tijdsverschil meer
t4rt4ruszondag 5 augustus 2012 @ 01:04
quote:
14s.gif Op zondag 5 augustus 2012 00:40 schreef thenxero het volgende:
Dan is er geen tijdsverschil meer
Maar beste manier is gewoon om `x & 1' te gebruiken.
thabitzondag 5 augustus 2012 @ 01:16
quote:
0s.gif Op zondag 5 augustus 2012 01:04 schreef t4rt4rus het volgende:

[..]

Maar beste manier is gewoon om `x & 1' te gebruiken.
Maar dan ook alleen vanwege het probleem met + en -. :P.
GS42zondag 5 augustus 2012 @ 01:50
quote:
0s.gif Op zondag 5 augustus 2012 01:04 schreef t4rt4rus het volgende:

Maar beste manier is gewoon om `x & 1' te gebruiken.
Ben ik niet met je eens. Hiermee doe je namelijk een gevaarlijke aanname, namelijk dat 'oneven' gelijk is aan 'een 1 op het minst significante bit'. Dit is niet altijd zo: kijk bijvoorbeeld naar negatieve getallen in ones' compliment.

Je kunt volgens mij het beste schijven wat je bedoelt. Als je wilt weten of een getal even of oneven is, dan wil je weten wat de rest is na een deling door twee. Dat is x % 2: wiskundig gezien altijd juist, het werkt op elk systeem en iedereen weet onmiddelijk wat de code doet. Alleen als je het minst significante bit wilt hebben, schrijf je x & 1.

Alleen als je enkel voor jezelf aan het programmeren bent en je de code nooit op een ander system hoeft te gebruiken, kan je zulke aannames zonder veel problemen doen. Maar we hebben net al gezien dat er geen winst is qua snelheid: de compiler kan prima omgaan met zulke systeem-specifieke optimalisaties en doet het automatisch. Dus waarom zou je het zelf doen?

In mijn ogen levert het gevaarlijke, minder leesbare code op zonder dat je er iets mee opschiet. Dus gewoon schijven wat je bedoelt, niet wat je denkt dat het snelste is.
t4rt4ruszondag 5 augustus 2012 @ 01:54
quote:
0s.gif Op zondag 5 augustus 2012 01:50 schreef GS42 het volgende:

[..]

Ben ik niet met je eens. Hiermee doe je namelijk een gevaarlijke aanname, namelijk dat 'oneven' gelijk is aan 'een 1 op het minst significante bit'. Dit is niet altijd zo: kijk bijvoorbeeld naar negatieve getallen in ones' compliment.
ones' compliment wordt nergens gebruikt... toch? :P
GS42zondag 5 augustus 2012 @ 01:56
quote:
0s.gif Op zondag 5 augustus 2012 01:54 schreef t4rt4rus het volgende:

ones' compliment wordt nergens gebruikt... toch? :P
Niet dat ik weet inderdaad, maar het punt blijft. :P
t4rt4ruszondag 5 augustus 2012 @ 01:57
quote:
0s.gif Op zondag 5 augustus 2012 01:56 schreef GS42 het volgende:

[..]

Niet dat ik weet inderdaad, maar het punt blijft. :P
Ok je hebt wel een punt... Maar toch :P

Is er nog iets leuks in C++ waar we over kunnen praten?
templates, classes?
GS42zondag 5 augustus 2012 @ 02:03
quote:
0s.gif Op zondag 5 augustus 2012 01:57 schreef t4rt4rus het volgende:

[..]

Ok je hebt wel een punt... Maar toch :P

Is er nog iets leuks in C++ waar we over kunnen praten?
templates, classes?
Misschien iets waar ik zelf een keer flink over gestruikeld ben, namelijk het verschil tussen static_cast en reinterpret_cast en wanneer je welke moet gebruiken. Bijvoorbeeld a) welke je gebruikt om van char naar int te casten, of van void* naar int* en b) waarom. Enig idee?
t4rt4ruszondag 5 augustus 2012 @ 02:43
quote:
0s.gif Op zondag 5 augustus 2012 02:03 schreef GS42 het volgende:

[..]

Misschien iets waar ik zelf een keer flink over gestruikeld ben, namelijk het verschil tussen static_cast en reinterpret_cast en wanneer je welke moet gebruiken. Bijvoorbeeld a) welke je gebruikt om van char naar int te casten, of van void* naar int* en b) waarom. Enig idee?
static_cast is om te casten van int naar double, enum naar int, unsiged <-> signed en van derived classes naar base class.

Met reinterpret_cast kan je gewoon alles doen en checkt je compiler volgens mij helemaal niks.
GS42zondag 5 augustus 2012 @ 03:07
Dus welke gebruik je om

1. van char naar int en
2. van void* naar int*

te casten en waarom? :)
t4rt4ruszondag 5 augustus 2012 @ 03:31
quote:
0s.gif Op zondag 5 augustus 2012 03:07 schreef GS42 het volgende:
Dus welke gebruik je om

1. van char naar int en
2. van void* naar int*

te casten en waarom? :)
1. static_cast. char en int zijn types die hetzelfde weergeven (getallen), het enige verschil is dat een int meer bytes in beslag kan nemen.

Ohja was ik nog vergeten te vertellen, reinterpret_cast wil volgens mij alleen maar op pointers omdat deze altijd hetzelfde aantal bytes innemen. char en int kunnen verschillen van grootte en daarom kan een char niet herinterpreteren naar een int.

2. reinterpret_cast omdat je pointer naar een ander type verwijst.

[ Bericht 6% gewijzigd door t4rt4rus op 05-08-2012 10:32:26 ]
t4rt4ruszondag 5 augustus 2012 @ 10:30
En dan hebben we ook nog const_cast en dynamic_cast :)
GS42zondag 5 augustus 2012 @ 11:56
quote:
0s.gif Op zondag 5 augustus 2012 03:31 schreef t4rt4rus het volgende:

[..]

1. static_cast. char en int zijn types die hetzelfde weergeven (getallen), het enige verschil is dat een int meer bytes in beslag kan nemen.
Klopt inderdaad. Static_cast kan verschillende dingen doen, maar het converteert altijd tussen gerelateerde typen. Die relatie kan zijn:

- Zelfde soort fundamentele datatypes, zoals char en int beide integer-types zijn. Daarbij kan static_cast directe omzetting van bitpatronen gebruiken (waarbij er indien nodig naar beneden wordt afgerond).

- Een base, parent of composite verbinding van inheritance.

- Een constructor of operator Type() van classes.

Simpel gezegd: er moet een manier zijn om van A naar B te komen. Belangrijk om te realiseren is: static_cast<X>(Y) maakt een nieuw X-object aan en initialiseert dit met Y. Ze hoeven dus niet gelijk aan elkaar te zijn.

quote:
Ohja was ik nog vergeten te vertellen, reinterpret_cast wil volgens mij alleen maar op pointers omdat deze altijd hetzelfde aantal bytes innemen. char en int kunnen verschillen van grootte en daarom kan een char niet herinterpreteren naar een int.

2. reinterpret_cast omdat je pointer naar een ander type verwijst.
Ja, dat dacht ik eerst ook. Maar het is dus niet zo: void* is gerelateerd aan alle pointer typen en dus moet je gebruik maken van static_cast. Je hebt gelijk over de functie van reinterpret_cast: deze interpreteert een geheugenadres als een ander type. Hierbij verandert die cast gegarandeerd niets aan het geheugen: alles blijft zoals het is.

Het belangrijke hier is: een int* kan er anders uitzien in het geheugen dan een void* (of X*). Alleen de grootte is gegarandeerd hetzelfde, niet de memory-layout. DIt betekent dat er misschien werk moet worden gedaan om van een void* een int* te maken. En dat doet reinterpret_cast niet.

Er is 1 uitzondering op bovenstaand verhaal, namelijk als de void* die we proberen te casten, gemaakt is met reinterpret_cast<void*>(int*). Alleen in dat geval moet je terugcasten met dezelfde cast, om duidelijke redenen.

Dit vind ik niet duidelijk in de (online) naslagwerken staan, vandaar dat ik het vroeg. :)
t4rt4ruszondag 5 augustus 2012 @ 12:06
quote:
0s.gif Op zondag 5 augustus 2012 11:56 schreef GS42 het volgende:

[..]

Klopt inderdaad. Static_cast kan verschillende dingen doen, maar het converteert altijd tussen gerelateerde typen. Die relatie kan zijn:

- Zelfde soort fundamentele datatypes, zoals char en int beide integer-types zijn. Daarbij kan static_cast directe omzetting van bitpatronen gebruiken (waarbij er indien nodig naar beneden wordt afgerond).

- Een base, parent of composite verbinding van inheritance.

- Een constructor of operator Type() van classes.

Simpel gezegd: er moet een manier zijn om van A naar B te komen. Belangrijk om te realiseren is: static_cast<X>(Y) maakt een nieuw X-object aan en initialiseert dit met Y. Ze hoeven dus niet gelijk aan elkaar te zijn.

[..]

Het belangrijke hier is: een int* kan er anders uitzien in het geheugen dan een void* (of X*). Alleen de grootte is gegarandeerd hetzelfde, niet de memory-layout. DIt betekent dat er misschien werk moet worden gedaan om van een void* een int* te maken. En dat doet reinterpret_cast niet.
Maar er hoeft helemaal geen werk worden gedaan. Alleen de pointer moet anders geherinterpreteerd worden.
Maar ik denk dat dit een uitzondering is op wat is toegestaan.

void * geeft al aan dat het onbekend is waar de pointer naar wijst. En ik denk dat ze daarom toe staan om te static casten naar een andere pointer type.
Netzoals je kan static casten van een Derived Class naar Base class.

Echter van char * naar int * of andersom kan niet met de static cast.

Ik lees zo wel even C++11 docu als ik die nog heb...
t4rt4ruszondag 5 augustus 2012 @ 12:15
5.2.7 t/m 5.2.11 gaan over casts.
Lees het straks wel even door :P

Zou ik het hier mogen posten...?
GS42zondag 5 augustus 2012 @ 12:16
quote:
Maar er hoeft helemaal geen werk worden gedaan. Alleen de pointer moet anders geherinterpreteerd worden.
Een pointer is ook een object, vergeet dat niet. En een void-pointer hoeft niet gelijk te zijn aan een int-pointer, dus moet er mogelijk werk worden gedaan.

quote:
En ik denk dat ze daarom toe staan om te static casten naar een andere pointer type.
Het wordt toegestaan omdat void* aan alle pointer-types is gerelateerd. Immers, void *a = &X is altijd geldig.

[ Bericht 0% gewijzigd door GS42 op 05-08-2012 17:00:12 ]
t4rt4ruszondag 5 augustus 2012 @ 12:18
quote:
0s.gif Op zondag 5 augustus 2012 12:16 schreef GS42 het volgende:

[..]

Een pointer is ook een object, vergeet dat niet. En een void-pointer hoeft niet gelijk te zijn aan een int-pointer, dus moet er mogelijk worden gedaan.
Wat zou er gedaan moeten worden dan?
Memory adres is een memory adres wat er op de adres staat maakt helemaal niks uit.
#ANONIEMzondag 5 augustus 2012 @ 12:59
Ik heb dit boek thuis nog liggen (van mijn pa):

http://www.bol.com/nl/p/basiscursus-c/666842990/

Basiscursus C++ van L. Ammeraal uit 1997. Is er in de loop der tijd veel veranderd? Zou ik dit boek nog kunnen gebruiken?
GS42zondag 5 augustus 2012 @ 13:07
quote:
0s.gif Op zondag 5 augustus 2012 12:18 schreef t4rt4rus het volgende:

[..]

Wat zou er gedaan moeten worden dan?
Memory adres is een memory adres wat er op de adres staat maakt helemaal niks uit.
Wat er precies gedaan zou moeten worden, maakt niet zoveel uit. Het belangrijke is: C++ geeft geen garanties over pointer-representatie en dus hoeft een X* niet gelijk te zijn aan een Y*. Het kan bijvoorbeeld zo zijn dat een pointer naar een fundamenteel datatype (zoals void) er anders uitziet dan een pointer naar een klasse. Dan moet de een echt in de ander omgezet worden. Dit is niet alleen theoretisch, ik heb mensen gesproken die het probleem ook werkelijk in de praktijk zijn tegengekomen.

Een "memory adres is een memory adres" kan wel waar zijn, maar een X-pointer hoeft geen Y-pointer te zijn. ;)
GS42zondag 5 augustus 2012 @ 13:17
quote:
0s.gif Op zondag 5 augustus 2012 12:59 schreef robin007bond het volgende:
Ik heb dit boek thuis nog liggen (van mijn pa):

http://www.bol.com/nl/p/basiscursus-c/666842990/

Basiscursus C++ van L. Ammeraal uit 1997. Is er in de loop der tijd veel veranderd? Zou ik dit boek nog kunnen gebruiken?
In 1998, 2003 en 2011 zijn er nieuwe 'versies' van C++ uitgekomen waarbij vooral dingen zijn toegevoegd. De basis is volgens mij niet zo sterk veranderd en daarom lijkt het me geen probleem om met zo'n boek te beginnen. (Ik ken het boek verder niet, dus dit is algemeen gesteld.)
#ANONIEMzondag 5 augustus 2012 @ 13:18
quote:
0s.gif Op zondag 5 augustus 2012 13:17 schreef GS42 het volgende:

[..]

In 1998, 2003 en 2011 zijn er nieuwe 'versies' van C++ uitgekomen waarbij vooral dingen zijn toegevoegd. De basis is volgens mij niet zo sterk veranderd en daarom lijkt het me geen probleem om met zo'n boek te beginnen. (Ik ken het boek verder niet, dus dit is algemeen gesteld.)
Hmm, oké. Duidelijk.

Misschien dat ik beter een recent boek kan kopen. Ik zal wel even kijken.

Veel mensen raden ook aan eerst C te leren, omdat C++ een superset van C zou zijn. De OP zegt eigenlijk van niet en ik heb er ook mijn twijfels bij.
GS42zondag 5 augustus 2012 @ 13:23
quote:
Veel mensen raden ook aan eerst C te leren, omdat C++ een superset van C zou zijn. De OP zegt eigenlijk van niet en ik heb er ook mijn twijfels bij.
Wordt vaak gezegd maar is inderdaad niet helemaal waar. Er zijn dingen die in C legaal zijn maar in C++ niet mogen en er zijn zelfs dingen die in C een andere betekenis hebben dan in C++. Dat gezegd hebbende, er zijn wel erg veel overeenkomsten.

Je kunt prima C++ leren zonder C eerst gedaan te hebben. Je hoeft dan zelfs minder dingen af te leren en kan ook grote gedeeltes van C 'overslaan' omdat het in C++ anders (beter :P) kan. Dus het hoeft zeker niet. Wel is een goed boek belangrijk. Eerder in dit topic heb ik daar dacht ik al wat over geschreven, misschien dat dat je helpt.
thenxerozondag 5 augustus 2012 @ 13:48
Volgens mij is het met uitsluitend tutorials op internet ook wel goed te doen.
t4rt4ruszondag 5 augustus 2012 @ 13:52
quote:
0s.gif Op zondag 5 augustus 2012 13:48 schreef thenxero het volgende:
Volgens mij is het met uitsluitend tutorials op internet ook wel goed te doen.
Wat versta jij onder tutorial?

Een professor van mij heeft zelf een boek geschreven en deze staat ook gratis op internet
http://www.icce.rug.nl/documents/cplusplus/
thenxerozondag 5 augustus 2012 @ 13:56
quote:
0s.gif Op zondag 5 augustus 2012 13:52 schreef t4rt4rus het volgende:

[..]

Wat versta jij onder tutorial?

Een professor van mij heeft zelf een boek geschreven en deze staat ook gratis op internet
http://www.icce.rug.nl/documents/cplusplus/
Ik bedoel gewoon dat je zo'n beetje alles wel op internet kan vinden, zoals je zelf ook al een beetje aangeeft. Bedankt voor die link trouwens :)
t4rt4ruszondag 5 augustus 2012 @ 14:00
quote:
0s.gif Op zondag 5 augustus 2012 13:56 schreef thenxero het volgende:

[..]

Ik bedoel gewoon dat je zo'n beetje alles wel op internet kan vinden, zoals je zelf ook al een beetje aangeeft. Bedankt voor die link trouwens :)
Hebben we niet echt veel aan.
Dan kan ik ook zeggen zo'n beetje alles wel op aarde te vinden is. :P
thenxerozondag 5 augustus 2012 @ 14:01
quote:
0s.gif Op zondag 5 augustus 2012 14:00 schreef t4rt4rus het volgende:

[..]

Hebben we niet echt veel aan.
Dan kan ik ook zeggen zo'n beetje alles wel op aarde te vinden is. :P
Gelukkig bestaat er zoiets als Google om je over die zee van informatie te navigeren.
t4rt4ruszondag 5 augustus 2012 @ 14:04
quote:
0s.gif Op zondag 5 augustus 2012 14:01 schreef thenxero het volgende:

[..]

Gelukkig bestaat er zoiets als Google om je over die zee van informatie te navigeren.
Maar google weet niet of iets ook waardevolle informatie bevat.
thenxerozondag 5 augustus 2012 @ 14:06
Ik vond dat deze site waardevolle informatie bevat, en die komt gewoon als eerste resultaat als je op c++ tutorial zoekt.
t4rt4ruszondag 5 augustus 2012 @ 14:07
quote:
0s.gif Op zondag 5 augustus 2012 14:06 schreef thenxero het volgende:
Ik vond dat deze site waardevolle informatie bevat, en die komt gewoon als eerste resultaat als je op c++ tutorial zoekt.
hehe dat is nou net een site die foute informatie bevat...
thenxerozondag 5 augustus 2012 @ 14:08
quote:
0s.gif Op zondag 5 augustus 2012 14:07 schreef t4rt4rus het volgende:

[..]

hehe dat is nou net een site die foute informatie bevat...
Dat zal wel, bijna iedere informatiebron bevat foute informatie.
t4rt4ruszondag 5 augustus 2012 @ 14:12
quote:
0s.gif Op zondag 5 augustus 2012 14:08 schreef thenxero het volgende:

[..]

Dat zal wel, bijna iedere informatiebron bevat foute informatie.
Heb veel C++ experts horen zeggen dat je daar echt niet veel aan hebt.
Ok voor basics ja maar voor meer details heb je toch echt een betere site/boek nodig.

Een goed boek bevat veel meer informatie.

Voor bijvoorbeeld alle functies kan je goede informatie vinden op
http://en.cppreference.com/w/
t4rt4ruszondag 5 augustus 2012 @ 14:18
quote:
0s.gif Op zondag 5 augustus 2012 14:07 schreef t4rt4rus het volgende:

[..]

hehe dat is nou net een site die foute informatie bevat...
Check dit eens ;)
http://jcatki.no-ip.org/fncpp/Resources
thabitzondag 5 augustus 2012 @ 14:22
quote:
0s.gif Op zondag 5 augustus 2012 12:59 schreef robin007bond het volgende:
Ik heb dit boek thuis nog liggen (van mijn pa):

http://www.bol.com/nl/p/basiscursus-c/666842990/

Basiscursus C++ van L. Ammeraal uit 1997. Is er in de loop der tijd veel veranderd? Zou ik dit boek nog kunnen gebruiken?
Dat boek is kut, behandelt overerving geloof ik niet eens.
GS42zondag 5 augustus 2012 @ 14:55
quote:
0s.gif Op zondag 5 augustus 2012 13:52 schreef t4rt4rus het volgende:

[..]

Wat versta jij onder tutorial?

Een professor van mij heeft zelf een boek geschreven en deze staat ook gratis op internet
http://www.icce.rug.nl/documents/cplusplus/
Ah, leuk, jij studeert dus ook in Groningen? Als je de kans hebt, moet je echt de drie-delige C++ cursus van Brokken doen; die begint vast na de zomer weer. Heb ik dus ook gedaan. :)

quote:
0s.gif Op zondag 5 augustus 2012 14:22 schreef thabit het volgende:

Dat boek is kut, behandelt overerving geloof ik niet eens.
In een basisboek lijkt dat me niet zo'n probleem. Als het de basis wel goed behandelt, lijkt het me nog geen kutboek. Maar nogmaals, ik ken het boek dus niet. :P
thabitzondag 5 augustus 2012 @ 15:07
quote:
0s.gif Op zondag 5 augustus 2012 14:55 schreef GS42 het volgende:

[..]

Ah, leuk, jij studeert dus ook in Groningen? Als je de kans hebt, moet je echt de drie-delige C++ cursus van Brokken doen; die begint vast na de zomer weer. Heb ik dus ook gedaan. :)

[..]

In een basisboek lijkt dat me niet zo'n probleem. Als het de basis wel goed behandelt, lijkt het me nog geen kutboek. Maar nogmaals, ik ken het boek dus niet. :P
't Is op wel meer punten suboptimaal, dat je C++ op een verkeerde manier aanleert.
t4rt4ruszondag 5 augustus 2012 @ 15:11
quote:
0s.gif Op zondag 5 augustus 2012 14:55 schreef GS42 het volgende:

[..]

Ah, leuk, jij studeert dus ook in Groningen? Als je de kans hebt, moet je echt de drie-delige C++ cursus van Brokken doen; die begint vast na de zomer weer. Heb ik dus ook gedaan. :)
Wanneer heb jij die gedaan?

edit:
En ja ik studeer in Groningen maar geen informatica. ;)
GS42maandag 6 augustus 2012 @ 17:28
quote:
0s.gif Op zondag 5 augustus 2012 15:11 schreef t4rt4rus het volgende:

Wanneer heb jij die gedaan?

edit:
En ja ik studeer in Groningen maar geen informatica. ;)
Ik heb de cursus in 2009-2010 gedaan. En ik studeer ook geen informatica hoor (en heb ook niet alle studiepunten voor de cursus erkend gekregen) maar dat is toch geen reden om een leuk vak niet te doen? :)
t4rt4rusmaandag 6 augustus 2012 @ 17:34
Zijn er nog Dummies met leuke vragen? :)
Of wat geavanceerdere? Wil mijn eigen kennis weer wat omhoog halen.
thenxeromaandag 6 augustus 2012 @ 18:25
Ik verwacht geen compleet antwoord... maar is het voor een dummy mogelijk om een GUI te schrijven? Of moet je daar al aardig gevorderd voor zijn? Of is het beter om er niet aan te beginnen en het misschien met C# te doen?
t4rt4rusmaandag 6 augustus 2012 @ 18:35
Bedoel je vanuit scratch gaan schrijven of gebruik maken van bestaande libs?
Maar dat heeft ook niks met C++ zelf te maken.
GS42maandag 6 augustus 2012 @ 18:37
quote:
0s.gif Op maandag 6 augustus 2012 18:25 schreef thenxero het volgende:
Ik verwacht geen compleet antwoord... maar is het voor een dummy mogelijk om een GUI te schrijven? Of moet je daar al aardig gevorderd voor zijn? Of is het beter om er niet aan te beginnen en het misschien met C# te doen?
Oh, ik denk dat ik wel een compleet antwoord kan geven: ja, dat is mogelijk. ;)

Je hebt wel een pakket nodig dat de GUI-zaken voor je regelt, maar daarna is het gewoon gebruik maken van een interface. Het lastigste is misschien nog wel zo'n pakket installeren. Zelf heb ik wel met Qt gespeeld (nooit iets serieus mee gemaakt), maar als je dat installeert denk ik dat je binnen een uur een voorbeeld hebt aangepast en gecompileerd.

Programmeertechnisch is het niet ingewikkeld; je moet alleen wel willen leren te werken met een nieuw pakket.
thenxeromaandag 6 augustus 2012 @ 20:03
quote:
0s.gif Op maandag 6 augustus 2012 18:37 schreef GS42 het volgende:

[..]

Oh, ik denk dat ik wel een compleet antwoord kan geven: ja, dat is mogelijk. ;)

Je hebt wel een pakket nodig dat de GUI-zaken voor je regelt, maar daarna is het gewoon gebruik maken van een interface. Het lastigste is misschien nog wel zo'n pakket installeren. Zelf heb ik wel met Qt gespeeld (nooit iets serieus mee gemaakt), maar als je dat installeert denk ik dat je binnen een uur een voorbeeld hebt aangepast en gecompileerd.

Programmeertechnisch is het niet ingewikkeld; je moet alleen wel willen leren te werken met een nieuw pakket.
Oke :). Maar is dat Qt niet alleen gericht op mobiele apps?
t4rt4rusmaandag 6 augustus 2012 @ 20:04
quote:
0s.gif Op maandag 6 augustus 2012 20:03 schreef thenxero het volgende:

[..]

Oke :). Maar is dat Qt niet alleen gericht op mobiele apps?
Nee ;)

Maar dit heeft niet veel met C++ te maken. :P
thenxeromaandag 6 augustus 2012 @ 20:05
quote:
0s.gif Op maandag 6 augustus 2012 20:04 schreef t4rt4rus het volgende:

[..]

Nee ;)

Maar dit heeft niet veel met C++ te maken. :P
Dat snap ik niet helemaal. Ik dacht dat je in C++ dan die GUI moest programmeren. Hoe zit dat dan?
t4rt4rusmaandag 6 augustus 2012 @ 20:08
quote:
0s.gif Op maandag 6 augustus 2012 20:05 schreef thenxero het volgende:

[..]

Dat snap ik niet helemaal. Ik dacht dat je in C++ dan die GUI moest programmeren. Hoe zit dat dan?
Ja je moet het inderdaad programmeren in C++ of andere taal.
Maar het is niet echt een vraag over C++. :P

Maar volgens mij kan je wel wat leuks maken in Qt.
Zoek voorbeelden op en probeer te begrijpen wat het doet.
trancethrustmaandag 6 augustus 2012 @ 20:13
quote:
0s.gif Op maandag 6 augustus 2012 20:05 schreef thenxero het volgende:

[..]

Dat snap ik niet helemaal. Ik dacht dat je in C++ dan die GUI moest programmeren. Hoe zit dat dan?
Qt is een library die je een API geeft om cross-platform (mobiel, linux, windows, OS X, ...) GUIs te ontwikkelen (andere I/O is ook supported). Andere libraries zijn er natuurlijk ook, bv. linux' X11 API, de Windows API, Java Swing, enzovoorts; sommige zijn beschikbaar voor C, anderen niet.

C(++) als standaard heeft zelf geen inherente manier om GUIs te maken.
t4rt4rusdinsdag 7 augustus 2012 @ 17:21
Heb zelf qt tools geinstalleerd.
Volgens mij kan je dat wel leren thenxero.
thenxerodinsdag 7 augustus 2012 @ 20:11
Ik zit nu te klooien met C#. Daar kan je ook vrij makkelijk windowtjes oproepen met wat text en knoppen erin.
t4rt4rusdinsdag 7 augustus 2012 @ 20:22
quote:
0s.gif Op dinsdag 7 augustus 2012 20:11 schreef thenxero het volgende:
Ik zit nu te klooien met C#. Daar kan je ook vrij makkelijk windowtjes oproepen met wat text en knoppen erin.
Heeft niet veel met de taal te maken.
Dat is gewoon welke libraries er standaard worden bij geleverd.
C++ is gelukkig geen taal waar dat soort dingen standaard inzitten.
Wel hebben we STL en STD.

Maar is gewoon een kwestie van libaries. C# heeft standaard een library waarmee je windows kan maken.
Met C++ en bijvoorbeeld qt kan je ook heel makkelijk windows maken.
thenxerodinsdag 7 augustus 2012 @ 20:27
Ik ga het nu downloaden
t4rt4rusdinsdag 7 augustus 2012 @ 20:38
quote:
14s.gif Op dinsdag 7 augustus 2012 20:27 schreef thenxero het volgende:
Ik ga het nu downloaden
Cool.

Heb je nog vragen over C++? :P
thenxerodinsdag 7 augustus 2012 @ 20:42
quote:
0s.gif Op dinsdag 7 augustus 2012 20:38 schreef t4rt4rus het volgende:

[..]

Cool.

Heb je nog vragen over C++? :P
Ik wil binnenkort een keertje vraag 11 van PE aanpakken:
quote:
What is the greatest product of four adjacent numbers on the same straight line in the 20 by 20 grid? [grid van getallen]
Daarvoor moet ik dus een matrix gaan laden. Heb er een beetje op gegoogled, maar er zijn zoveel mogelijkheden met fstream dat ik er niet echt uitkom. Maar heb eerlijk gezegd ook nog niet echt mijn best gedaan.
thenxerodinsdag 7 augustus 2012 @ 20:49
Wat is dit nou weer. Ben ik bezig met Qt installeren, krijg ik dit:

5o86xv.jpg

Uiteindelijk maar op Ignore gedrukt want Retry haalt niks uit.
t4rt4rusdinsdag 7 augustus 2012 @ 20:58
Vreemd,
deze error komt vaker voor zo te zien.
Moet je maar wachten op een update.

Mijn aptitude install qt4-etc... ging heel snel. :P
thenxerodinsdag 7 augustus 2012 @ 21:14
Volgens mij werkt ie wel gewoon goed.

edit: briljant programma!! Je kan er direct mee aan de slag. Precies wat ik zocht!

[ Bericht 55% gewijzigd door thenxero op 07-08-2012 21:35:21 ]
GS42dinsdag 7 augustus 2012 @ 21:41
quote:
0s.gif Op dinsdag 7 augustus 2012 21:14 schreef thenxero het volgende:
Volgens mij werkt ie wel gewoon goed.

edit: briljant programma!! Je kan er direct mee aan de slag. Precies wat ik zocht!
Zei ik toch? :P
Maar mooi dat het bevalt.
GS42woensdag 8 augustus 2012 @ 12:17
quote:
0s.gif Op dinsdag 7 augustus 2012 20:38 schreef t4rt4rus het volgende:

Heb je nog vragen over C++? :P
Als je je verveelt, kan je altijd op zoek gaan Herb Sutter's Exceptional C++ (en vervolg), waarin vraagstukken staan voor C++-programmeurs. Het is geen goedkoop boek, maar als je er geen problemen mee hebt, zijn er online ook pdf-versies te vinden. Sommige stukjes zijn een beetje verouderd door C++11, maar het overgrote deel is nog steeds erg nuttig.
GS42woensdag 8 augustus 2012 @ 15:59
quote:
0s.gif Op dinsdag 7 augustus 2012 20:42 schreef thenxero het volgende:

[..]

Ik wil binnenkort een keertje vraag 11 van PE aanpakken:

[..]

Daarvoor moet ik dus een matrix gaan laden. Heb er een beetje op gegoogled, maar er zijn zoveel mogelijkheden met fstream dat ik er niet echt uitkom. Maar heb eerlijk gezegd ook nog niet echt mijn best gedaan.
Mijn 'oplossing':

1
2
3
4
unsigned matrix[20][20] = {
    { 8,  2, 22, 97, 38, 15,  0, 40,  0, 75,  4,  5,  7, 78, 52, 12, 50, 77, 91,  8},
    [...]
};

Dit vond ik minder werk dan de getallen opslaan in een bestand en die daarna inladen. Nooit te moeilijk denken. :)

SPOILER
Wel even opletten bij de 0* (leading zero) getallen: wat kan hier misgaan en gebeurt dat ook?
thenxerowoensdag 8 augustus 2012 @ 16:37
quote:
0s.gif Op woensdag 8 augustus 2012 15:59 schreef GS42 het volgende:

[..]

Mijn 'oplossing':
[ code verwijderd ]

Dit vond ik minder werk dan de getallen opslaan in een bestand en die daarna inladen. Nooit te moeilijk denken. :)

SPOILER
Wel even opletten bij de 0* (leading zero) getallen: wat kan hier misgaan en gebeurt dat ook?
En heb je dan handmatig overal komma's gezet? (Dat is wel takkenwerk)

Ik wou sowieso nog leren hoe ik een matrix moet laten omdat ik dat later nog wil gebruiken, dus dit was een mooi moment om het alvast te leren. Het is me ondertussen gelukt om de matrix te laden, ik krijg alleen nog het foute antwoord :P .
GS42woensdag 8 augustus 2012 @ 16:44
quote:
0s.gif Op woensdag 8 augustus 2012 16:37 schreef thenxero het volgende:

[..]

En heb je dan handmatig overal komma's gezet? (Dat is wel takkenwerk)
Ha, nee joh. Gewoon find/replace en de spaties vervangen door een komma en een spatie.

quote:
Ik wou sowieso nog leren hoe ik een matrix moet laten omdat ik dat later nog wil gebruiken, dus dit was een mooi moment om het alvast te leren. Het is me ondertussen gelukt om de matrix te laden, ik krijg alleen nog het foute antwoord .
Ah, dan doe je het netter dan ik. :P
thabitwoensdag 8 augustus 2012 @ 16:45
Voor dat soort dingen is Python's "eval" function een uitkomst. Die neemt een string als input, en voert die string uit als Python code.
thenxerowoensdag 8 augustus 2012 @ 17:24
Ik hou het voorlopig even bij C++
thenxerowoensdag 8 augustus 2012 @ 17:37
quote:
0s.gif Op woensdag 8 augustus 2012 16:37 schreef thenxero het volgende:

[..]
Het is me ondertussen gelukt om de matrix te laden, ik krijg alleen nog het foute antwoord :P .
Ik was vergeten dat diagonaal ook van linksonder naar rechtsboven kan zijn :') . Nu wel goed :) .
thenxerowoensdag 8 augustus 2012 @ 21:34
Is het mogelijk om een vector te verwijderen? Ik heb zitten klooien met vector::erase en vector::clear, maar de waardes blijven staan. Het enige wat er volgens mij verandert is dat als je vector::push_back gebruikt dat hij de oude vector overschrijft.

Voor mijn doeleinden zou het ook genoeg zijn om de hele vector in nullen te veranderen en dan weer overschrijfbaar te maken. Dit kan ik wel doen op zo'n manier, maar dat lijkt me onnodig omslachtig:
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
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);
    a.push_back(6);
    int size = a.size();
    a.clear();
    for(int i=0; i<size; i++)
    {
        a.push_back(0);
    }
    a.clear();
    a.push_back(55);
    a.push_back(66);
    cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << " " << a[4] << " " << a[5];
    return 0;
}
thabitwoensdag 8 augustus 2012 @ 21:41
Je kan zoiets doen:
1fill(a.begin(), a.end(), 0);
Maar 't is me niet geheel duidelijk wat je met verwijderen bedoelt.
GS42woensdag 8 augustus 2012 @ 21:41
1    cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << " " << a[4] << " " << a[5];

Je leest hier voorbij de grenzen van de vector. In je voorbeeld heeft a op dit moment maar 2 waarden, namelijk 55 en 66. Dus verder dan a[1] ( < a.size() ) mag je niet lezen.

En verder lijkt je code prima: met vector.clear() maak je de vector helemaal leeg.
thenxerowoensdag 8 augustus 2012 @ 21:42
quote:
0s.gif Op woensdag 8 augustus 2012 21:41 schreef GS42 het volgende:

[ code verwijderd ]

Je leest hier voorbij de grenzen van de vector. In je voorbeeld heeft a op dit moment maar 2 waarden, namelijk 55 en 66. Dus verder dan a[1] ( < a.size() ) mag je niet lezen.

En verder lijkt je code prima: met vector.clear() maak je de vector helemaal leeg.
Ik krijg als output

155 66 0 0 0 0

Die nullen blijven staan en de vector is dus niet kleiner geworden. Ik krijg ook geen error dat ik buiten de grenzen zit of zo :? .
thenxerowoensdag 8 augustus 2012 @ 21:43
quote:
0s.gif Op woensdag 8 augustus 2012 21:41 schreef thabit het volgende:
Je kan zoiets doen:
[ code verwijderd ]

Maar 't is me niet geheel duidelijk wat je met verwijderen bedoelt.
Met verwijderen bedoel ik dat het niet meer bestaat. Dus dat ik weer opnieuw kan zeggen:
1vector<int> a;
alsof ie nog niet bestaat. Of dat ik de vector weer kan gebruiken alsof hij nooit bestaan heeft.
thabitwoensdag 8 augustus 2012 @ 21:45
Ofwel je gebruikt new en delete (en dus een pointer naar een vector), ofwel je gebruikt accolades om de scope van a aan te geven.
thabitwoensdag 8 augustus 2012 @ 21:46
Maar dan nog zie ik niet wat er mis is met clear.
GS42woensdag 8 augustus 2012 @ 21:49
quote:
0s.gif Op woensdag 8 augustus 2012 21:42 schreef thenxero het volgende:

[..]

Ik krijg als output
[ code verwijderd ]

Die nullen blijven staan en de vector is dus niet kleiner geworden. Ik krijg ook geen error dat ik buiten de grenzen zit of zo :? .
Dat eerste is mogelijk, dat tweede klopt niet en het derde is gegarandeerd. Dat de nullen blijven staan mag C++ doen: de lengte van de vector is echter wel veranderd: controleer maar met vector.size():

1
2
3
4
5
6
std::vector<int> a;
for (int idx = 0; idx < 10; ++idx)
   a.push_back(idx);
std::cout << "Vector size: " << a.size() << '\n';
a.clear();
std::cout << "Vector size: " << a.size() << '\n';

Dat de waardes eigenlijk nog ergens in het geheugen bestaan maakt niet uit: net als op de harde schijf wordt iets dat verwijderd is, niet gelijk helemaal weggegooid maar alleen aangemerkt als 'overschrijfbaar'. Dit doet er verder niet toe: je moet nooit verder lezen dan vector.size() - 1. Dat is jouw verantwoordelijkheid en C++ zal je er niet voor waarschuwen als je het wel doet.

En nee, je kunt niet in dezelfde scope twee maal dezelfde variabele declareren. Je kunt a wel opnieuw toekennen:

1
2
3
vector<int> a;
// code
a = vector<int>(); // nu is a een nieuwe, lege vector
thenxerowoensdag 8 augustus 2012 @ 21:59
Waar ik eigenlijk mee bezig is, is PE 13. Ik moet dus 100 getallen van 50 cijfers bij elkaar optellen. Van het eerste getal zet ik de cijfers opeenvolgend in een vector genaamd vec1. Dan wil ik steeds het volgende getal bij het eerste optellen. Iteratief wil ik vec2 de vector laten zijn die het nieuwe op te tellen getal representeert. Bij dat laatste gaat er dus volgens mij iets mis.

Bij het "optellen" van de eerste twee vectors krijg ik het goede resultaat, maar als ik de derde erbij op wil tellen gaat het fout. Ik krijg geen foutmelding maar de code compileert niet eens.

SPOILER
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
#include <cmath>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#define ROW 100
#define COLUMN 1

using namespace std;

bool readTable(string path, string tab[ROW][COLUMN])
{
    fstream file;
    file.open("numbers.txt");
    if(file.is_open())
    {
        for(int i=0;i<ROW;i++)
        {
            for(int j=0;j<COLUMN;j++)
            {
                file >> tab[i][j];
            }
        }
    }
    else return false;
    return true;
}

void add(vector<int>* vec1, vector<int>* vec2)
{
    for(int i=49;i>-1 ; i--)
    {
        vec1->at(i)+=vec2->at(i);
        if(vec1->at(i)>9)
        {
            vec1->at(i)%=10;
            vec1->at(i-1)+=1;
        }
    }
}

int main()
{
    string tab[ROW][COLUMN];
    readTable("numbers.txt",tab);

    vector<int> vec1;
    vector<int> vec2;
    int size;

    //Create a vector of the first string:
    for(int i=0; i<50; i++)
    {
        vec1.push_back(tab[0][0][i]-'0');
    }
    //Add strings to the first one
    for(int k=1; k<3; k++)
    {
        //Create a vector of the new string:
        for(int i=0; i<50; i++)
        {
            vec2.push_back(tab[k][0][i]-'0');
        }
        add(&vec1,&vec2);
        vec2.clear();
    }

    for(int i=0; i<50; i++)
    {
        cout << vec1.at(i);
    }
    return 0;
}
t4rt4ruswoensdag 8 augustus 2012 @ 22:00
quote:
0s.gif Op woensdag 8 augustus 2012 21:43 schreef thenxero het volgende:

[..]

Met verwijderen bedoel ik dat het niet meer bestaat. Dus dat ik weer opnieuw kan zeggen:
[ code verwijderd ]

alsof ie nog niet bestaat. Of dat ik de vector weer kan gebruiken alsof hij nooit bestaan heeft.
Met a.swap(std::vector<int>()); (a = std::vector<int>();)
Heb je weer een nieuwe vector.
thenxerowoensdag 8 augustus 2012 @ 22:02
Wacht, nu zie ik opeens iets. Ik probeer toegang te verkrijgen tot vec2[-1].
t4rt4ruswoensdag 8 augustus 2012 @ 22:04
Ik ben al bij opdracht 6...
Had ze al eerder gedaan maar ben loginnaam vergeten. :P

Even kijken hoe moest 6 nog maar.
Sum_n(n)^2 - Sum_n(n^2) = 2*Sum_i>j(ij)
En dat voor de eerste 100.

Oh easy.

edit ho ik vergeet de keer 2 nog...

[ Bericht 7% gewijzigd door t4rt4rus op 08-08-2012 22:12:20 ]
thenxerowoensdag 8 augustus 2012 @ 22:37
quote:
11s.gif Op woensdag 8 augustus 2012 22:02 schreef thenxero het volgende:
Wacht, nu zie ik opeens iets. Ik probeer toegang te verkrijgen tot vec2[-1].
Dit heb ik nu opgelost. Nu krijg ik geen errors/failures meer maar klopt de optelling niet meer :( . Misschien maar even pauze nemen, want ik zie niks meer.
GS42woensdag 8 augustus 2012 @ 22:41
quote:
0s.gif Op woensdag 8 augustus 2012 22:37 schreef thenxero het volgende:

Dit heb ik nu opgelost. Nu krijg ik geen errors/failures meer maar klopt de optelling niet meer :( . Misschien maar even pauze nemen, want ik zie niks meer.
Ik denk dat het iets te maken heeft met het feit dat bij een optelling het resulterende getal soms langer wordt...
trancethrustwoensdag 8 augustus 2012 @ 22:41
quote:
0s.gif Op woensdag 8 augustus 2012 21:42 schreef thenxero het volgende:

[..]

Ik krijg als output
[ code verwijderd ]

Die nullen blijven staan en de vector is dus niet kleiner geworden. Ik krijg ook geen error dat ik buiten de grenzen zit of zo :? .
Heheheheh, dit is eigenlijk een goede oefening. Lees hoe een vector werkt en dan krijg je door wat er hier gebeurt. Het korte antwoord is dat clear() wel goed is, en dat de []-operator geen enkele check uitvoert (want performance); als je wel boundary-checks wilt hebben, gebruik dan at(i).
thenxerowoensdag 8 augustus 2012 @ 22:48
quote:
0s.gif Op woensdag 8 augustus 2012 22:41 schreef GS42 het volgende:

[..]

Ik denk dat het iets te maken heeft met het feit dat bij een optelling het resulterende getal soms langer wordt...
Ja, had daar al voor gecorrigeerd... maar toch gaat er nog iets mis.
trancethrustwoensdag 8 augustus 2012 @ 22:54
quote:
void add(vector<int>* vec1, vector<int>* vec2)
Hier is overigens waar C++ references voor heeft geintroduceerd; gebruik beter

1void add(vector<int> &vec1, vector<int> &vec2)

en vervang de derefs (->'s) door gewone punten voor hetzelfde resultaat (semantisch), maar schonere code (en vrijheid voor de compiler iets anders te doen dan pointers passen, mocht er iets beters te doen zijn).
thabitwoensdag 8 augustus 2012 @ 22:56
Voor grote getallen zijn er libraries zoals MPIR.
thenxerowoensdag 8 augustus 2012 @ 22:58
quote:
2s.gif Op woensdag 8 augustus 2012 22:54 schreef trancethrust het volgende:

[..]

Hier is overigens waar C++ references voor heeft geintroduceerd; gebruik beter
[ code verwijderd ]

en vervang de derefs (->'s) door gewone punten voor hetzelfde resultaat (semantisch), maar schonere code (en vrijheid voor de compiler iets anders te doen dan pointers passen, mocht er iets beters te doen zijn).
Thanks.
quote:
2s.gif Op woensdag 8 augustus 2012 22:56 schreef thabit het volgende:
Voor grote getallen zijn er libraries zoals MPIR.
Dat is vast niet zo leerzaam als dit geklooi :)
GS42woensdag 8 augustus 2012 @ 23:28
Trouwens, nu we toch weer richting een nieuw vervolg gaan, vind ik wel dat we het eens serieus over die OP moeten hebben. Verschillende dingen:

- Waarom die plaatjes van Dummies-boeken? Die boeken zijn toch nooit het onderwerp geweest van dit topic? Wat is het nut?

- De opmerking "beperk je niet tot [...]" is wat denigrerend. Een duidelijke omschrijving van wat voor informatie behulpzaam is bij een vraag, lijkt op z'n plaats.

- Het "vorig topic" gedeelte is toch overbodig nu het een reeks is? En maken mods het nog steeds centraal?

- Die FAQ is ... tenenkrommend slecht. Serieus, print het uit, verbrand het en begin overnieuw. :P

- Het "handige links" gedeelte is een goed idee, maar de uitvoering laat te wensen over. Een verzameling van goede links die in de topics zijn genoemd is echter prima.

Samenvattend: ik geloof niet dat er iets nuttigs in staat en verscheidene contra-productieve dingen. Zullen we eens een nieuwe schrijven? Wie wil wat doen? ;)
Carlos93woensdag 8 augustus 2012 @ 23:56
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?
trancethrustdonderdag 9 augustus 2012 @ 01:45
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?
Alles kan, maar zonder ervaring kan het allemaal iets minder vlot.
quote:
0s.gif Op woensdag 8 augustus 2012 23:28 schreef GS42 het volgende:
Trouwens, nu we toch weer richting een nieuw vervolg gaan, vind ik wel dat we het eens serieus over die OP moeten hebben. Verschillende dingen:

- Waarom die plaatjes van Dummies-boeken? Die boeken zijn toch nooit het onderwerp geweest van dit topic? Wat is het nut?

- De opmerking "beperk je niet tot [...]" is wat denigrerend. Een duidelijke omschrijving van wat voor informatie behulpzaam is bij een vraag, lijkt op z'n plaats.

- Het "vorig topic" gedeelte is toch overbodig nu het een reeks is? En maken mods het nog steeds centraal?

- Die FAQ is ... tenenkrommend slecht. Serieus, print het uit, verbrand het en begin overnieuw. :P

- Het "handige links" gedeelte is een goed idee, maar de uitvoering laat te wensen over. Een verzameling van goede links die in de topics zijn genoemd is echter prima.

Samenvattend: ik geloof niet dat er iets nuttigs in staat en verscheidene contra-productieve dingen. Zullen we eens een nieuwe schrijven? Wie wil wat doen? ;)
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.
GS42donderdag 9 augustus 2012 @ 01:59
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 ]
trancethrustdonderdag 9 augustus 2012 @ 10:27
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.
ralfiedonderdag 9 augustus 2012 @ 12:31
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.
thenxerodonderdag 9 augustus 2012 @ 13:38
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?
GS42donderdag 9 augustus 2012 @ 13:42
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 !=.
thenxerodonderdag 9 augustus 2012 @ 13:48
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.
thenxerodonderdag 9 augustus 2012 @ 14:09
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;
}
GS42donderdag 9 augustus 2012 @ 14:10
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.
thenxerodonderdag 9 augustus 2012 @ 14:15
Dat ook nog. Wat een drama.... dit bewaar ik voor een regenachtige zondag.
GS42donderdag 9 augustus 2012 @ 14:20
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.
thenxerodonderdag 9 augustus 2012 @ 14:28
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.
t4rt4rusdonderdag 9 augustus 2012 @ 17:17
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?
t4rt4rusdonderdag 9 augustus 2012 @ 17:23
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)
GS42donderdag 9 augustus 2012 @ 17:52
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.
t4rt4rusdonderdag 9 augustus 2012 @ 17:53
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?
thabitdonderdag 9 augustus 2012 @ 18:29
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.
trancethrustdonderdag 9 augustus 2012 @ 19:06
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.
t4rt4rusdonderdag 9 augustus 2012 @ 19:06
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
trancethrustdonderdag 9 augustus 2012 @ 20:10
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.
Wolfjedonderdag 9 augustus 2012 @ 20:51
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.
t4rt4rusdonderdag 9 augustus 2012 @ 21:17
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...
t4rt4rusdonderdag 9 augustus 2012 @ 21:57
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.
thabitdonderdag 9 augustus 2012 @ 22:34
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.
thenxerodonderdag 9 augustus 2012 @ 23:03
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
t4rt4rusdonderdag 9 augustus 2012 @ 23:08
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
trancethrustdonderdag 9 augustus 2012 @ 23:17
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.
t4rt4rusvrijdag 10 augustus 2012 @ 18:06
Kan ik niet gewoon __int128 gebruiken?
t4rt4rusvrijdag 10 augustus 2012 @ 18:58
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;
trancethrustvrijdag 10 augustus 2012 @ 19:41
Sure, maar het is niet ANSI en het blijft uitstel van executie in de zin van hierboven.
t4rt4rusvrijdag 10 augustus 2012 @ 20:45
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.
GS42vrijdag 10 augustus 2012 @ 20:53
quote:
0s.gif Op vrijdag 10 augustus 2012 20:45 schreef t4rt4rus het volgende:

Of is er een andere mogelijk om de grootste integer te krijgen en een integer die 2 keer zo klein is.
Voor mijn arbitrary precision integer implementatie heb ik een willekeurig unsigned integer-datatype genomen en daar alleen de onderste helft van de bits van gebruikt. Dat betekent dat de gebruiker vrij is de snelste int voor zijn compiler/platform te gebruiken en dat het automatisch meegroeit als de ints ook groter worden.

Het is zonde om je zo vast te zetten op een bepaalde grootte int.
t4rt4rusvrijdag 10 augustus 2012 @ 20:58
quote:
0s.gif Op vrijdag 10 augustus 2012 20:53 schreef GS42 het volgende:

[..]

Voor mijn arbitrary precision integer implementatie heb ik een willekeurig unsigned integer-datatype genomen en daar alleen de onderste helft van de bits van gebruikt. Dat betekent dat de gebruiker vrij is de snelste int voor zijn compiler/platform te gebruiken en dat het automatisch meegroeit als de ints ook groter worden.

Het is zonde om je zo vast te zetten op een bepaalde grootte int.
Ja ik wil ook niet vast zitten op een bepaalde grootte.
Jij zegt zelf dat je een willekeurige gebruikt, maar hoe weet je dat je dat onderste helft van de bits gebruikt?
t4rt4rusvrijdag 10 augustus 2012 @ 21:02
Dit werkt http://ideone.com/NwC3c :)
GS42vrijdag 10 augustus 2012 @ 21:13
quote:
Dat werkt, maar dan moet je dus wel voor een nieuw type een nieuwe template-specificatie maken etc.

quote:
Jij zegt zelf dat je een willekeurige gebruikt, maar hoe weet je dat je dat onderste helft van de bits gebruikt?
De onderste helft is sizeof(Type) * 4 bits en de maximale waarde is dus 2^(sizeof(Type) * 4). Zolang je daaronder zit, zit je veilig. Als je daar overheen gaat (of het raakt), schuif je de overflow naar het volgende getal.
thenxerozaterdag 11 augustus 2012 @ 16:08
Heb net PE probleem 67 opgelost, met die triangle met 100 rijen aan getallen, waar je de maximale som moet berekenen van boven naar beneden. Binnen 40ms is mijn algoritme klaar :D .
thenxerozaterdag 11 augustus 2012 @ 20:58
quote:
2s.gif Op woensdag 8 augustus 2012 22:56 schreef thabit het volgende:
Voor grote getallen zijn er libraries zoals MPIR.
Hoe gebruik je eigenlijk een non-standard library? Ik probeer deze nu te gebruiken, maar het lukt me niet eens om het te laden. Op google en in de manual kom ik alleen maar dingen tegen die ik niet snap of die ik niet wil.

Ik heb nu de library gedownload... en dan twee keer iets uitgepakt. Nu heb ik dus een hele berg aan bestandjes, waarvan ik geen idee heb wat ik er precies mee moet doen.
thabitzaterdag 11 augustus 2012 @ 21:33
Ga eerst op zoek naar een file genaamd README of INSTALL of iets dergelijks, en lees die.
GS42zaterdag 11 augustus 2012 @ 21:59
quote:
0s.gif Op zaterdag 11 augustus 2012 20:58 schreef thenxero het volgende:

Hoe gebruik je eigenlijk een non-standard library? Ik probeer deze nu te gebruiken, maar het lukt me niet eens om het te laden. Op google en in de manual kom ik alleen maar dingen tegen die ik niet snap of die ik niet wil.

Ik heb nu de library gedownload... en dan twee keer iets uitgepakt. Nu heb ik dus een hele berg aan bestandjes, waarvan ik geen idee heb wat ik er precies mee moet doen.
Op wat voor systeem zit je? Als je op Linux zit, dan zit zulke software wel in software manager (zoek bijvoorbeeld op GMP, de The GNU Multiple Precision Arithmetic Library; verreweg de snelste). Dan wordt alles goed voor je geinstalleerd.

Als je op Windows zit, is het installeren van zulke software meestal veel lastiger omdat je het veelal zelf moet compileren en installeren. Als je wilt, kan je ook mijn eigen verzameling van klassen proberen voor rekenen met grote getallen. Die is bijna klaar voor algemeen gebruik en hoeft niet geinstalleerd te worden. :P
t4rt4ruszaterdag 11 augustus 2012 @ 22:49
Aptitude install libgpm-dev

En succes
thenxerozaterdag 11 augustus 2012 @ 23:15
quote:
0s.gif Op zaterdag 11 augustus 2012 21:33 schreef thabit het volgende:
Ga eerst op zoek naar een file genaamd README of INSTALL of iets dergelijks, en lees die.
Ja, maar die instructies kan ik niet volgen. Het is net alsof je ergens commando's moet invoeren, zoals:
1
2
3
    ./configure
    make
    make check
Maar hoe en waar is me een raadsel.
thenxerozaterdag 11 augustus 2012 @ 23:16
quote:
1s.gif Op zaterdag 11 augustus 2012 22:49 schreef t4rt4rus het volgende:
Aptitude install libgpm-dev

En succes
Leuk dit soort codetaal maar dit zegt me niks
thabitzaterdag 11 augustus 2012 @ 23:16
quote:
0s.gif Op zaterdag 11 augustus 2012 23:15 schreef thenxero het volgende:

[..]

Ja, maar die instructies kan ik niet volgen. Het is net alsof je ergens commando's moet invoeren, zoals:
[ code verwijderd ]

Maar hoe en waar is me een raadsel.
Laat me raden: je hebt Windows?
thenxerozaterdag 11 augustus 2012 @ 23:17
quote:
12s.gif Op zaterdag 11 augustus 2012 23:16 schreef thabit het volgende:

[..]

Laat me raden: je hebt Windows?
Ja
thabitzaterdag 11 augustus 2012 @ 23:19
Maar in een andere post zei je dat je gcc had. Hoe doe je dat dan met Windows?

Misschien zeg ik iets heel doms nu, ik ben een absolute Windows-n00b.
GS42zaterdag 11 augustus 2012 @ 23:22
quote:
0s.gif Op zaterdag 11 augustus 2012 23:19 schreef thabit het volgende:
Maar in een andere post zei je dat je gcc had. Hoe doe je dat dan met Windows?

Misschien zeg ik iets heel doms nu, ik ben een absolute Windows-n00b.
Bijvoorbeeld met MinGW of Cygwin, allebei een port van GCC naar Windows.
thenxerozaterdag 11 augustus 2012 @ 23:22
quote:
0s.gif Op zaterdag 11 augustus 2012 23:19 schreef thabit het volgende:
Maar in een andere post zei je dat je gcc had. Hoe doe je dat dan met Windows?

Misschien zeg ik iets heel doms nu, ik ben een absolute Windows-n00b.
GNU GCC is de compiler die ik standaard krijg in code::blocks. Ik heb daar niks speciaals voor gedaan :P
thabitzaterdag 11 augustus 2012 @ 23:27
quote:
0s.gif Op zaterdag 11 augustus 2012 23:22 schreef GS42 het volgende:

[..]

Bijvoorbeeld met MinGW of Cygwin, allebei een port van GCC naar Windows.
MinGW ken ik niet, wel Cygwin. Cygwin heeft bij mijn weten geen 64-bits-ondersteuning. Heeft MinGW dat wel?
GS42zaterdag 11 augustus 2012 @ 23:32
quote:
0s.gif Op zaterdag 11 augustus 2012 23:27 schreef thabit het volgende:

MinGW ken ik niet, wel Cygwin. Cygwin heeft bij mijn weten geen 64-bits-ondersteuning. Heeft MinGW dat wel?
Volgens mij zijn er experimentele ports van de 64-bits compiler, maar het is niet gemakkelijk aan de praat te krijgen en je wordt er niet gelukkig van. Verder is het wel een mooi systeem en installeert het nu al standaard gcc4.7 (zonder std::thread though).
thenxerozaterdag 11 augustus 2012 @ 23:40
Maar wat heeft dit voor een consequenties voor mij?

Of is er een andere vrij eenvoudige manier om met grote getallen om te gaan? Ik moet PE probleem 13 en 20 toch ook wel zonder non-standaard libraries kunnen oplossen?
thabitzaterdag 11 augustus 2012 @ 23:43
In PE komen natuurlijk vaak grote getallen voor, dus het is wel handig om er libraries voor te hebben. Niet alleen om te rekenen, maar ook voor factorisatie en zo. Aan de website van MPIR te zien, ondersteunt het wel Windows. Zijn er geen voorgecompileerde versies?
GS42zaterdag 11 augustus 2012 @ 23:50
quote:
0s.gif Op zaterdag 11 augustus 2012 23:40 schreef thenxero het volgende:
Maar wat heeft dit voor een consequenties voor mij?

Of is er een andere vrij eenvoudige manier om met grote getallen om te gaan? Ik moet PE probleem 13 en 20 toch ook wel zonder non-standaard libraries kunnen oplossen?
Misschien ben je wel een goede testpersoon voor mijn klasses, je lijkt wel in de doelgroep te vallen. ;)

Als je wilt, kan je ze via http://code.google.com/p/unlimited-int/ downloaden. De code is klaar, de documentatie nog niet. Via 'downloads' kan je unlimited_int.h downloaden en dat is eigenlijk alles dat je nodig hebt. Een voorbeeldje van gebruik:

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
#include <iostream>
#include "unlimited_int.h"

// Print all primes below 2000 very inefficiently.

bool is_prime(Unlimited::Int const &n) {

    if (n < 2)
        return false;

    Unlimited::Int sqrt_n = n.sqrtc();

    for (Unlimited::Int i = 2; i <= sqrt_n; ++i) {
        if (n % i == 0)
            return false;
    }

    return true;
}

int main() {

    for (Unlimited::Int n(1); n < 2000; ++n) {
        if (is_prime(n))
            std::cout << "Prime: " << n << '\n';
    }
}

(Compileer met -std=c++11.)

Je kunt Unlimited::Int gewoon als int gebruiken. Als je het wilt proberen en er iets onduidelijk is, moet je mij maar even vragen want de documentatie is dus nog niet af. :)

(Trouwens, als jullie commentaar op de broncode willen leveren, is dat natuurlijk ook gewenst. Kijk dan alleen niet in unlimited_int.h maar bekijk de code via 'Source' -> 'Browse' want van die header file word je gek.)
thenxerozondag 12 augustus 2012 @ 00:04
quote:
0s.gif Op zaterdag 11 augustus 2012 23:50 schreef GS42 het volgende:

[..]

Misschien ben je wel een goede testpersoon voor mijn klasses, je lijkt wel in de doelgroep te vallen. ;)

Als je wilt, kan je ze via http://code.google.com/p/unlimited-int/ downloaden. De code is klaar, de documentatie nog niet. Via 'downloads' kan je unlimited_int.h downloaden en dat is eigenlijk alles dat je nodig hebt. Een voorbeeldje van gebruik:
[ code verwijderd ]

(Compileer met -std=c++11.)

Je kunt Unlimited::Int gewoon als int gebruiken. Als je het wilt proberen en er iets onduidelijk is, moet je mij maar even vragen want de documentatie is dus nog niet af. :)

(Trouwens, als jullie commentaar op de broncode willen leveren, is dat natuurlijk ook gewenst. Kijk dan alleen niet in unlimited_int.h maar bekijk de code via 'Source' -> 'Browse' want van die header file word je gek.)
Heb het geprobeerd, maar ik krijg een overflow aan errors. Meer dan 50 wil ie niet weergeven :P . Ik heb gewoon jouw code van die priemgetallen geplakt, en de instructies gevolgd.

Bijna alle errors hebben trouwens met elkaar gemeen dat er d_number instaat. Steeds een herhaling van dat ie niet in de scope zit, of geen member is van de class Unlimited::Uint.
thenxerozondag 12 augustus 2012 @ 00:20
Maar het kan toch niet zo moeilijk zijn, >70 000 mensen hebben die opgelost. Er zitten problemen bij die veel minder mensen hebben opgelost waar ik geen moeite mee heb.
t4rt4ruszondag 12 augustus 2012 @ 01:36
quote:
8s.gif Op zondag 12 augustus 2012 00:20 schreef thenxero het volgende:
Maar het kan toch niet zo moeilijk zijn, >70 000 mensen hebben die opgelost. Er zitten problemen bij die veel minder mensen hebben opgelost waar ik geen moeite mee heb.
Wat ze bij 20 doen is:
http://www.wolframalpha.com/input/?i=100!
En dan string copieren en alles optellen.

En voor dertien heb je alleen maar de eerste 13-15 cijfers nodig van alle 100 nummers.
Maar dan wel op een 64bit PC. :P
Op 32bit lukt dat niet echt...
t4rt4ruszondag 12 augustus 2012 @ 01:59
Dit is trouwens het antwoord van vraag 13
xxxxxxxxxxx390876637302048746832985971773659831892672 :P
GS42zondag 12 augustus 2012 @ 02:31
quote:
0s.gif Op zondag 12 augustus 2012 00:04 schreef thenxero het volgende:

[..]

Heb het geprobeerd, maar ik krijg een overflow aan errors. Meer dan 50 wil ie niet weergeven :P . Ik heb gewoon jouw code van die priemgetallen geplakt, en de instructies gevolgd.

Bijna alle errors hebben trouwens met elkaar gemeen dat er d_number instaat. Steeds een herhaling van dat ie niet in de scope zit, of geen member is van de class Unlimited::Uint.
Dank je wel voor het uitproberen. Ik zal zelf eens Code::Blocks installeren en kijken of ik kan vinden wat er mis gaat.

Edit: Haha, ja, ik heb de fout gevonden: Code::Blocks levert gcc version 4.4.1. :'( Als je C++11 wilt gebruiken, zal je minimaal 4.6 moeten hebben. Je kunt gaan googlen op dingen als "GMP for code blocks", daarmee vind ik wat hoopvolle resultaten. Als je het aandurft, mag je mijn ding ook nog eens proberen. Omdat ik denk dat dit wel vaker voor zal komen, heb ik ook een niet-11 versie tussen de downloads gezet.

quote:
0s.gif Op zondag 12 augustus 2012 01:59 schreef t4rt4rus het volgende:
Dit is trouwens het antwoord van vraag 13
[...]
Ietwat nutteloos om hier neer te zetten, niet? Het is niet alsof het antwoord gecontroleerd moet worden: je weet wanneer het goed is. Alleen om te laten zien dat je het kan? Beetje flauw.

Over de OP:

Ik ben maar begonnen met een herschrijving die je hier kunt vinden. Mijn inspiratie is echter op. Als jullie nog wijzigingen/toevoegingen hebben voor de FAQ of links, ga gerust jullie gang.

[ Bericht 11% gewijzigd door GS42 op 12-08-2012 04:36:15 ]
t4rt4ruszondag 12 augustus 2012 @ 11:29
quote:
0s.gif Op zondag 12 augustus 2012 02:31 schreef GS42 het volgende:

[..]

Ietwat nutteloos om hier neer te zetten, niet? Het is niet alsof het antwoord gecontroleerd moet worden: je weet wanneer het goed is. Alleen om te laten zien dat je het kan? Beetje flauw.
Was om te laten zien hoe groot het getal word. (Het antwoord staat er niet in...)

xero GMP gebruiken of zelf een class maken...
ari_zahavzondag 12 augustus 2012 @ 13:57
Je kan trouwens makkelijk een nieuwe gcc toevoegen aan code::blocks btw
thenxerozondag 12 augustus 2012 @ 14:42
quote:
0s.gif Op zondag 12 augustus 2012 13:57 schreef ari_zahav het volgende:
Je kan trouwens makkelijk een nieuwe gcc toevoegen aan code::blocks btw
Dat is misschien het beste, misschien heb ik dat in de toekomst ook nog voor andere dingen nodig. Hoe installeer die nieuwe gcc?
thenxerozondag 12 augustus 2012 @ 14:43
quote:
0s.gif Op zondag 12 augustus 2012 01:36 schreef t4rt4rus het volgende:

[..]

Wat ze bij 20 doen is:
http://www.wolframalpha.com/input/?i=100!
En dan string copieren en alles optellen.

En voor dertien heb je alleen maar de eerste 13-15 cijfers nodig van alle 100 nummers.
Maar dan wel op een 64bit PC. :P
Op 32bit lukt dat niet echt...
Haha, wolfram alpha gebruiken is wel heel flauw. Maar dat verklaart wel waarom zoveel mensen het hebben opgelost :)
t4rt4ruszondag 12 augustus 2012 @ 15:15
quote:
0s.gif Op zondag 12 augustus 2012 14:43 schreef thenxero het volgende:

[..]

Haha, wolfram alpha gebruiken is wel heel flauw. Maar dat verklaart wel waarom zoveel mensen het hebben opgelost :)
Misschien kan je hier wat mee https://code.google.com/p/mingw-builds/downloads/list ;)

Je hebt tenminste 4.6 nodig.

edit:
https://code.google.com/p(...)e+Size+DownloadCount