Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 15.06.24 - klo:10.25
-
Taas on tullut vastaan pieni ainakin toistaiseksi ratkaisematon pulma.
#include <vector>
#include <iostream>
int main()
{
int ktab[10];
ktab[4] = 44;
for(auto i : ktab) std::cout << ktab[i] << " ";
std::cout <<ktab[4];
return 0;
}
Ohjelma on kännetty näin
g++ -std=c++20 -pedantic koe.cpp -o koe
Käännös ja suoritus menevät hyvin, mutta tulostus on tällainen
0 0 0 0 0 0 0 0 0 0 44
Ajatuksena on, että taulukon kohdan 4 pitäisi näkyä myös for-osassa. Eikö automaattinen for toimikaan säilöjen ulkopuolella, virheilmoituksia eikä varoituksia kuitenkaan tule.
Olisiko tällainen kesäpähkinä sopiva: Etsi virhe edellä esitetyssä päättelyssä
-
Minulla ohjelmasi kaatui suoritettaessa ("...terminated by signal SIGSEGV (Address boundary error)").
Jos haluasin tehdä ohjelman, joka toimii kuten ymmärrän kuvauksestasi, se menisi mielestäni näin:
#include <vector>
#include <iostream>
int main()
{
int ktab[10] = {};
ktab[4] = 44;
for(auto i : ktab) std::cout << i << " ";
std::cout <<ktab[4];
return 0;
}
Erot ovat siinä, että alustan taulukon (nollilla) ja tulostan i:n arvon suoraan (sen sijaan että käyttäisin taulukon elementtejä indekseinä itse taulukkoon, joka johtaa tietenkin taulukon rajojen ylittämiseen). i on ohjelmassasi harhaanjohtava muuttujan nimi, koska se ei sisällä indeksiä vaan itse elementin.
-
Asia on juuri niin. Pitäisi tulostaa i, eikä olisi pitänyt valita sellaista muuttujanimeä, josta on vaikea päätellä, että kyseessähän on taulkon elementti.
Yritin kirjoittaa sellaista koodia, jossa voisi mahdollisimman helposti vaihtaa alla olevan rakenteen int ktab[10] std::vector ktab -rakenteeksi ja päinvastoin. sizeof ei oikein toiminut iteraatiorajana, mutta kokeiltu for -rakenne taitaisi toimia.
Kiitos vastauksesta, pähkinän ratkaisu helpotti tilannetta ainakin täällä päässä :)