Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tablice dwuwymiarowe nie chcą się kompilować po osiągnięciu 27 pozycji indeksu (table[26][i]).

Ostatnio zmodyfikowano 2013-07-05 20:35
Autor Wiadomość
V0ldek
Temat założony przez niniejszego użytkownika
Tablice dwuwymiarowe nie chcą się kompilować po osiągnięciu 27 pozycji indeksu (table[26][i]).
» 2013-07-05 20:15:02
Ostatnio dla sportu i rekreacji pracowałem nad prostym translatorem alfabetu łacińskiego na alfabet Morse'a. Największy problem nie sprawił mi jednak sam przekład tekstu, lecz zakodowanie bazy danych. Stworzyłem coś takiego:
C/C++
#include <iostream>
#include <cstdlib>

void database( std::string table[][ 2 ] )
{
    //LATIN ALPHABET DATABASE
    table[ 0 ][ 1 ] = "A";
    table[ 1 ][ 1 ] = "B";
    table[ 2 ][ 1 ] = "C";
    table[ 3 ][ 1 ] = "D";
    table[ 4 ][ 1 ] = "E";
    table[ 5 ][ 1 ] = "F";
    table[ 6 ][ 1 ] = "G";
    table[ 7 ][ 1 ] = "H";
    table[ 8 ][ 1 ] = "I";
    table[ 9 ][ 1 ] = "J";
    table[ 10 ][ 1 ] = "K";
    table[ 11 ][ 1 ] = "L";
    table[ 12 ][ 1 ] = "M";
    table[ 13 ][ 1 ] = "N";
    table[ 14 ][ 1 ] = "O";
    table[ 15 ][ 1 ] = "P";
    table[ 16 ][ 1 ] = "Q";
    table[ 17 ][ 1 ] = "R";
    table[ 18 ][ 1 ] = "S";
    table[ 19 ][ 1 ] = "T";
    table[ 20 ][ 1 ] = "U";
    table[ 21 ][ 1 ] = "V";
    table[ 22 ][ 1 ] = "W";
    table[ 23 ][ 1 ] = "X";
    table[ 24 ][ 1 ] = "Y";
    table[ 25 ][ 1 ] = "Z";
    table[ 26 ][ 1 ] = " "; //space
   
    //MORSE CODE DATABASE
    table[ 0 ][ 2 ] = "._ "; //A
    table[ 1 ][ 2 ] = "_... "; //B
    table[ 2 ][ 2 ] = "_._. "; //C
    table[ 3 ][ 2 ] = "_.. "; //D
    table[ 4 ][ 2 ] = ". "; //E
    table[ 5 ][ 2 ] = ".._. "; //F
    table[ 6 ][ 2 ] = "__. "; //G
    table[ 7 ][ 2 ] = ".... "; //H
    table[ 8 ][ 2 ] = ".. "; //I
    table[ 9 ][ 2 ] = ".___ "; //J
    table[ 10 ][ 2 ] = "_._ "; //K
    table[ 11 ][ 2 ] = "._.. "; //L
    table[ 12 ][ 2 ] = "__ "; //M
    table[ 13 ][ 2 ] = "_. "; //N
    table[ 14 ][ 2 ] = "___ "; //O
    table[ 15 ][ 2 ] = ".__. "; //P
    table[ 16 ][ 2 ] = "__._ "; //Q
    table[ 17 ][ 2 ] = "._. "; //R
    table[ 18 ][ 2 ] = "... "; //S
    table[ 19 ][ 2 ] = "_ "; //T
    table[ 20 ][ 2 ] = ".._ "; //U
    table[ 21 ][ 2 ] = "..._ "; //V
    table[ 22 ][ 2 ] = ".__ "; //W
    table[ 23 ][ 2 ] = "_.._ "; //X
    table[ 24 ][ 2 ] = "_.__ "; //Y
    table[ 25 ][ 2 ] = "__.. "; //Z
    table[ 26 ][ 2 ] = "   "; //space
   
    return;
}

int main()
{
    int index = 27;
    std::string table[ index ][ 2 ];
   
    database( table );
   
    return 0;
}

Po kompilacji program po prostu się zwiesza, i wyskakuje Windowsowy raport o błędzie.
Udało mi się namierzyć Z CZYM jest nie tak: jeżeli usunę 2 ostatnie linii z każdego wymiaru tabeli (table[26][1] oraz table[26][2]) to wszystko działa. Moje pytanie brzmi więc nie CO? tylko DLACZEGO?
P-87072
pekfos
» 2013-07-05 20:27:15
Tablice indeksuje się od zera.
P-87078
V0ldek
Temat założony przez niniejszego użytkownika
» 2013-07-05 20:32:12
Nie ma to jak spędzić pół dnia nad kawałkiem kodu i nie zauważyć podstawowego błędu początkującego programisty ;D

Ale jeżeli mógłbyś mi wytłumaczyć, to dlaczego do table[25] wszystko działa, a DOPIERO POTEM się sypie?
P-87080
akwes
» 2013-07-05 20:33:26
Widocznie dopiero tamtymi elementami nadpisujesz jakąś szalenie ważną cześć pamięci. Nie każde niepoprawne nadpisanie pamięci musi być zauważalne (co jest jeszcze gorsze!).
P-87081
V0ldek
Temat założony przez niniejszego użytkownika
» 2013-07-05 20:35:43
To dużo wyjaśnia. W takim razie dzięki za pomoc. Jestem załamany swoją spostrzegawczością.
Zamykam.
P-87082
« 1 »
  Strona 1 z 1