View Single Post
Sitat av ClockWorx Vis innlegg
Takk, det var en nyttig ting å vite! Skal prøve å jobbe meg videre i oppgavene nå, så kommer jeg tilbake hvis det er noe mer jeg lurer på !

Er nå på en ny oppgave:
Den første funksjonen skriver en melding om det ikke er plass til flere topper i datastrukturen.
I motsatt fall leses en potensielt ny topps navn. Om denne allerede finnes (bruk ferdiglaget
funksjon) kommer det en melding. I motsatt fall tas en ny Topp i bruk, og den leser alle sine data
selv (vha. den andre funksjonen). Husk å bruke ferdiglagde funksjoner, der du sender med noen
rimelige tallverdier som parametre.
Vis hele sitatet...
Jeg forstår ikke hvordan jeg skal kunne vite om etappe arrayen er full eller om den har plass til flere elementer? Tenkte først at kanskje jeg kunne sjekke siste indeks for 0, men i c++ blir vel arrays som ikke er definert bare tildelt tilfeldige minneverdier. Noen hint?
Vis hele sitatet...
Jeg forsto ikke helt hva oppgaven gikk ut på, den var dårlig formulert. Men jeg kan prøve å svare på spørsmålet ditt. Du har to variabler som forteller deg dette, 'MAXETAPPER' beskriver antall elementer i arrayen 'etappene'. Og 'sisteEtappe' holder siste index som er lagt til, så du må huske å øke 'sisteEtappe' med 1 hver gang du legger til et nytt element i arrayen. Så du må sjekke at 'sisteEtappe' ikke overskrider 'MAXETAPPER'.

Men som tidligere sagt, så er dette en idiotisk måte å gjøre det på. Rå arrayer tilhører en tid der C var «the shit». I C++ så behandles disse mye bedre og enklere ved å bruke template kontainere som std::array, std::list, std::vector o.l. I ditt tilfelle så hadde det vært perfekt å bruke en dynamisk allokert template kontainer som std::vector.

Kode

#include <cstdlib>
#include <iostream>
#include <vector>

class Topp
{
        public:
                int x;
};

int main(int argc, char **argv)
{
        std::vector<Topp> foo;  // Deklarerer 'foo' som en 'std::vector' som består av 'Topp' elementer
        Topp a;
        Topp b;
        Topp c;                 // Deklarerer 3 instanser av 'Topp' klassen.

        a.x = 1;
        b.x = 3;
        c.x = 12;               // Gir 'x' i de 3 instansene av 'Topp' klassen verdier.

        foo.push_back(a);
        foo.push_back(b);
        foo.push_back(c);       // Pusher de 3 instansene av 'Topp' klassen inn i std::vector kontaineren.

        std::cout << "Størrelsen av foo: " << foo.size() << std::endl;

        // Man kan få tilgang til 'foo' elementene på flere måter:
        // 1: Bruk av foo.at() metoden

        for (size_t i = 0; i < foo.size(); i++)
        {
                std::cout << "foo.at(" << i << ").x: " << foo.at(i).x << std::endl;
        }

        // 2: Bruk av klammeparenteser

        for (size_t i = 0; i < foo.size(); i++)
        {
                std::cout << "foo[" << i << "].x: " << foo[i].x << std::endl;
        }

        // 3: Bruk av iteratorer
        // Vanligvis skrives for looper på en linje.
        // Men jeg har splittet den over tre linjer for å kunne kommentere hver del.

        for(    auto foo_it = foo.begin();      // Deklarere og assigne std::vector<Topp>::iterator fra foo.begin()
                foo_it != foo.end();            // Sjekke at iteratoren ikke er på ended av foo
                ++foo_it)                       // Increase iteratoren
        {
                std::cout << "std::vector<Topp>::iterator: " << foo_it -> x << std::endl;
        }

        return(EXIT_SUCCESS);
}
Output:

Kode

Størrelsen av foo: 3
foo.at(0).x: 1
foo.at(1).x: 3
foo.at(2).x: 12
foo[0].x: 1
foo[1].x: 3
foo[2].x: 12
std::vector<Topp>::iterator: 1
std::vector<Topp>::iterator: 3
std::vector<Topp>::iterator: 12
std::vector er dynamisk allokert, det vil si at du trenger ikke å tenke på størrelsen til den. Når du pusher et nytt element inn, så tar std::vector kontaineren seg av allokering av minne, samme når du sletter elementer i fra den. Så den vil alltid ha riktig størrelse.

Men det kan godt tenkes at læreren deres ønsker at dere skal lære å håndtere rå arrays, jeg gjør deg bare oppmerksom på at det finnes mer sofistikerte og effektive måter å gjøre det på.
Sist endret av nso; 14. november 2017 kl. 16:18.