werken met pointers

Status
Niet open voor verdere reacties.

SETMRC

Gebruiker
Lid geworden
15 feb 2007
Berichten
23
Hallo, ik heb een vraagje ivm pointers en arrays. Ik ben een programma aan het schrijven voor school, en het volgende is wat ik ondertussen al heb:

#include <iostream>
#include <iomanip>

using namespace std;
void vFPrint( const int iRIJ );

int main()
{
const int iMAX_AANTAL = 10;
int iGetal;
int iGetallen[ iMAX_AANTAL ];

for( int i = 0; i < iMAX_AANTAL; i++ )
{
cout << "Geef het " << i+1 << "e getal in: ";
cin >> iGetal;
iGetallen[ iMAX_AANTAL ] = iGetal;
}
cout << endl << setw(10) << "Inhoud:" << endl;
cout << iGetallen[ iMAX_AANTAL ];
cout << endl;
cin.get();

char chVerwijder;

do
{
cout << endl << endl << "Wilt u een getal verwijderen?? (J/N)" ;
cin >> chVerwijder;
if(chVerwijder == 'J' || chVerwijder == 'j')
{
int iVerwijder;
cout << "Geef het getal in dat je wil verwijderen: ";
cin >> iVerwijder;

int *p;
p = iGetallen;
for( int p = 0; p < iMAX_AANTAL ; p++)
{
if(*p == iVerwijder)
{
iGetallen.erase(p);
iGetallen.push_back(0);
}
}
}

if(chVerwijder == 'N' || chVerwijder == 'n')
{
cout << "De ingegeven waardes zijn niet gewijzigd."<< endl<< endl;
}
}

while( chVerwijder != 'J' && chVerwijder != 'j' && chVerwijder != 'n' && chVerwijder != 'N' );

cout << endl << setw(10)<< "Inhoud:" << endl;
cout << iGetallen[ iMAX_AANTAL ]
cout <<endl;
cin.get();
}


Dus de bedoeling is dat ik een array maak bestaande uit getallen die de gebruiker gaat invoeren. Als dit eenmaal is ingegeven, komt er de vraag: wil je een waarde uit de array gaan verwijderen, en zo ja, welke? Als ze eenmaal verwijderd zijn, moeten ze vervangen worden door 0, en moeten de anderen getallen 1 plaats naar voor opschuiven.

Dus bovenstaande code heb ik rap ineen geflatst, nu heb ik nog 3 fouten die ik niet kan vinden (of verbeteren). Als die 3 fouten eenmaal weg zijn, hoe moet ik dan het resultaat op het scherm krijgen met de void vFPrint( const int iRIJ ) ??

Hopelijk kunnen jullie mij verder helpen, alvast bedankt ;)

greetz
 
Ik zou in ieder geval niet iMAX_AANTAL gebruiken om het i-e getal in de array te zetten of er uit te lezen.

Als je aangeeft welke foutmeldingen (?) je krijgt is het wat makkelijker om een verdere hint te geven. Want _echt_ voorzeggen dat doe ik zeker niet.
 
1. Krijg je foutmeldingen? Zoja.. welke?

2. Als alles compileert zal je programma vast en zeker hierop crahsen (net na de inleeslus):
cout << endl << setw(10) << "Inhoud:" << endl;
cout << iGetallen[ iMAX_AANTAL ];
cout << endl;
cin.get();
je array iGetallen heeft een lengte van iMAX_AANTAL, maar aangezien een array-index begint bij waarde 0, krijg je een geheugenschending.
De geheugenplaats iGetallen[iMAX_AANTAL] is namelijk niet aan jouw variabele toegewezen.

--Johan
 
Als je aangeeft welke foutmeldingen (?) je krijgt is het wat makkelijker om een verdere hint te geven
Dit zijn de foutmeldingen (errors)

c:\Documents and Settings\User01\Bureaublad\C++\opgave11\opgave11.cpp(40) : error C2100: illegal indirection - hoort bij if(*p == iVerwijder)

c:\Documents and Settings\User01\Bureaublad\C++\opgave11\opgave11.cpp(42) : error C2228: left of '.erase' must have class/struct/union type type is 'int [10]' - hoort bij iGetallen.erase(p);

c:\Documents and Settings\User01\Bureaublad\C++\opgave11\opgave11.cpp(43) : error C2228: left of '.push_back' must have class/struct/union type type is 'int [10]' - hoort bij iGetallen.push_back(0);
 
1. Krijg je foutmeldingen? Zoja.. welke?

2. Als alles compileert zal je programma vast en zeker hierop crahsen (net na de inleeslus):

je array iGetallen heeft een lengte van iMAX_AANTAL, maar aangezien een array-index begint bij waarde 0, krijg je een geheugenschending.
De geheugenplaats iGetallen[iMAX_AANTAL] is namelijk niet aan jouw variabele toegewezen.

--Johan

1. zie vorige post

2. ik snap wat je bedoelt ... maar hoe kan ik dit nu oplossen :confused:
 
1. iGetallen[ iMAX_AANTAL ] = iGetal;
Deze regel moet anders. Je wilt nu op geheugenplaats 10 een getal neerzetten.
Ik denk dat dit moet worden: iGetallen = iGetal; Anders heeft het loopen geen zin.

2. Horen de pushback methode en erase methode niet bij <vector> ? Volgens mij kun
je deze niet gebruiken bij statische arrays. (Weet het niet zeker).
 
1. iGetallen[ iMAX_AANTAL ] = iGetal;
Deze regel moet anders. Je wilt nu op geheugenplaats 10 een getal neerzetten.
Ik denk dat dit moet worden: iGetallen = iGetal; Anders heeft het loopen geen zin.

2. Horen de pushback methode en erase methode niet bij <vector> ? Volgens mij kun
je deze niet gebruiken bij statische arrays. (Weet het niet zeker).



Ik zal het alleszins proberen, ben ten einde raad :thumb:

de pushback en erase methode horen bij <vector>, maar door mijn gebrekkige kennis dacht ik dat het ook zou werken bij arrays.
 
Jabber slaat 2maal de nagel op de kop.

Voor wat je tot nu toe wil doen heb je nog geen pointer nodig, die komt er pas bij kijken als je die printfunctie maakt. Je moet aan die functie dan meegeven welke array je wil afdrukken (dit is de pointer) en de lengte van die array.

Wat je nu al had heb ik hier als werkende code bijgevoegd. Stel gerust een vraag als je er iets niet goed van begrijpt ;)

Code:
#include <iostream>
#include <iomanip>
using namespace std;


int main()
{
    //lengte van de array
    const int iMAX_AANTAL = 10;
    //array met plaats voor 10 waardes: index gaat van 0 tem 9
    int iGetallen[iMAX_AANTAL];

    //getallen inlezen
    for( int i = 0; i < iMAX_AANTAL; i++ ) {
        cout << "Geef het " << i+1 << "e getal in: ";
        //ingegeven waarde op plaats 1 zetten
        cin >> iGetallen[i];
    }
    //ingelezen waardes opnieuw afdrukken
    cout << endl << "Inhoud:" << endl;
    for (int i = 0; i < iMAX_AANTAL; i++)
        cout << setw(10) << iGetallen[i] << endl;
    cout << endl;
    cin.get();

    char chVerwijder;

    do {
        cout << endl << endl << "Wilt u een getal verwijderen?? (J/N)" ;
        cin >> chVerwijder;
        cin.get(); //enter uit buffer halen
        if (chVerwijder == 'J' || chVerwijder == 'j') {
            int iVerwijder;
            cout << "Geef het getal in dat je wil verwijderen: ";
            cin >> iVerwijder;

            //het getal opzoeken
            for (int i = 0; i < iMAX_AANTAL; i++) {
                if (iGetallen[i] == iVerwijder) {  //het getal is gevonden
                    //alle volgende getallen 1 plaats naar voren schuiven
                    for (int j = i+1; j < iMAX_AANTAL; j++) {
                        iGetallen[j - 1] = iGetallen[j];
                    }
                    //laatste getal op 0 zetten
                    iGetallen[iMAX_AANTAL - 1] = 0;
                    cout << "Waardes aangepast." << endl;
                    //uit de zoeklus breken
                    break;
                }
            }
        } else if(chVerwijder == 'N' || chVerwijder == 'n')
            cout << "De ingegeven waardes zijn niet gewijzigd."<< endl;
        else //ongeldige invoer
            cout << "Ongeldige invoer!" << endl;
    } while (chVerwijder != 'n' && chVerwijder != 'N' ); //vragen zolang er niet nee werd geantwoord

    //resultaat afdrukken
    cout << endl << "Inhoud:" << endl;
    for (int i = 0; i < iMAX_AANTAL; i++)
        cout << setw(10) << iGetallen[i] << endl;
    cout << "Druk op een toets om af te sluiten" << endl;
    cin.get();
    //de mainfunctie is van het type int -> je moet een waarde naar het OS terugsturen !!!
    return 0; //succesvol afgewerkt
}

--Johan
 
bedankt Johantrax ;)

kun je me (of iemand anders ) in het kort eens uitleggen wanneer je iGetallen gebruikt ipv iGetallen[iMAX_AANTAL] en waarom? want ik maak altijd de fout om de 2 door elkaar te gaan gebruiken.

en kun je ook alles afdrukken dmv een functie, bv. void afdrukken, en hoe zou het dan eruit zien?
 
Code:
    //lengte van de array
    const int iMAX_AANTAL = 10;
    //array met plaats voor 10 waardes: index gaat van 0 tem 9
    int iGetallen[iMAX_AANTAL];

    //getallen inlezen
    for( int i = 0; i < iMAX_AANTAL; i++ ) {
        cout << "Geef het " << i+1 << "e getal in: ";
        //ingegeven waarde op plaats 1 zetten
        cin >> iGetallen[i];
    }

1.const int iMAX_AANTAL = 10;
Je zegt dat de aantal plaatsen 10 zijn.

2.int iGetallen[iMAX_AANTAL]; //array met plaats voor 10 waardes: index gaat van 0 tm 9
Je maakt ruimte op een plank voor 10 boeken [plaatsen]. Deze plaatsen worden genummerd van 0 tm 9.

3. for( int i = 0; i < iMAX_AANTAL; i++ )
i is in dit geval een teller die opgehoogd wordt totdat deze op plaats nummer 9 komt.

4.cin >> iGetallen;
de n-de invoer wil je natuurlijk ook op de n-de plaats op de plank hebben. De teller geeft aan op welke plaats we nu zitten. Hier komt de invoer te staan.

Conclusie:
Met i geeft je de positie in de array aan.
Met iMAX_AANTAL heb je de grootte van je array gemaakt.

In welke omgeving werk je? Visual studio C++ ?
Dat helpt me iets meer om je te kunnen assisteren met betrekking tot je vraag hoe alles in een functie zou moeten werken.
 
Code:
    //lengte van de array
    const int iMAX_AANTAL = 10;
    //array met plaats voor 10 waardes: index gaat van 0 tem 9
    int iGetallen[iMAX_AANTAL];

    //getallen inlezen
    for( int i = 0; i < iMAX_AANTAL; i++ ) {
        cout << "Geef het " << i+1 << "e getal in: ";
        //ingegeven waarde op plaats 1 zetten
        cin >> iGetallen[i];
    }

1.const int iMAX_AANTAL = 10;
Je zegt dat de aantal plaatsen 10 zijn.

2.int iGetallen[iMAX_AANTAL]; //array met plaats voor 10 waardes: index gaat van 0 tm 9
Je maakt ruimte op een plank voor 10 boeken [plaatsen]. Deze plaatsen worden genummerd van 0 tm 9.

3. for( int i = 0; i < iMAX_AANTAL; i++ )
i is in dit geval een teller die opgehoogd wordt totdat deze op plaats nummer 9 komt.

4.cin >> iGetallen;
de n-de invoer wil je natuurlijk ook op de n-de plaats op de plank hebben. De teller geeft aan op welke plaats we nu zitten. Hier komt de invoer te staan.

Conclusie:
Met i geeft je de positie in de array aan.
Met iMAX_AANTAL heb je de grootte van je array gemaakt.


In welke omgeving werk je? Visual studio C++ ?
Dat helpt me iets meer om je te kunnen assisteren met betrekking tot je vraag hoe alles in een functie zou moeten werken.

Bedankt jabber :thumb:

ja, we werken in Visual Studio C++.
 
Het makkelijkst is om in Classview op de klasse te drukken.
Rechtermuisknop en Add memberfunction aan te klikken.
Vervolgens kies je "Generic class".
type: void of iets met return waarde (bln o.i.d)
name: Naam van je functie + wat je wilt meegeven
vb: CDisplayArray()
 
Het makkelijkst is om in Classview op de klasse te drukken.
Rechtermuisknop en Add memberfunction aan te klikken.
Vervolgens kies je "Generic class".
type: void of iets met return waarde (bln o.i.d)
name: Naam van je functie + wat je wilt meegeven
vb: CDisplayArray()
ok, maar hierdoor krijg ik geen functie (vb. vFDruk(const int iRIJ)) in mijn code. Het is dus de bedoeling om via een functie alles af te drukken (zoals ik in mijn eerste post gezet heb).
 
Een mogelijke functie om een willekeurige integer-array af te drukken:

De functie is van het type void -> de functie maakt geen resultaatwaarde aan, maar is enkel uitvoerend.
De functie neemt 2 argumenten: de pointer naar de array en de lengte van de array
de pointer naar de array: const int*const array
1ste const: de waardes die in de array zitten kunnen niet gewijzigd worden
2de const : het adres van de pointer kan niet gewijzigd worden, binnen de functie wijst de pointer dus altijd naar hetzelfde object
de lengte van de array: const int lengte
deze is nodig om door de array te kunnen loopen

Code:
void toonArray (const int*const array, const int lengte)
{
    cout << endl << "Inhoud:" << endl;
    for (int i = 0; i < lengte; i++)  //van 0 tot lengte-1 afdrukken
        cout << setw(10) << array[i] << endl;
    cout << endl;
    cin.get(); //wachten op een toets
}


De vorige code bijgewerkt, zodat deze gebruik maakt van de functie:
Code:
#include <iostream>
#include <iomanip>
using namespace std;

void toonArray(const int*const array, const int lengte);

int main()
{
    //lengte van de array
    const int iMAX_AANTAL = 10;
    //array met plaats voor 10 waardes: index gaat van 0 tem 9
    int iGetallen[iMAX_AANTAL];

    //getallen inlezen
    for( int i = 0; i < iMAX_AANTAL; i++ ) {
        cout << "Geef het " << i+1 << "e getal in: ";
        //ingegeven waarde op plaats 1 zetten
        cin >> iGetallen[i];
    }
    //ingelezen waardes opnieuw afdrukken
    toonArray(iGetallen, iMAX_AANTAL);

    char chVerwijder;

    do {
        cout << endl << endl << "Wilt u een getal verwijderen?? (J/N)" ;
        cin >> chVerwijder;
        cin.get(); //enter uit buffer halen
        if (chVerwijder == 'J' || chVerwijder == 'j') {
            int iVerwijder;
            cout << "Geef het getal in dat je wil verwijderen: ";
            cin >> iVerwijder;

            //het getal opzoeken
            for (int i = 0; i < iMAX_AANTAL; i++) {
                if (iGetallen[i] == iVerwijder) {  //het getal is gevonden
                    //alle volgende getallen 1 plaats naar voren schuiven
                    for (int j = i+1; j < iMAX_AANTAL; j++) {
                        iGetallen[j - 1] = iGetallen[j];
                    }
                    //laatste getal op 0 zetten
                    iGetallen[iMAX_AANTAL - 1] = 0;
                    cout << "Waardes aangepast." << endl;
                    //uit de zoeklus breken
                    break;
                }
            }
        } else if(chVerwijder == 'N' || chVerwijder == 'n')
            cout << "De ingegeven waardes zijn niet gewijzigd."<< endl;
        else //ongeldige invoer
            cout << "Ongeldige invoer!" << endl;
    } while (chVerwijder != 'n' && chVerwijder != 'N' ); //vragen zolang er niet nee werd geantwoord

    //resultaat afdrukken
    toonArray(iGetallen, iMAX_AANTAL);
    cout << "Druk op een toets om af te sluiten" << endl;
    cin.get();
    //de mainfunctie is van het type int -> je moet een waarde naar het OS terugsturen !!!
    return 0; //succesvol afgewerkt
}

/* drukt een megegeven array af, element per element, tot aan de waarde 'lengte' */
void toonArray(const int*const array, const int lengte)
{
    cout << endl << "Inhoud:" << endl;
    for (int i = 0; i < lengte; i++)
        cout << setw(10) << array[i] << endl;
    cout << endl;
    cin.get();
}

--Johan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan