Toon posts:

[C++] Iterator werkt niet.

Pagina: 1
Acties:

Verwijderd

Topicstarter
als ik dit doe, gaat het helemaal goed:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
bool Ruimte::isInRuimte(int kaartnr) { 
    
    vector<int> gebrInRuimte;
    for(vector<int>::iterator i(gebrInRuimte.begin()); i != gebrInRuimte.end();i++)
    {
        
        if(kaartnr == *i)
                return true;
        
    }
    
    return false;
}


maar als ik vervolgens de vector naar de classe als member plaats gaat het fout en krijg ik een geheugen fout. na wat testen zag ik ook dat ongeacht de inhoud van de vector hij de for-loop oneindig herhaald. er gaat dus iets fout met begin() en end().

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Ruimte {
public:
    Ruimte();
    void voegDeurcontrollerToe(Ruimte *bestemming, Kaartlezer *k);
    void melding(Melding meld);

    void ontgrendelAlles();
    bool isInRuimte(int);
    bool magInRuimte(int);
    
    
private:
    vector<int> toegangsLijst;
    vector<int> gebrInRuimte;
    vector<Deurcontroller> lnkDeurcontroller;
};


C++:
1
2
3
4
5
6
7
8
9
10
11
12
bool Ruimte::isInRuimte(int kaartnr) { 
    
    for(vector<int>::iterator i(gebrInRuimte.begin()); i != gebrInRuimte.end();i++)
    {
        
        if(kaartnr == *i)
                return true;
        
    }
    
    return false;
}



ook heb ik geprobeerd met size() het op te lossen, dus gewoon een int als teller en met [] de vector benaderen. en ook dit gaf een geheugen fout.

wat doe ik nou fout? ik kom er nu echt niet meer uit :'(

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Zie zo snel niet waarom dit fout zou moeten gaan. Welke compiler/platvorm gebruik je?


Btw, het ziet eruit alsof je een soort std::map aan het bouwen bent.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
ik gebruik dev-C++ met mingw compiler.

maar dit is gewoon een lijstje met getallen, en wil kijken of 1 getal er in zit. misschien is een map o een set ofzo dan idd ook wel een idee.. ik ga anders wel ff kijken of de problemen oplossen als ik een map ofzo gebruik.

  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:10 ]


  • DeGroninger2
  • Registratie: Mei 2002
  • Laatst online: 30-04 21:43
Gokje. Je probeert de iterator (i) te initialiseren met een iterator van een ander type (begin()). Voor een vector is een iterator niet meer dan een pointer naar een element in de vector T*. Echter de begin() methode van een vector kan ook een const_iterator retourneren en die is van het type T&. Als je nu een T* wilt initialiseren met een T& als inhoud, dan kan dat weleens problemen opleveren, denk ik. Ik gebruik altijd een = in deze gevallen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
bool Ruimte::isInRuimte(int kaartnr) {  
     
    vector<int> gebrInRuimte; 
    for(vector<int>::iterator i = gebrInRuimte.begin(); i != gebrInRuimte.end();i++) 
    { 
         
        if(kaartnr == *i) 
                return true; 
         
    } 
     
    return false; 
}

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
DeGroninger: Helaas, complete onzin.

Ten eerste is de vector::iterator soms een pointer, maar dat is niet de norm. Het is vaak een class, in het bijzonder in debug builds.

Ten tweede kan de begin hier geen const_iterator opleveren. Alleen de vector::begin() const geeft een const_iterator terug.

Ten derde is een const_iterator nooit van het type T&.

Ten vierde kun je een T& niet met een T* initialiseren of andersom

Ten vijfde heeft de = er helemaal niets mee te maken.


Mijn gok is dat de TS de vector eerder om zeep heeft geholpen, bivoorbeeld door elementen "toe te voegen" met [ ] zonder eerst een resize() te doen

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
TS?

maar ik heb verder nog niets met die vector gedaan. hij is gedeclareerd en heeft dus 0 elementen. heb daarna nog niets ermee gedaan.. heb opzich wel geprobeerd eerst met wat push_back's hem te vullen, maar vind [] niet echt een nette manier van vectortje vullen, dus die gebruik ik niet zo vaak. ;)

Verwijderd

Topicstarter
ik ga anders zo maar eens kijken of hij op de linuxbak wel gaat compileren. heb geen platform specifieke dingen gebruikt dus moet geen probleem zijn.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
topic start(er) :)


Ik heb toch het idee dat je vector niet goed geinitialiseerd is. Roep je een constructor aan v/d vector in de constructor van je eigen class?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Suffie
  • Registratie: Maart 2002
  • Laatst online: 23:32
je declareert je vector in de class
maar vervolgens OOK in bool isInRuimte()

moet het niet maar bij 1 van de 2?

het is te lang geleden dat ik ge C++-d heb

I don't suffer from insanity, I enjoy every minute of it


Verwijderd

suffie: je moet even goed lezen wat de TS verteld in zijn eerste post. Hij geeft hier 2 totaal verschillende voorbeelden.

maar even back-to-business: heb je geen header files door elkaar gehaald? dus in header file #include <vector.h> en in cpp file #include <vector>?

Gebruik overigens voor de stl altijd de extensieloze headers, de andere zijn voor backwards compatibility en hoeven niet gelijk te zijn aan de extensieloze headers.

[ Voor 24% gewijzigd door Verwijderd op 22-11-2004 11:56 ]


Verwijderd

ik zou trouwens in dit geval een map gebruiken, een map.count(waarde) is dan voldoende...

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
map is een Key-Value mapping. De beste STL container is std::set<int>, maar dat was de vraag niet.

Ander idee: TS, heb je misschien een probleem met de 'this' pointer?

vb.
C++:
1
2
3
4
5
6
Ruimte* p1;
Ruimte* p2 = 0;
std::auto_ptr<Ruimte> p3 ( new Ruimte );
p1->isInRuimte(0); // oops
p2->isInRuimte(0); // oops
p3->isInRuimte(0); // goed

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Als ik de code van isInRuimte bekijk is dat ook wat ie wil.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

ik bedoel maar

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
farlane schreef op maandag 22 november 2004 @ 13:14:
Als ik de code van isInRuimte bekijk is dat ook wat ie wil.
Ik zie maar een waarde daar. Wat gebruik je als tweede waarde dan?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
OlafvdSpek schreef op maandag 22 november 2004 @ 14:27:
[...]

Ik zie maar een waarde daar. Wat gebruik je als tweede waarde dan?
Jullie hebben idd gelijk, my bad :o

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • AlanSmithee
  • Registratie: Maart 2004
  • Laatst online: 07-07-2025
Wat ik raar vind is dat met size() ook een geheugen fout geeft. Er van uit gaande dat die loop zelf goed was geschreven denk ik dat size() niet 0 returnde.

De TS zegt zelf niks met de vector verder te doen, dus zal er om een of andere reden crap in de vector staan die een geheugen fout geeft.

Misschien kan TS even debuggen(zowel deze als met size() ) om te kijken wat de waardes zijn.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Inderaad.
Hoe maak je Ruimte instanties?
Met new, op de stack, in een container?

Verwijderd

hij gebruikt int als datatype in de vector, dus er zal wel een kopie van de int in de vector geplaatst worden, wat het daardoor niet meer interessant maakt of deze op de stack of op de heap geinstantieerd wordt. (natuurlijk moet hij deze op de heap geinstantieerde int niet deleten, maar dat lijkt mij wel duidelijk)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Verwijderd schreef op maandag 22 november 2004 @ 15:56:
hij gebruikt int als datatype in de vector, dus er zal wel een kopie van de int in de vector geplaatst worden, wat het daardoor niet meer interessant maakt of deze op de stack of op de heap geinstantieerd wordt. (natuurlijk moet hij deze op de heap geinstantieerde int niet deleten, maar dat lijkt mij wel duidelijk)
Volgens mij ben je in de war.

Zowieso ging het over het object waar de vector in zit, maar daarnaast kun je de int waarvan de vector een kopie maakt best deleten nadat deze is toegevoegd. ( Het wordt een ander verhaal als je pointers naar int's opslaat in de vector natuurlijk. )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op maandag 22 november 2004 @ 15:56:
hij gebruikt int als datatype in de vector, dus er zal wel een kopie van de int in de vector geplaatst worden, wat het daardoor niet meer interessant maakt of deze op de stack of op de heap geinstantieerd wordt. (natuurlijk moet hij deze op de heap geinstantieerde int niet deleten, maar dat lijkt mij wel duidelijk)
Het ging meer om de situatie waarin het hele Ruimte object 'kapot' is om wat voor reden dan ook.

Verwijderd

(natuurlijk moet hij deze op de heap geinstantieerde int niet deleten, maar dat lijkt mij wel duidelijk)
beetje stom geformuleerd, bedoel eigenlijk dat hij hem niet moet deleten voordat hij hem toevoegd aan de vector, beetje domme opmerking, my bad.

Verwijderd

Topicstarter
@farlane: nee ik gebruik geen constructor voor die vector in mijn class-constructor. moet dit dan? en zo ja, hoe? gewoon zoals dit?

C++:
1
Ruimte::Ruimte() : gebrInRuimte(0), toegangsLijst(0) {}


@kubbazoob: oude en nieuwe headers door mekaar gaan gebruiken? oude in h files en nieuwe in cpp files zorgt voor declaratie met oude definitie, en gebruik met nieuwe.. dat gaat nooit goed.

ik ga nu trouwens idd een set gebruiken.. het is gewoon een lijst van gebruikernummers aanwezig zijn in een bepaalde ruimte(toegangscontrole systeem voor schoolproject)

maar wil nog steeds weten wat het probleem hiermee is.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
farlane zit mis. Aangezien je geen expliciete argumenten meegeeft voor de vector ctor wordt gewoon de default ctor van vector gebruikt vanuit jouw ctor. De default ctor van vector maakt gewoon een lege vector aan, precies wat je wil.

De enige reden dat dat fout kan gaan, is dat de aanroep van de vector ctor gebeurt vanuit jouw ctor. Dus als je vergeet je eigen ctor aan te roepen wordt geen van de members goed geinitialiseerd. Dan mkaat het niet meer uit of je members ints of vectors zijn, vergeten is vergeten.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
MSalters schreef op donderdag 25 november 2004 @ 16:56:
farlane zit mis. Aangezien je geen expliciete argumenten meegeeft voor de vector ctor wordt gewoon de default ctor van vector gebruikt vanuit jouw ctor. De default ctor van vector maakt gewoon een lege vector aan, precies wat je wil.
Hmm, ik heb ook niet gezegd dat ie een constructor moet aanroepen, mijn vraag was of ie dat deed.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1