Kirjoittaja Aihe: [ ratkaistu ] c++ for -aiheinen (kesä)pähkinä  (Luettu 2229 kertaa)

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
Taas on tullut vastaan pieni ainakin toistaiseksi ratkaisematon pulma.

Koodia: [Valitse]

#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
Koodia: [Valitse]
g++ -std=c++20 -pedantic koe.cpp -o koe

Käännös ja suoritus menevät hyvin, mutta tulostus on tällainen
Koodia: [Valitse]
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ä     



« Viimeksi muokattu: 15.06.24 - klo:13.34 kirjoittanut teele »

Lepotila zZ

  • Käyttäjä
  • Viestejä: 347
    • Profiili
Vs: c++ for -aiheinen (kesä)pähkinä
« Vastaus #1 : 15.06.24 - klo:11.30 »
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:
Koodia: [Valitse]
#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.

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
Vs: c++ for -aiheinen (kesä)pähkinä
« Vastaus #2 : 15.06.24 - klo:13.31 »
 
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ä  :)