Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Aloittelijalla ongelma

Sivun loppuun

hunajavohveli [21.03.2004 20:40:02]

#

#include <iostream.h>

main()
{
   int taulukko[2000][2000];
   int a,b,c;

   for (a = 1; a <= 1000; a++) {
   	for (b = 1; b <= 1000; b++) {
         taulukko[a][b] = 1;
      }
   }

   cin >> c;

}

Tämän tarkoitus on siis käydä läpi kaksi päällekkäistä silmukkaa ja siten tallentaan numero 1 kaksiulotteisen taulukon joka alkioon. Mutta heti käätämisvaiheessa se valitaa, että:

Thread stopped
Fault: Access violation at 0x401117: write of address 0x30f88

Mielestäni olen tehnyt kaiken oikein, mutta siltä yhtä mittaa jostakin on valittamista.

jv_windy [21.03.2004 21:05:02]

#

En kyllä huomaa siinä mitään mikä voisi aiheuttaa tuon. Ehkäpä on muisti täynnä tai rikki.. Tuleeko aina tuo sama ilmoitus, vai vaihtelevatko muistiosoitteet?

Kaikkien alkioiden alustus kokonaislukuun 1, pitäisi muistaakseni onnistua näinkin:

int taulukko[2000][2000] = {1};

firebug [21.03.2004 22:31:39]

#

Tuollaiset taulukot tulee varata dynaamisesti joko malloc()/new:llä. Koska moniulotteisten taulukoitten varaaminen dynaamisesti on aikamoista säätöä, kannattanee tuokin vaihtaa yksiulotteiseksi.
Jotenkin tähän tapaan:

#include <iostream>

using namespace std;

int main()
{
   int *taulukko = new int[2000 * 2000]; //luodaan taulukko
   int c;

   for (int a = 0; a < 2000; a++) {
       for (int b = 0; b < 2000; b++) {
         taulukko[a * b] = 1;
      }
   }
   cin >> c;
   delete []taulukko;  //tuhotaan taulukko
   return 0;
}

sqwiik [21.03.2004 22:51:03]

#

Se 'aikamoinen säätö' on hieman hauskaa, mutta se onnistuu kyllä kun sen tekee monessa vaiheessa.

int ** taulukko, x;
  *taulukko = (int*)malloc(sizeof(int) * 2000);
  for(x = 0; x < 2000; x++)
    taulukko[x] = (int*)malloc(sizeof(int) * 2000);
  //Vapautus täytyy sitten tehdä päinvastaisessa järjestyksessä
  for(x = 0; x < 2000; x++)
    free(taulukko[x]);
  free(taulukko); //en ole varma, pitääkö tämäkin vielä olla :/

thefox [21.03.2004 23:18:54]

#

Virhe tulee kääntämisvaiheessa? Sangen erikoista. MSVC++ 6.0 kääntää tuon kyllä ihan OK, mutta ajettaessa valittaa (ymmärettävästi) stack overflowta. Tuo haluamasi taulukko on kuitenkin 2000 * 2000 * 4 = 16000000 tavun kokoinen (yli 15 megatavua).

sqwiikin koodi näyttä myöskin sangen omituiselta :-) Tässä olisi jonkinlainen korjattu versio:

#include <iostream.h>

main()
{
   int **taulukko;
   int a,b,c;
	 int x;

	 taulukko = new int *[2000];
	 for(x = 0; x < 2000; ++x)
		 taulukko[x] = new int[2000];

   for (a = 1; a <= 1000; a++) {
       for (b = 1; b <= 1000; b++) {
         taulukko[a][b] = 1;
      }
   }

   cin >> c;

	 for(x = 0; x < 2000; ++x)
		 delete[] taulukko[x];
	 delete[] taulukko;
}

Ihan vaan tiedoksi, btw, että mainin on palautettava arvo.

jv_windy [21.03.2004 23:42:37]

#

Main-funktion olisi hyvä palauttaa jokin arvo, mutta jos sitä ei palauta, niin eikös void ole pakollinen funktion tyyppi silloin. Muistaakseni tämä on pakko merkitä, mutta taas tyhjää parametriluetteloa ei ole pakko ilmaista void:lla. Tämä siis c++:ssa.

thefox [21.03.2004 23:59:46]

#

http://www.parashift.com/c -faq-lite/newbie.html#faq-29.3

Taitaapi olla niin että jos tuon paluuarvon tyypin jättää antamatta niin se defaulttaa sen int:ksi. Tästä en kyllä ole ihan varma (siis siitä, miten se on C++:n kanssa), suosittelisin aina määrittelemään sen int:ksi.

zacura [22.03.2004 14:09:06]

#

firebug kirjoitti:

taulukko[a * b] = 1;

Tuo nyt ei ihan ole oikein ;-).

taulukko[y*leveys+x] = 1;

Tuolla periaatteella menee solun "osoite" oikein (leveys siis taulukon leveys, esim. 2000);

edit: kirjoitusvirheitä

hunajavohveli [22.03.2004 16:04:41]

#

Ööh tota joo... olen siis vasta aloittelija (siis C++:ssa, en ohjelmoinnissa), ja tästä osa taisi mennä kyllä yli hilseen, mutta yritän ymmärtää.

Kai siinä joku muistijuttu tuli vastaan. Ainakin se aina lisäksi avas sellaisen ikkunan, missä näky jotain:

FFFFFFFCA
FFFFFFFCB

Ilmeisesti heksoja. Jaa no en tiedä, tapahtuiko se kääntämisvaiheessa. Ei kai sitten, kun kyllä ainakin cout tulosti näytölle ensin yhden tekstin (jätin se pois tuosta koodista, minkä näytin), mutta ei siinä ei varmasti ollut mitään ongelmaa. Vika tuli siis vasta silmukassa, koska cout-käsky oli vasta muuttuja-alustuksen jälkeen, eikä siis olisi voinut näkyä, jos vika olisi tullut muuttujien määrittelyssä.

firebug [22.03.2004 17:15:21]

#

Hups, esimerkkiin olikin pujahtanut pieni virhe :) Sen siitä saa kun väsyneenä kirjoittelee, onneksi zacura korjasi asian.


Sivun alkuun

Vastaus

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

Tietoa sivustosta