abonnement Unibet Coolblue Bitvavo
pi_92055059
Juist. Het zoveelste nadeel van value-typed objecten.
  zaterdag 29 januari 2011 @ 21:21:14 #27
189216 netolk
maar dan andersom
pi_92055095
quote:
14s.gif Op zaterdag 29 januari 2011 21:20 schreef thabit het volgende:
Juist. Het zoveelste nadeel van value-typed objecten.
Dit soort dingen zijn niet te voorkomen zeker?
Beware of the Raping Zebra's
pi_92055270
quote:
1s.gif Op zaterdag 29 januari 2011 21:21 schreef netolk het volgende:

[..]

Dit soort dingen zijn niet te voorkomen zeker?
Als je per se wilt dat je vector geen pointers bevat (ik lees net dat references niet mogen), dan vrees ik dat dat lastig gaat worden ja.
pi_92055388
quote:
1s.gif Op zaterdag 29 januari 2011 21:21 schreef netolk het volgende:

[..]

Dit soort dingen zijn niet te voorkomen zeker?
Als je een c++0x-compatible compiler gebruikt, dan moet je dit kunnen voorkomen door met std::move() een r-value-reference mee te geven aan de push_back. Dan wordt er geen kopie gemaakt. De std::vector hoort dit te ondersteunen.
"Slechts diegene mag slopen die iets beters kan bouwen."
  zaterdag 29 januari 2011 @ 21:34:20 #30
189216 netolk
maar dan andersom
pi_92055510
hmm, die pointers in een vector zijn ook verre van ideaal want ik heb een class waar zo'n vector<*int> in staat alleen staat die class zelf ook weer in een vector dus word ie gekopieerd wat er voor zorgt dat de destructor word aangeroepen zodat de pointer geen betekenis meer heeft...

dus ik ga het dan nu maar op de "nette" manier doen (GS42 ook weer blij :P)

PS. *int is nog steeds dummie
Beware of the Raping Zebra's
pi_92055680
In de destructor van die class kun je toch gewoon een delete over die vector heen lussen?
pi_92055856
quote:
1s.gif Op zaterdag 29 januari 2011 21:34 schreef netolk het volgende:

dus ik ga het dan nu maar op de "nette" manier doen (GS42 ook weer blij :P)

Dan moet je misschien ook even kijken naar de unique- en shared-pointer (c++0x): http://www.icce.rug.nl/documents/cplusplus/cplusplus18.html#l286
Of als je op een oudere compiler zit: http://www.cplusplus.com/reference/std/memory/auto_ptr/
(EDIT: Nu ik de stof nog eens nalees, zie ik dat je de auto_prt niet moet gebruiken in containers (zie eerste link).

Dat kan je weer een klasse schrijven schelen. :)

[ Bericht 6% gewijzigd door GS42 op 29-01-2011 22:18:07 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
  zaterdag 29 januari 2011 @ 21:50:14 #33
189216 netolk
maar dan andersom
pi_92056036
hmm... ik had een simpele struct geschreven

1
2
3
4
5
struct T_sptr{
   Temp *_ptr
   T_sptr(Temp *pointer):_ptr(pointer){}
   ~T_sptr(){delete _ptr; _ptr=0;}
};

alleen hiermee geeft het nog eerder een runtime fout...
Beware of the Raping Zebra's
pi_92056866
quote:
1s.gif Op zaterdag 29 januari 2011 21:50 schreef netolk het volgende:
hmm... ik had een simpele struct geschreven

[ code verwijderd ]

alleen hiermee geeft het nog eerder een runtime fout...
Waar gaat wat dan precies fout?
pi_92056873
quote:
1s.gif Op zaterdag 29 januari 2011 21:50 schreef netolk het volgende:
hmm... ik had een simpele struct geschreven

alleen hiermee geeft het nog eerder een runtime fout...
Het is ook wat te kort door de bocht voor een pointer class. Als deze struct gekopierd wordt, wordt de _ptr by value gekopierd. Dan wordt het oude object vernietigd. Oftewel: het nieuwe object verwijst naar iets wat niet meer bestaat.
Als je een eigen pointer class wilt schrijven, moet je denken aan de copy constructor, destructor, operator= en eventueel de operator* en operator->. Daarom zijn de stl-pointers ook erg handig:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
#include <memory>

int main() {

    std::vector< std::unique_ptr<int> > pvect;
    
    for (size_t idx = 0; idx < 10; ++idx)
        pvect.push_back(std::unique_ptr<int>(new int(42)));
        
    std::cout << "Adding done." << std::endl;

    for (size_t idx = 0; idx < 10; ++idx)
        std::cout << *pvect[idx] << ' ';
}

Let wel dat je compileert met -std=c++0x.
"Slechts diegene mag slopen die iets beters kan bouwen."
  zaterdag 29 januari 2011 @ 22:16:20 #36
189216 netolk
maar dan andersom
pi_92057201
quote:
1s.gif Op zaterdag 29 januari 2011 22:08 schreef GS42 het volgende:

[..]

Het is ook wat te kort door de bocht voor een pointer class. Als deze struct gekopierd wordt, wordt de _ptr by value gekopierd. Dan wordt het oude object vernietigd. Oftewel: het nieuwe object verwijst naar iets wat niet meer bestaat.
Als je een eigen pointer class wilt schrijven, moet je denken aan de copy constructor, destructor, operator= en eventueel de operator* en operator->. Daarom zijn de stl-pointers ook erg handig:

[ code verwijderd ]

Let wel dat je compileert met -std=c++0x.
owja, dan hou ik het zelfde probleem natuurlijk |:(

en als ik nou eens in plaats van een vector een linked list maak?
of is dat moeilijk te realiseren? Ik heb nog nooit zo iets gemaakt namelijk

maar die unique pointer die maakt dan dus een nieuw opject aan als het gekopieerd word?
Beware of the Raping Zebra's
pi_92057232
quote:
1s.gif Op zaterdag 29 januari 2011 22:16 schreef netolk het volgende:

maar die unique pointer die maakt dan dus een nieuw opject aan als het gekopieerd word?
Sowieso wordt een nieuw object gemaakt, de unique_pointer is namelijk een object. Voor hetgene waar de ptr naar wijst hoeft dit echter niet te gelden. Als het mogelijk is, wordt de move constructor gebruikt waardoor dus geen deep copy nodig is. Dat is hier na te lezen.

Ik verwacht niet dat in een vector kopieen worden gemaakt. Het overzetten naar een linked list hoeft niet moeilijk te zijn, je pakt bijvoorbeeld een list<> container. Maar ik denk niet dat het nodig is in dit geval.

(Het lijkt ondertussen wel alsof ik reclame maak voor de C++ Annotations. ;))


[ Bericht 67% gewijzigd door GS42 op 29-01-2011 22:29:15 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
  zaterdag 29 januari 2011 @ 22:37:56 #38
189216 netolk
maar dan andersom
pi_92058079
quote:
1s.gif Op zaterdag 29 januari 2011 22:16 schreef GS42 het volgende:

[..]

Sowieso wordt een nieuw object gemaakt, de unique_pointer is namelijk een object. Voor hetgene waar de ptr naar wijst hoeft dit echter niet te gelden. Als het mogelijk is, wordt de move constructor gebruikt waardoor dus geen deep copy nodig is. Dat is hier na te lezen.

Ik verwacht niet dat in een vector kopieen worden gemaakt. Het overzetten naar een linked list hoeft niet moeilijk te zijn, je pakt bijvoorbeeld een list<> container. Maar ik denk niet dat het nodig is in dit geval.

(Het lijkt ondertussen wel alsof ik reclame maak voor de C++ Annotations. ;))

ik gebruik de C++ compiler van mingw (32-bit) maar ik kan nergens vinden of het dat -std=c++0x ondersteund... of hoe ik het aan de compiler moet mee geven, heeft iemand hier ervaring mee?
Beware of the Raping Zebra's
pi_92058338
quote:
1s.gif Op zaterdag 29 januari 2011 22:37 schreef netolk het volgende:

ik gebruik de C++ compiler van mingw (32-bit) maar ik kan nergens vinden of het dat -std=c++0x ondersteund... of hoe ik het aan de compiler moet mee geven, heeft iemand hier ervaring mee?
Als je een nieuwe versie gebruikt van het MinGW pakket, dan wel. Je compiler-versie vind je zo: g++ -v
En de optie kan je uiteraard op dezelfde manier meegeven. Ik zit op hetzelfde systeem (GCC 4.5.0) en compileer zo: g++ -Wall -std=c++0x -o main -enable-auto-import -O3 main.cc
"Slechts diegene mag slopen die iets beters kan bouwen."
  zondag 30 januari 2011 @ 09:37:53 #40
189216 netolk
maar dan andersom
pi_92068292
quote:
1s.gif Op zaterdag 29 januari 2011 22:44 schreef GS42 het volgende:

[..]

Als je een nieuwe versie gebruikt van het MinGW pakket, dan wel. Je compiler-versie vind je zo: g++ -v
En de optie kan je uiteraard op dezelfde manier meegeven. Ik zit op hetzelfde systeem (GCC 4.5.0) en compileer zo: g++ -Wall -std=c++0x -o main -enable-auto-import -O3 main.cc
waarvoor is -wall en auto-import importeert dat alle files in de map waar main staat?

ow hehe ik moet mn compiler maar eens even gaan updaten XD

zit op versie 3.4.5 :'(

[ Bericht 5% gewijzigd door netolk op 30-01-2011 09:49:11 ]
Beware of the Raping Zebra's
  zondag 30 januari 2011 @ 10:10:21 #41
189216 netolk
maar dan andersom
pi_92068622
kut, nu mis ik libgmp-10.dll ... terwijl die wel gewoon op mn pc staat...
Beware of the Raping Zebra's
pi_92072000
quote:
1s.gif Op zondag 30 januari 2011 09:37 schreef netolk het volgende:

[..]

waarvoor is -wall en auto-import importeert dat alle files in de map waar main staat?
De -Wall is een redleijk veelvoorkomende optie die alle warnings (Warnings ALL: Wall) aanzet, waardoor je tijdens het compileren melding krijgt van legale maar mogelijk gevaarlijke dingen (zoals statements die niets doen of het vergelijken van signed met unsigned waarden).
De enable-auto-import heb ik eigenlijk alleen voor MinGW hoeven gebruiken (en dus niet onder Linux), maar zorgt ervoor dat een waarschuwing over het importeren van dll's niet in beeld komt. Volgens mij is dit Windows- (en misschien zelfs MinGW-) specifiek.

quote:
kut, nu mis ik libgmp-10.dll ... terwijl die wel gewoon op mn pc staat...
Ja, het installeren van MinGW gaat bij mij ook (schijnbaar) willekeurig goed of fout. Al het oude eerst verwijderen (of verplaatsen, ik heb c:/mingw en c:/mingw_old) en dan proberen de getting started te volgen. Toen het eenmaal goed gelukt was, heb ik de map 'mingw' gekopieerd zodat ik deze bij een nieuwe installatie gewoon op een computer kan plakken, zodat ik niet dat hele installatieproces door hoef te lopen. Als het je niet lukt, kan ik je misschien mijn installatie-map (~250mb) wel doorspelen.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_92082065
Goedemiddag,

Twee dagen geleden ben ik begonnen met het leren van C++. Heb verder eigenlijk geen programmeerervaring, maar het leek me wel interessant. Mijn eerste programma heb ik nu gemaakt en het is enigszins gelukt. Het programma vraagt eerst om hoeveel getallen je bij elkaar wilt optellen, vraagt daarna om de getallen, stopt ze in een array en geeft vervolgens het antwoord. Helaas zit er wel een grote, potentiële error in, en dat is dat wanneer je bij het invoeren van de getallen geen getal invoert. Hierdoor crash hij (natuurlijk), maar ik weet niet hoe ik dmv bijv. een if of do..while die eruit kan vissen. Weten jullie hoe dat moet?

Verder heb ik zojuist geprobeerd om de ingevoerde getallen doubles ipv integers te maken. Dat lukte wel, maar steeds geeft hij op het einde een error. Hij heeft dan al wel de laatste functie uitgevoerd. Ik heb hieronder eerst de add.cpp gepost, en daarna de main.cpp.

SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Verder heb ik ervoor gekozen om zoveel kleine functies te gebruiken, omdat ik het dan makkelijker kan uitbreiden en het overzichtelijker blijft.
Als iemand tips heeft over hoe ik mijn programma op wat voor gebied dan ook kan verbeteren zou ik het graag horen.
pi_92083168
quote:
1s.gif Op zondag 30 januari 2011 16:14 schreef Jeroentk het volgende:
Goedemiddag,

Twee dagen geleden ben ik begonnen met het leren van C++. Heb verder eigenlijk geen programmeerervaring, maar het leek me wel interessant. Mijn eerste programma heb ik nu gemaakt en het is enigszins gelukt. Het programma vraagt eerst om hoeveel getallen je bij elkaar wilt optellen, vraagt daarna om de getallen, stopt ze in een array en geeft vervolgens het antwoord. Helaas zit er wel een grote, potentiële error in, en dat is dat wanneer je bij het invoeren van de getallen geen getal invoert. Hierdoor crash hij (natuurlijk), maar ik weet niet hoe ik dmv bijv. een if of do..while die eruit kan vissen. Weten jullie hoe dat moet?

Verder heb ik zojuist geprobeerd om de ingevoerde getallen doubles ipv integers te maken. Dat lukte wel, maar steeds geeft hij op het einde een error. Hij heeft dan al wel de laatste functie uitgevoerd. Ik heb hieronder eerst de add.cpp gepost, en daarna de main.cpp.

SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Verder heb ik ervoor gekozen om zoveel kleine functies te gebruiken, omdat ik het dan makkelijker kan uitbreiden en het overzichtelijker blijft.
Als iemand tips heeft over hoe ik mijn programma op wat voor gebied dan ook kan verbeteren zou ik het graag horen.
Kun je iets specifieker zijn in de foutmeldingen etc?

Een std::vector kan handig zijn als je met arrays wilt werken van variabele lengte.

Verder kun je in plaats van met references als argumenten te werken, de berekende waarde ook als uitkomst meegeven dus, bijvoorbeeld, int AantalGetallen() ipv void AantalGetallen(int &nAantal).
pi_92084295
quote:
Als iemand tips heeft over hoe ik mijn programma op wat voor gebied dan ook kan verbeteren zou ik het graag horen.
Oeh, een excuus om ongegeneerd te gaan muggenziften. :)

Je gebruikt voor elk getal een int. Opzich niets mis mee, maar een int kan ook negatief zijn. In veel getallen is een negatieve waarde geen valide waarde, bijvoorbeeld als je vraagt hoeveel getallen ingelezen moeten worden of als de index van een for-loop. In dit geval kun je beter het 'type' size_t gebruiken, dat in C(++) gebruikt wordt voor een 'size', oftewel een aantal of grootte dat niet negatief kan zijn. ('Type' staat hier tussen aanhalingstekens omdat het een typedef is voor een unsigned int en geen basistype.)

Je gebruikt een postfix increment in de for-loops: idx++. Wederom opzich niets mis mee, behalve dat idx++ een extra operatie uitvoert vergeleken met ++idx. (Lees het verschil maar eens ergens.) Een nette for-loop is dus als volgt:

1for (size_t idx = 0; idx < 10; ++idx)

Ik weet niet of het een typefout betreft, maar de declaratie

1void Vraag(double *&pnGetallen, int nAantal)

...is raar, omdat je een referentie naar een pointer doorgeeft. Ik kan me niet voorstellen dat dat de bedoeling was.

De main() functie van C++ hoeft geen return-waarde te hebben; als deze er niet is, wordt '0' teruggegeven. Je laatste statement in de main is dus nutteloos.

Iets gevaarlijks wat je doet is het volgende:

1double *pnGetallen = new double;

De operator new() alloceert geheugen buiten de stack en alles wat met new aangemaakt wordt, moet ook met delete verwijderd worden. Als je een pointer naar een double mee wilt geven, gebruik je daarvoor de &-operator:

1
2
double d = 3.14;
double *d_ptr = &d;

Pas als je werkelijk geheugen dynamisch wilt alloceren, gebruik je de operator new.

Ik ken de headerfile "stdafx.h" ook niet: weet je zeker dat je die nodig hebt?

Voor invoercontrole kan je het uitlees-statement evalueren:

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

int main() {

    size_t input;
    std::cout << "Voer een (positief) getal in: ";
    if (std::cin >> input)
        std::cout << "Uw getal is " << input << '\n';
    else
        std::cout << "Verkeerde invoer.\n";
}

Hopelijk heb ik je niet afgeschrikt. :)

[ Bericht 0% gewijzigd door GS42 op 30-01-2011 17:04:15 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
  zondag 30 januari 2011 @ 16:59:47 #46
189216 netolk
maar dan andersom
pi_92084343
quote:
1s.gif Op zondag 30 januari 2011 12:31 schreef GS42 het volgende:

[..]

De -Wall is een redleijk veelvoorkomende optie die alle warnings (Warnings ALL: Wall) aanzet, waardoor je tijdens het compileren melding krijgt van legale maar mogelijk gevaarlijke dingen (zoals statements die niets doen of het vergelijken van signed met unsigned waarden).
De enable-auto-import heb ik eigenlijk alleen voor MinGW hoeven gebruiken (en dus niet onder Linux), maar zorgt ervoor dat een waarschuwing over het importeren van dll's niet in beeld komt. Volgens mij is dit Windows- (en misschien zelfs MinGW-) specifiek.

[..]

Ja, het installeren van MinGW gaat bij mij ook (schijnbaar) willekeurig goed of fout. Al het oude eerst verwijderen (of verplaatsen, ik heb c:/mingw en c:/mingw_old) en dan proberen de getting started te volgen. Toen het eenmaal goed gelukt was, heb ik de map 'mingw' gekopieerd zodat ik deze bij een nieuwe installatie gewoon op een computer kan plakken, zodat ik niet dat hele installatieproces door hoef te lopen. Als het je niet lukt, kan ik je misschien mijn installatie-map (~250mb) wel doorspelen.
hmm die -wall deed ie hoe dan ook altijd al bij mij, maar krijg die mingw echt niet reïnstalleerd... :( eens even kijken hoe het met manual install gaat
Beware of the Raping Zebra's
pi_92084599
De error wanneer je geen getal invoert:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
De error die ik kreeg nadat ik van enkele ints doubles had gemaakt (zodat ik ook 0.66 + 0.33 kon doen etc.):
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Verder leek het me juist handig om voids te gebruiken, zodat ik geen hele functies in functies hoefde in te voeren? (zoals GeefResultaat(Vraag(AantalGetallen(), AantalGetallen(), Bereken(Vraag(AantalGetallen), AantalGetallen(), ... etc.
pi_92084956
De plaatjes doen het niet bij mij.
  zondag 30 januari 2011 @ 17:14:08 #49
189216 netolk
maar dan andersom
pi_92085005
quote:
1s.gif Op zondag 30 januari 2011 17:13 schreef thabit het volgende:
Plaatjes doen het niet bij mij.
bij mij ook niet...

@GS42, handmatig installeren is al helemaal niet te doen.. :( zou ik jou mingw mapje mogen hebben?
Beware of the Raping Zebra's
pi_92085094
quote:
1s.gif Op zondag 30 januari 2011 17:05 schreef Jeroentk het volgende:
De error wanneer je geen getal invoert:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
De error die ik kreeg nadat ik van enkele ints doubles had gemaakt (zodat ik ook 0.66 + 0.33 kon doen etc.):
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Verder leek het me juist handig om voids te gebruiken, zodat ik geen hele functies in functies hoefde in te voeren? (zoals GeefResultaat(Vraag(AantalGetallen(), AantalGetallen(), Bereken(Vraag(AantalGetallen), AantalGetallen(), ... etc.
Je kan ook iets doen als n = AantalGetallen() ipv Aantalgetallen(n)
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')