[c++] Array output gaat verkeerd

Pagina: 1
Acties:

  • GeNiTaLiX
  • Registratie: Maart 2004
  • Laatst online: 24-05 18:48
Ik heb een simpel programma geschreven, Ik heb een array en ik wil in de array cijfers zetten. Dus voor nummer[0] het cijfer 4 bijvoorbeeld en dan uiteindelijk wil ik dat de cijfers achter elkaar worden gezet..

Dus print de hele array, maar ik krijg de vaagste getallen

0x0042BA0C
0x0042BA0C
0x0042BA0C
0x0042BA0C
0x0042BA0C
0x0042BA0C =/

Dat is de output.

Ik heb een vermoeden dat ik wat verkeerd heb gedaan met int, dat het misschien groter moet worden.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//needed libaries
#include <iostream.h>

//load the variables
int getal, aantal, nummer[4];

void count()
{
if (aantal < 5)
{
cout<<"Voer een getal in ";
cout<<nummer[aantal]<<endl;
cin>>getal;
nummer[aantal] = getal;
aantal = aantal+1; //increase by 1
count();
} //until

cout<<nummer<<endl;

}


int main()
{
aantal = 0; 
count();
return 0;
}



Kan iemand me helpen?

Bij voorbaat dank,

mzzls gen

[ Voor 6% gewijzigd door gorgi_19 op 13-06-2004 12:12 ]


  • Weng
  • Registratie: Juni 2001
  • Laatst online: 11-05-2024

Weng

Are y'all ready kids

C++:
1
cout<<nummer<<endl; 


Met deze regel print je het geheugen adres van de array. Geef een index mee om de getallen te tonen.

[ Voor 9% gewijzigd door Weng op 13-06-2004 12:14 ]

Aye aye captain


  • GeNiTaLiX
  • Registratie: Maart 2004
  • Laatst online: 24-05 18:48
Ik heb dit er nu ingezet en hij print de array goed uit. Ik ben nog wel benieuwd of dit de verstandigste keuze was.

C++:
1
2
3
4
5
6
    
while (teller != 5)
{       
      cout<<nummer[teller]<<endl;
      teller = teller+1;
}


In ieder geval bedankt!

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Dit werkt, maar dit is een prima voorbeeld van een situatie waar een for() loop duidelijker is:
C++:
1
2
3
for ( int i = 0 ; i < 4 ; ++i) {
    std::cout << nummer[i] << "\n";
}


Over de rest van je programma heb ik ook wat opmerkingen (goed bedoeld hoor :)):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// in C++ include je tegenwoordig iostream
#include <iostream.h>

// De variabelen die jij declareerde zijn globaal, oftewel overal
// in het programma beschikbaar, dit is nergens voor nodig.
// In principe kun je het beste variabelen alleen beschikbaar
// maken voor de code die ze nodig heeft. Deze regel kan 
// dus weg, we declareren de variabelen ergens anders.
int getal, aantal, nummer[4];

// Je count() functie is recursief (roept zichzelf aan), in dit 
// geval is dit niet nodig. Dit kan prima opgelost worden 
// met een for() loop. Wen er ook aan om je code in te 
// springen, dit leest een stuk makkelijker als je over een
// maand wilt weten waar je eigenlijk mee bezig was ;)
void count()
{
    // Deze if() met aanroep van dezelfde functie kan vervangen 
    // worden door een for() loop.
    if (aantal < 5)
    {
        cout<<"Voer een getal in ";
        cout<<nummer[aantal]<<endl; // wat wil je hier doen?
        // nu stop je de ingevoerde waarde in getal, waarna je 
        // nummer[aantal] gelijk zet aan getal. Daarna gebruik
        // je getal niet meer. Die stap kun je overslaan.
        cin>>getal;
        nummer[aantal] = getal;
        // Dit soort commentaar voegt niet zo heel veel toe, je ziet
        //meteen dat aantal met 1 wordt verhoogd.
        aantal = aantal+1; //increase by 1
        count();
    } //until

    // Ik neem aan dat je je while() loop hier hebt neer gezet. 
    // Deze kan dus vervangen worden door een for().
    while (teller != 5)
    {
        cout<<nummer[teller]<<endl;
        teller = teller+1;
    }
}

int main()
{
    aantal = 0;
    count();
    return 0;
}



Als we dit alles aanpassen wordt het:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
// In de huidige C++ standaard zitten cout en cin in de std namespace.
// Daarom gebruik ik std::cout en std::cin, als je ziek wordt van elke
// keer die std:: er bij zetten kun je 'using std::cout;' gebruiken.

void count()
{
    // nummer is nu alleen bereikbaar binnen deze functie.
    // De variabelen getal en aantal hebben we niet nodig.
    int nummer[4];
    // Voor een variabele die alleen als tellertje wordt gebruikt
    // neem ik meestal een korte naam.
    for ( int i = 0 ; i < 4 ; ++i) {
        std::cout << "Voer een getal in ";
        // We stoppen het getal meteen in nummer[i]
        std::cin >> nummer[i];
        // Normaal gesproken zou je hier controleren of er
        // wel een nummer gelezen is.
    }

    // Deze loop print alle nummers op het scherm.
    for ( int i = 0 ; i < 4 ; ++i) {
        // Ik gebruik "\n" om een regeleinde te printen. std::endl flusht
        // namelijke meteen de buffer naar het scherm, en dat is (iets)
        // langzamer, en in dit geval sowieso onnodig.
        std::cout << nummer[i] << "\n";
    }
}

int main()
{
    count();
    
    return 0;
}



Nog één dingetje, je had 'if ( aantal < 5)' maar dit betekent dat je ook in nummer[4] probeert te schrijven. Dat mag niet, want nummer heeft maar 4 elementen:
C++:
1
2
3
4
5
6
7
8
9
int nummer[4];
// nummer heeft alleen de volgende elementen:
nummer[0];
nummer[1];
nummer[2];
nummer[3];
// Als je naar nummer[4] probeert te schrijven schrijf je naar
// het geheugen net na nummer[3], dit kan hele vervelende 
// problemen geven.


Je kunt er ook over denken om in plaats van een array een std::vector<int> te gebruiken. Hoop dat je er wat aan hebt :).

[ Voor 20% gewijzigd door _Squatt_ op 13-06-2004 14:32 . Reden: wat toegevoegd, commentaar wat minder breed gemaakt om de layout te behouden. ]

"He took a duck in the face at two hundred and fifty knots."


  • GeNiTaLiX
  • Registratie: Maart 2004
  • Laatst online: 24-05 18:48
Heel erg bedankt voor deze complete uitleg. ( dit is pas mijn 1e dag c++ , eerst in pascal gewerkt, werkt tog nog wat anders)

maar een vraagje, wat bedoel je met de vector?

p.s: error C2374: 'i' : redefinition; multiple initialization

[ Voor 16% gewijzigd door GeNiTaLiX op 13-06-2004 23:34 ]


  • GeNiTaLiX
  • Registratie: Maart 2004
  • Laatst online: 24-05 18:48
GeNiTaLiX schreef op 13 juni 2004 @ 23:30:
Heel erg bedankt voor deze complete uitleg. ( dit is pas mijn 1e dag c++ , eerst in pascal gewerkt, werkt tog nog wat anders)

maar een vraagje, wat bedoel je met de vector?

p.s: error C2374: 'i' : redefinition; multiple initialization
bij ms visual c++ 6.0

Bij bloodshed compileert ie wel goed.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
GeNiTaLiX schreef op 13 juni 2004 @ 23:30:
Heel erg bedankt voor deze complete uitleg. ( dit is pas mijn 1e dag c++ , eerst in pascal gewerkt, werkt tog nog wat anders)

maar een vraagje, wat bedoel je met de vector?

p.s: error C2374: 'i' : redefinition; multiple initialization
MS VC6 heeft een probleempje met variabelen die in een for lus worden gedeclareerd.

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

farlane schreef op 14 juni 2004 @ 09:28:
[...]


MS VC6 heeft een probleempje met variabelen die in een for lus worden gedeclareerd.
Leg het dan ook goed uit :)

VC6 plaatst lokale declaraties binnen een for-loop in de buitenste scope (wat fout is), oftewel:
C++:
1
2
3
4
5
6
7
void MyFunc()
{
for(int i = 0; i != 5; i++)
  cout << i << endl;

cout << i;   // foute boel
}

Deze code hoort niet te compileren, omdat i alleen binnen de scope van de for-loop hoort te bestaan. Omdat VC 'm echter op het hogere niveau introduceert zal er hier wel een extra '5' geprint worden. Dit houdt automatisch in dat je na die for-loop de variabele i niet opnieuw mag declareren, omdat ie reeds als int bekend is en gevuld zelfs.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Er is overigens een oplossing voor:
C++:
1
#define for if (0) {} else for


Dit stopt de for-lus in een if-block die wel z'n eigen scope heeft, en dus zullen de variabelen gedefinieerd in het for init gedeelte niet beschikbaar zijn buiten de lus

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