Toon posts:

[MSVC++] Probleem met vectoren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Volgende voegt een getal toe aan een vector, ik geef een plaats in waar het getal moet kkomen en dan test ik of de >= de groote is van de vector, dit dient als fout opvanging, maar als ik een getal kleiner als 0 ingeef en ik vervang testplaats door getallen.size() blijft het programma toch in de do while lus zitten terwijl als ik de variable testplaats gebruik het programma dit niet doet. Waarom?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void toevoegen(vector<int>&getallen)
{   int getal,plaats,testplaats;
    vector<int>::iterator pos = getallen.begin();
    do
    {
    cout << "Op welke plaats wil je een getal toevoegen : ";
    cin >> plaats;
    cin.get();
    testplaats = getallen.size();
    }while(plaats >= testplaats);
    cout << "Geef een getal in : ";
    cin >> getal;
    cin.get();
    pos += plaats;
    getallen.insert(pos,getal); 
}

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
De functie size heeft als return waarde een size_t. Een size_t is een typedef naar een unsigned int. Als jij de vergelijking opschrijft waar je een signed int (plaats) vergelijkt met een unsigned int, dan wordt de signed int tijdelijk gecast naar een unsigned waarde. Als jij een negatieve waarde opgeeft, en dit wordt gecast naar een unsigned int, komt daar een positieve waarde uit... wat dus altijd groter is dan 0.

Als je de return waarde van size in testplaats stopt, dan wordt dit automagisch gecast naar een signed int waarde, waardoor je dus een signed int met een signed int vergelijkt, wat dus verder geen probleem oplevert.

Oplossing: Zo laten (met testplaats), of de return waarde van size casten naar een int.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Topicstarter
Ik begrijp het niet helemaal, als ik een negatief getal ingeef zou ik eigenlijk nog een controle moeten bijmaken als ik testplaats gebruik want ik kan geen getal op plaats -5 zetten ofzo. Maar als ik de functie size gebruik blijft het programma gewoon de lus.
Volgens wat ik van jou uitleg heb verstaan is als ik bv -5 ingeef als plaats en de size is 20 dan wordt -5 gecast naar 5, maar 5 is toch niet >=20 en zou het programma toch uit de lus moeten gaan, maar toch gebeurt dit niet?

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Verwijderd schreef op 04 maart 2004 @ 23:51:
Ik begrijp het niet helemaal, als ik een negatief getal ingeef zou ik eigenlijk nog een controle moeten bijmaken als ik testplaats gebruik want ik kan geen getal op plaats -5 zetten ofzo. Maar als ik de functie size gebruik blijft het programma gewoon de lus.
Volgens wat ik van jou uitleg heb verstaan is als ik bv -5 ingeef als plaats en de size is 20 dan wordt -5 gecast naar 5, maar 5 is toch niet >=20 en zou het programma toch uit de lus moeten gaan, maar toch gebeurt dit niet?
Een unsigned int gaat van 0 t/m 4294967295, terwijl een signed int van -2147483648 t/m 2147483647 gaat (in een 32bits omgeving; de grootte van een int is in principe afhankelijk van de compiler, maar met VC++ is dit 32bits, tenzij je op een 64bits systeem werkt)

Als je een negatief getal cast (ofwel expliciet, danwel impliciet zoals in dit geval), dan gaat de waarde door z'n minimum en slaat door naar z'n max. Dus als jij -5 invult en er zitten bv 20 elementen in je vector, dan krijg je de volgende vergelijking:
C++:
1
while( (4294967295 - 5) >= 20)

Wat dus in principe altijd wel true is...

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Topicstarter
Oke, nu begrijp ik het. Bedankt :*)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

beter laat dan nooit enzo ;)
_Mo_ schreef op 04 maart 2004 @ 23:58:
tenzij je op een 64bits systeem werkt
een int is op win64 nog steeds 32 bits

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1