Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Taulukoiden debuggaaminen

Poika [16.01.2017 07:26:22]

#

Kyseessä on yksi, kaksi ja joskus kolmiulotteiset taulukot.
Staattisesti varattuina, esim double Alfa[100][3];, niiden debuggaaminen on helppoa GDB:llä joka on tullut sekä Qtn että Code::Blokin mukana.
Sitten kun tila varataan new operaattorilla niin minä ainakaan en saa taulukkojen sisältöä näkyviin debuggerissa.

Mitähän ratkaisukeinoja kannattaisi käyttää?

Metabolix [16.01.2017 18:22:01]

#

Riippuu, miten se on new-operaattorilla varattu.

Joka tapauksessa voit tulostaa GDB:ssä yksittäisiä arvoja:

(gdb) print dpp[100][3]
$2 = 1

Jos tiedät muistissa peräkkäin olevien arvojen määrän, voit tulostaa monta peräkkäin näin:

(gdb) print (double[5]) dpp[100][3]
$3 = {1, 2.5, 7, 0, 0}

Kannattaa vakavasti miettiä, onko new-operaattorin käyttö järkevää. C++:n kohdalla std::vector säästää huomattavasti vaivaa ja estää muistivuotoja. Erityisesti moniulotteiset taulukot new-operaattorilla ovat aikamoista sähläystä, ja vaihtoehtoina on tehdä vektorillinen vektoreita tai laskea yhdessä vektorissa indeksit seuraavasti:

taulu2d[a][b] = vektori[a * leveys + b];

Poika [17.01.2017 01:51:46]

#

"Riippuu, miten se on new-operaattorilla varattu."

Miten se sitten pitäisi varata new-operaattorilla jotta taulukon käyttö ohjelmakoodissa olisi samanlaista kuin natiivilla 2Dtaulukollakin ja taulukko saataisiin hiiren avulla esille GDBssä?

Elias Kosunen [17.01.2017 17:03:57]

#

Jos käytät C++:aa, niin älä käytä C-tyylisiä taulukoita. Käytä std::vectoria tai mielummin std::arrayta jos tiedät taulukon koon jo käännettäessä. Kääntäjä optimoi sen kokonaan pois (-O1 riittää gcc:ssä) ja sillä et voi vahingossa sörkkiä taulukon ulkopuolelle.

Raaka new ilman mitään RAII-wrapperia aiheuttaa vain turhia muistivuotoja tupla-deleten, sen unohtamisen tai exceptioneiden (onko tuolle jotain suomenkielistä sanaa?) vuoksi.

Metabolix [17.01.2017 19:42:28]

#

Jos taulukon koko on ennalta tiedossa, sen voi toki varata ”dynaamisesti” GDB:n ymmärtämällä tavalla niin, että laittaa taulukon luokkaan ja luo uuden olion. Varsinaista dynaamista (muuttuvan kokoista) taulukkoa ei voi varata niin, että GDB näyttäisi sen automaattisesti, koska taulukkoon ei liity tietoa sen mitoista.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta