abonnement Unibet Coolblue
pi_134075155


Het topic over de programmeertalen C en C++. Als je vragen over C of C++ hebt, zit je hier goed. Natuurlijk kan je ook gewoon mee kletsen.

Let er bij het stellen van een vraag op dat je zo veel mogelijk revelante informatie geeft, zoals:
- wat je probeert te doen;
- welk besturingsysteem je hebt;
- welke compiler en versie je gebruikt;
- de eventuele foutmelding die je ziet;
- een minimaal codevoorbeeld dat je fout veroorzaakt.

FAQ

Wat is het verschil tussen C en C++?

De programmeertalen C en C++ hebben veel overeenkomsten. C++ is begonnen als een uitbreiding op C en ondersteunt bijna de volledige C-taal. Dit betekent dat een computerprogramma geschreven in C meestal ook een geldig C++-programma is.

C++ heeft onderdelen aan de C-taal toegevoegd en ondersteunt verschillende programmeerstijlen beter. C++ heeft onder andere sterkere typechecking, betere manieren om data te encapsuleren en eenvoudigere structuren om algemene code te schrijven. C is echter nog steeds beter ondersteund op 'afwijkende' platformen en wordt mede daarom nog veel gebruikt.

Zie Stroustrups FAQ voor meer informatie.

Ik wil beginnen met C of C++; welke moet ik kiezen?

Dat hangt van jou af: er is geen direct 'betere' keuze. Je hoeft zeker geen C te leren voordat je aan C++ begint: het is waarschijnlijk zelfs beter van niet. Zorg in de eerste plaats voor een goed leerboek, de online informatie en 'cursussen' laat vaak te wensen over voor de beginneling.

Wat is een goed boek voor C of C++

Zie wederom Stroustrups FAQ.

Links

Naslagwerken

C/C++ Reference
The C Library Reference Guide
C++ Documentation
C++ Annotations

Achtergrond
The Association of C and C++ Users
Stroustrup's homepage

Deze OP vind je hier.
nee, jij dan!
pi_134075166
Ik maakte 'm vol, hier verder :)
nee, jij dan!
pi_134075201
quote:
5s.gif Op maandag 9 december 2013 10:56 schreef Ai_KaRaMBa het volgende:
Ik mis een betje waarom je uberhaubt met OpenCV matrices aan het werken bent. Je lijkt de matrix te 'misbruiken' als canvas van 320x240 pixels, en daarmee ben je opzoek naar optimalisaties omdat het blijkbaar niet snel genoeg is? Wat doet OpenCV preceis voor je in deze casus?

Ik zou zeggen dat als je een 'echte' canvas alloceerd (aaneengesloten blok geheugen, wat een twee-dimensionale array van (signed) integers representeerd), dat dat veel sneller en overzichtelijker werkt?
[ code verwijderd ]

Je hebt deels gelijk. Maar momenteel gebruik ik ook nog best een flink aantal OpenCV functies die ik er op termijn uit wil mikken. Voorbeeld hiervan is dat ik met Opencv gelijk een eenvoudige grafische output heb. Andere dingen die ik nu nog gebruik zijn alle gemakken die bij OpenCV zitten zoals resize functie, transpose, floodfill...

Ik ben bezig met een Depth Sensor van Xtion. Die gebruikt OpenNI, en dan is het wel makkelijk om direct zijn data in een OpenCV container te flikkeren. Maar je hebt wel gelijk denk ik, wellicht is het beter dat hele OpenCV er tussenuit te gooien.

quote:
0s.gif Op maandag 9 december 2013 11:00 schreef Gehenna het volgende:

[..]

oh wacht daar heb je gelijk in idd (Ik ben net wakker :')), hij gaat bij die 2e natuurlijk de alle statements door als waarde==0. Dan zou idd die eerste wellicht de betere keuze zijn..
Maar als die eerste statement leeg is haalt de compiler m weg?
pi_134075263
Ik ken OpenCV verder niet, maar als je daarin integer matrices kan definieren, en je kan idd direct de elementen adresseren (zonder de [] overload bij iedere access aan te hoeven roepen), is dat natuurlijk effectief hetzelfde.

Echter, wat je een aantal posts geleden aangaf, is dat 1 keer een pointer fetchen en de ++en in een loop niet lijkt te werken...
pi_134075266
quote:
0s.gif Op maandag 9 december 2013 11:02 schreef Holy_Goat het volgende:

[..]

Maar als die eerste statement leeg is haalt de compiler m weg?
Nee ik las verkeer

Hier wel:
1
2
3
4
If (A)
    //Doe niets
if(B)
    DoeIets()

maar hier niet:
1
2
3
4
if (A)
    //Doe niets
else if (B)
    DoeIets()
nee, jij dan!
pi_134075296
quote:
0s.gif Op maandag 9 december 2013 11:04 schreef Ai_KaRaMBa het volgende:
Ik ken OpenCV verder niet, maar als je daarin integer matrices kan definieren, en je kan idd direct de elementen adresseren (zonder de [] overload bij iedere access aan te hoeven roepen), is dat natuurlijk effectief hetzelfde.

Echter, wat je een aantal posts geleden aangaf, is dat 1 keer een pointer fetchen en de ++en in een loop niet lijkt te werken...
Dat lijkt inderdaad niet te werken. Per rij een pointer fetchen wel. Maar kan aan mij liggen
pi_134075306
quote:
0s.gif Op maandag 9 december 2013 11:02 schreef Holy_Goat het volgende:
[..]

Maar als die eerste statement leeg is haalt de compiler m weg?
Dat maakt volgens mij niets (of nauwelijks iets) uit. Branch prediction in de CPU zorgt ervoor dat je daar niet op deze manier overna hoeft te denken. (de CPU weet welke jumps er vaak en minder vaak worden genomen, en zal verder 'vooruit werken' in het pad waarin hij denkt te gaan springen.
pi_134075404
quote:
0s.gif Op maandag 9 december 2013 11:06 schreef Ai_KaRaMBa het volgende:

[..]

Dat maakt volgens mij niets (of nauwelijks iets) uit. Branch prediction in de CPU zorgt ervoor dat je daar niet op deze manier overna hoeft te denken. (de CPU weet welke jumps er vaak en minder vaak worden genomen, en zal verder 'vooruit werken' in het pad waarin hij denkt te gaan springen.
Dat ook nog eens idd
nee, jij dan!
pi_134118717
Dummy vraag 4.

Als ik bv een loop heb die 10k keer loopt.
In die loop zit vanalles maar ook dit

1
2
3
4
if (loopafhankelijkewaarde>iets)
                {
                    somestatement=true;
                }

Loop moet niet gebreakt worden als true want er gebeurt nog vanallerlei dingen.
Dit betekent natuurlijk wel dat somestatement in potentie (bij bijvoorbeeld de helft van de loops) op true gezet wordt. Ook al is ie dit al. De binnenkant van de IF wordt dus vaak bezocht en loopafhankelijkewaarde>iets onnodig vaak geevalueerd.

Klopt dan de volgende gedachte dat dit 'optimaler' is?
1
2
3
4
if (somestatement==false && loopafhankelijkewaarde>iets)
                {
                    somestatement=true;
                }

Nu kom je maar 1 x aan de binnenkant van de if terecht, feitelijk, en de eerste is check in de if is nogal goedkoop.
pi_134119071
quote:
0s.gif Op dinsdag 10 december 2013 16:01 schreef Holy_Goat het volgende:

Klopt dan de volgende gedachte dat dit 'optimaler' is?
Tegenwoordig is dat echt niet meer te zeggen. Dit soort minimale veranderingen hebben waarschijnlijk sowieso geen invloed op je runtijd, maar met de optimalisaties die de compiler doet en de optimalisaties die de CPU er nog bovenop doet, is er werkelijk geen zinnig woord over te zeggen.

Als de code al snel genoeg is: zo simpel mogelijk laten. Als de code nog niet snel genoeg is: profilen. Leer te werken met een profiler (e.g. gprof) en gebruik die om te beslissen welke veranderingen je doorvoert.
"Slechts diegene mag slopen die iets beters kan bouwen."
  dinsdag 10 december 2013 @ 16:14:48 #11
314941 Ai_KaRaMBa
Eat my shorts!
pi_134119178
Wat gs42 zegt. En bekijk ook eens de assembler output van je compiler: dat geeft ook een hoop inzicht in wat er gebeurt en wat bepaalde wijzigingen voor impact hebben.

Om terug te komen op je vraag, doe het zo:

1
2
If(loopwaarde == iets)
    Somestatement = true;
pi_134119929
quote:
0s.gif Op dinsdag 10 december 2013 16:14 schreef Ai_KaRaMBa het volgende:
Wat gs42 zegt. En bekijk ook eens de assembler output van je compiler: dat geeft ook een hoop inzicht in wat er gebeurt en wat bepaalde wijzigingen voor impact hebben.

Om terug te komen op je vraag, doe het zo:
[ code verwijderd ]

Ik ga dat met zo een profiler eens een keer proberen. Nooit geweten.

Wat betreft de 'doe het zo' : dat is toch hetzelfde gewoon als met { } ?
pi_134120417
quote:
0s.gif Op dinsdag 10 december 2013 16:14 schreef Ai_KaRaMBa het volgende:
Om terug te komen op je vraag, doe het zo:
Als ik moest gokken, denk ik dat dit het snelste is:

1somestatement |= loopafhankelijkewaarde > iets;

Aangenomen dat somestatement een bool is. Zo kan je een branch eruit halen en vervangen door een bitwise operator. Maar zoals ik al zei: geen idee of het werkelijk sneller is. Het zou me ook niets verbazen als een if sneller blijkt te zijn, bijv. door branch prediction. Altijd profilen voordat je iets "optimaliseert".

In ieder geval maak je hiermee je code een stuk minder duidelijk. :)

[ Bericht 2% gewijzigd door GS42 op 10-12-2013 16:55:10 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_134120768
quote:
0s.gif Op dinsdag 10 december 2013 16:48 schreef GS42 het volgende:

[..]

Als ik moest gokken, denk ik dat dit het snelste is:
[ code verwijderd ]

Aangenomen dat somestatement een bool is. Zo kan je een branch eruit halen en vervangen door een bitwise operator. Maar zoals ik al zei: geen idee of het werkelijk sneller is. Het zou me ook niets verbazen als een if sneller blijkt te zijn, bijv. door branch prediction. Altijd profilen voordat je iets "optimaliseert".

In ieder geval maak je hiermee je code een stuk minder duidelijk. :)
Profilen moet ik nog even induiken. Lees het een beetje door en ziet er toch ingewikkeld uit :P
pi_134120911
quote:
0s.gif Op dinsdag 10 december 2013 16:58 schreef Holy_Goat het volgende:

[..]

Profilen moet ik nog even induiken. Lees het een beetje door en ziet er toch ingewikkeld uit :P
De basics zijn best eenvoudig. Je krijgt vrij snel inzicht waarmee je programma het meest mee bezig is :)

Gebruik je een IDE? Wellicht dat deze ook wel wat profiling functies in huis heeft
nee, jij dan!
pi_134121449
quote:
0s.gif Op dinsdag 10 december 2013 17:03 schreef Gehenna het volgende:

[..]

De basics zijn best eenvoudig. Je krijgt vrij snel inzicht waarmee je programma het meest mee bezig is :)

Gebruik je een IDE? Wellicht dat deze ook wel wat profiling functies in huis heeft
Netbeans in ubuntu
  dinsdag 10 december 2013 @ 18:08:18 #17
314941 Ai_KaRaMBa
Eat my shorts!
pi_134122852
quote:
0s.gif Op dinsdag 10 dec 2013 16:33 schreef Holy_Goat het volgende:

[..]

Ik ga dat met zo een profiler eens een keer proberen. Nooit geweten.

Wat betreft de 'doe het zo' : dat is toch hetzelfde gewoon als met { } ?
Nee, het verschil zat in de '==' ipv de '>'. Dat was onder de aanname dat loopvariabbele in stapjes van 1 oploopt (wat vaak zo is). Als je loop dat niet doet, is het waarschijnlijk zo'n complexe loop dat het herschrijven van de conditie toch geen significante optimalisatie is...
pi_134128352
quote:
0s.gif Op dinsdag 10 december 2013 17:03 schreef Gehenna het volgende:

[..]

De basics zijn best eenvoudig. Je krijgt vrij snel inzicht waarmee je programma het meest mee bezig is :)

Gebruik je een IDE? Wellicht dat deze ook wel wat profiling functies in huis heeft
Ubuntu blijkt alleen intern te profilen voor Java.

Heb nog een nieuw vraagstukje: Dummy vraag 5 alweer!

1
2
double& angle = Par.Xtion.SensorAngle;
double angle = Par.Xtion.SensorAngle;

Bij optie nummer 1 verandert de Par.Xtion.sensorangle als angle aangepast wordt. Bij optie nummer 2 niet. Is het over het algemeen beter om optie 2 te gebruiken als je niet van plan bent Par.Xtion.sensorangle aan te passen? En als ik 'angle' sowieso niet aanpas, maakt de compiler er dan stiekem sowieso een reference van?

as in: daar zit waarschijnlijk ook minimaal verschil in als je miljoenmiljard keer berekeningen doet met waarde angle? De eerste maakt een verwijzing, de tweede kopieert daadwerkelijk de data. Ik kan mij voorstellen dat als de data een dikke vette matrix is het aantrekkelijker wordt om altijd met & te werken, maar hoe zit dat als het gewoon een int waarde is, bijvoorbeeld?
pi_134128974
Mijns inziens is nr 2 de standaard manier. References gebruik ik nooit in zo'n situatie. Het is vervelend als je overal in je code references naar (private) member data achterlaat. Maakt debuggen lastig (huh? wie heeft die angle aangepast??) en druist tegen de principes van OOP in.
Wat betreft performance maakt het niets uit, daar zorgt de compiler wel voor.

Voor zover ik het begrepen heb: Een & werkt met een pointer naar de waarde. Deze pointer is ook een int. Dus bij int's geen het geen voordeel.

[ Bericht 0% gewijzigd door Toryu op 10-12-2013 21:44:51 ]
pi_134130054
quote:
0s.gif Op dinsdag 10 december 2013 20:36 schreef Holy_Goat het volgende:
Is het over het algemeen beter om optie 2 te gebruiken als je niet van plan bent Par.Xtion.sensorangle aan te passen?
In principe maak je er dan een const reference van. Zo geef je aan dat je de waarde niet aan gaat passen en hoef je niet het hele object te kopieren. Bij fundamentele types heeft het maken van een referentie niet zoveel zin, en dus zou ik hier een const double gebruiken:

1double const angle = Par.Xtion.SensorAngle;
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_134130202
quote:
0s.gif Op dinsdag 10 december 2013 21:15 schreef GS42 het volgende:

[..]

In principe maak je er dan een const reference van. Zo geef je aan dat je de waarde niet aan gaat passen en hoef je niet het hele object te kopieren. Bij fundamentele types heeft het maken van een referentie niet zoveel zin, en dus zou ik hier een const double gebruiken:
[ code verwijderd ]

Oei, kun je me iets meer hier over uitleggen?
Ik volg even de link niet tussen const reference en bv const double.

Dus als ik angle niet aan ga passen in de code, en sensorangle al helemaal niet,
is het dan niet (eigenlijk) hetzelfde om const reference of const double te doen?
pi_134130687
quote:
0s.gif Op dinsdag 10 december 2013 21:18 schreef Holy_Goat het volgende:

[..]

Oei, kun je me iets meer hier over uitleggen?
Ik volg even de link niet tussen const reference en bv const double.

Dus als ik angle niet aan ga passen in de code, en sensorangle al helemaal niet,
is het dan niet (eigenlijk) hetzelfde om const reference of const double te doen?
De meerwaarde van een referentie is dat je een object zonder te kopieren door kunt geven. Dit doe je (hopelijk) bij functies door `std::string const &` als parameter te hebben in plaats van gewoon een `std::string`. Dit gaat ten koste van een (onzichtbare) indirectie.

Bij hele kleine objecten (zoals de fundamentele datatypes) is dit kopieren niet duur en meestal te prefereren boven de indirectie.

Qua functionaliteit is het precies hetzelfde: je hebt de waarde een naam gegeven en je kan 'et alleen lezen, niet veranderen.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_134132037
quote:
0s.gif Op dinsdag 10 december 2013 21:15 schreef GS42 het volgende:

[..]

In principe maak je er dan een const reference van. Zo geef je aan dat je de waarde niet aan gaat passen en hoef je niet het hele object te kopieren. Bij fundamentele types heeft het maken van een referentie niet zoveel zin, en dus zou ik hier een const double gebruiken:
[ code verwijderd ]

+1 voor const na de type, daar hou ik van. :)

Bij fundamentele types gewoon by value doen, tenzij je een reference nodig hebt.
En bij andere types by const reference, tenzij je echt een copy wil. (of niet const)
pi_134140010
Fungeert die const alleen als waarborg dat je ook echt nergens probeert de waarde aan te passen of is er nog een ander doel mee gemoeid?
pi_134141570
quote:
0s.gif Op woensdag 11 december 2013 05:48 schreef Holy_Goat het volgende:
Fungeert die const alleen als waarborg dat je ook echt nergens probeert de waarde aan te passen of is er nog een ander doel mee gemoeid?
De compiler kan die belofte gebruiken om de boel wat te optimaliseren.

Bij een functiecall hoeft een const parameter bijvoorbeeld niet gecopieerd te worden.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_134141594
Zie ook http://www.parashift.com/c++-faq/const-correctness.html overigens, sowieso een aanrader van een site.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 11 december 2013 @ 20:31:13 #27
189216 netolk
maar dan andersom
pi_134162416
quote:
0s.gif Op vrijdag 6 december 2013 21:38 schreef robin007bond het volgende:
Op de een of andere manier gaat OOP mij moeilijker af in C++ dan in Java. De header-files vind ik zo'n zooitje.

Als ik een C+=2 zou maken zouden die header files er definitief uit mogen. :P
Nja, als je gewoon fatsoenlijk je header files bouwt vind ik ze wel beter dan die packet troep in java
Beware of the Raping Zebra's
pi_134163099
Je kunt ook gewoon alles in de header plempen. Maakt het niet echt overzichtelijker, behalve misschien wanneer je templates gebruikt. Compilen duurt alleen wel wat langer dan.
pi_134168690
quote:
0s.gif Op vrijdag 6 december 2013 21:38 schreef robin007bond het volgende:
Op de een of andere manier gaat OOP mij moeilijker af in C++ dan in Java. De header-files vind ik zo'n zooitje.

Als ik een C+=2 zou maken zouden die header files er definitief uit mogen. :P
Dat kan in gewoon C++ ook prima. Als je het eens probeert in een iets groter project zie je ook meteen waarom ze beter wel gebruikt worden ;)
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_134170848
quote:
2s.gif Op woensdag 11 december 2013 22:03 schreef trancethrust het volgende:

[..]

Dat kan in gewoon C++ ook prima. Als je het eens probeert in een iets groter project zie je ook meteen waarom ze beter wel gebruikt worden ;)
Ik weet dat het kan, maar dan wordt het snel een rotzooitje. :P

Plus dat je methodes in een goede volgorde moeten staan.
abonnement Unibet Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')