abonnement Unibet Coolblue Bitvavo
pi_114976900
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.
pi_114977332
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
pi_114978512
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
pi_114978518
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.
  donderdag 2 augustus 2012 @ 13:08:39 #105
189216 netolk
maar dan andersom
pi_114992442
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)
Beware of the Raping Zebra's
pi_114995032
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.
pi_114995536
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.
pi_114995621
quote:
0s.gif Op donderdag 2 augustus 2012 13:57 schreef thabit het volgende:
[...] een reference kan niet 0 zijn [...]
1int const &a = 0;
:)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_114995928
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.
pi_115007412
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. :)
pi_115022393
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?
pi_115022441
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.
pi_115025456
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-
pi_115028537
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));
pi_115030810
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.
  vrijdag 3 augustus 2012 @ 01:00:28 #116
189216 netolk
maar dan andersom
pi_115031632
Ja er bestaat er ook een voor c++ het enige verschil is dat malloc word vervangen door new
Beware of the Raping Zebra's
  vrijdag 3 augustus 2012 @ 09:46:07 #117
314941 Ai_KaRaMBa
Eat my shorts!
pi_115038590
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);
pi_115038928
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.
  vrijdag 3 augustus 2012 @ 17:18:49 #119
189216 netolk
maar dan andersom
pi_115059480
Klopt idd alleen is new veel duidelijker en overzichtelijker in gebruik
Beware of the Raping Zebra's
pi_115059990
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;
pi_115060048
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.
  vrijdag 3 augustus 2012 @ 17:38:55 #122
314941 Ai_KaRaMBa
Eat my shorts!
pi_115060176
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)
pi_115060231
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.
pi_115063240
delete verwijdert alleen de int op plek i, delete[] verwijdert de hele array
pi_115063414
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?
pi_115064683
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.
pi_115067917
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...
pi_115071808
Ik ben nu ook met Project Euler bezig.
In C++ en asm amd64. :)
pi_115075167
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.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115080563
Ok zullen we het nu over `operator new' en `placement new' hebben? :P
Zijn ook nog vormen van new.
pi_115080643
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.
pi_115080707
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 :)
pi_115080837
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
pi_115095606
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 ]
pi_115098805
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 ]
pi_115098915
Dat is toch de rest? Het enige probleem is dat C(++) er vreemde conventies op nahoudt wat betreft positief en negatief.
pi_115098978
Je hebt gelijk.

En over wat voor vreemde conventies heb je het? Met modulus?
pi_115099901
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.
pi_115103337
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) ?
pi_115103477
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 %.
pi_115104139
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.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115104365
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.
pi_115104939
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
pi_115107497
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 ]
pi_115110019
Logischer is als (a + b) / b altijd gelijk is aan a / b + 1. Dat is bij C niet het geval.
pi_115111497
Ohja voor referenties zie deze site http://cppreference.com
die is wel goed :)
pi_115118764
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.
pi_115118922
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?
pi_115119107
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
pi_115119226
Welke compiler gebruik je?
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')