#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.
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};
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; }
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 :/
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.
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.
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.
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ä
Öö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ä.
Hups, esimerkkiin olikin pujahtanut pieni virhe :) Sen siitä saa kun väsyneenä kirjoittelee, onneksi zacura korjasi asian.
Aihe on jo aika vanha, joten et voi enää vastata siihen.