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

Tablice wielowymiarowe przechowujące znaki

Ostatnio zmodyfikowano 2012-01-28 17:35
Autor Wiadomość
Karol_14
Temat założony przez niniejszego użytkownika
Tablice wielowymiarowe przechowujące znaki
» 2012-01-28 16:40:32
Mam problem z tablicami. A konkretnie z jednym rzeczą. Moze wyjasnie na przykladzie:
C/C++
#include<iostream>
using namespace std;
int main()
{
    char tab[ 4 ][ 3 ] = {
        { 'A', 'B' },
        { 'C', 'D', 'E' },
        { 'F' }
    };
    cout << tab[ 1 ];
}

Powinno wypisać tekst "CDE". Jednak wyświetla "CDEF". Jeżeli zamiast tab[1] wpisze tab[0] to poprawni wyświetli "AB". Żeby poprawnie mi wyświetlało cały indeks 1 bez indeksu 2 musiał bym zwiększyć drugi wymiar do 4:

C/C++
#include<iostream>
using namespace std;
int main()
{
    char tab[ 4 ][ 4 ] = {
        { 'A', 'B' },
        { 'C', 'D', 'E' },
        { 'F' }
    };
    cout << tab[ 1 ]; //wyswietla poprawnie "CDE"
}
Dlaczego tak jest? To wina kompilatora czy po prostu tak jest w C++ ze trzeba zwiekszyc wymiar o 1?
P-49680
Ganox
» 2012-01-28 16:50:59
Ponieważ pierwsza wartość jest odpowiedzialna za ilość wierszy a druga za ilość kolumn, czyli powinno być na odwrót

zamiast
C/C++
char tab[ 4 ][ 3 ]

to
C/C++
char tab[ 3 ][ 4 ]


EDIT: choć może mi się wydawać, że natrafiając na wartość równą "null" przestaje wyświetlać kolejne znaki.
P-49681
Karol_14
Temat założony przez niniejszego użytkownika
» 2012-01-28 17:00:00
Wiem że pierwsze to wiersze a drugie to kolumny. Przez przypadek wpisałem w pierwszy wymiar 4. Tablica którą tworze ma wymiary 3x3. więc nie wiem czemu mówisz żeby zmienic liczbe kolumn na 4 skoro maksymalnie sa 3 wartosci...

EDIT. z wartością NULL miało by to sens, ale nie wyczytalem tego z kursu o tablicach
P-49683
DejaVu
» 2012-01-28 17:25:15
C/C++
char tab[ 4 ] = { 1 };
To wynika ze standardu. Standard mówi, że tablica ma zostać wypełniona podanymi wartościami, a elementy dla których wartość nie została określona mają zostać wypełnione wartością 0.
P-49685
npHard
» 2012-01-28 17:27:27
z wartością NULL miało by to sens, ale nie wyczytalem tego z kursu o tablicach

Bo to nie ma nic wspólnego z tablicami a z ciągami znaków w C. Funkcje z rodziny printf oraz ceplusplusowe strumienie przyjmując wartość typu char* spodziewają się tak zwanego "NULL-terminated string", czyli wyświetlają kolejne znaki tak długo aż natrafią na znak o wartości 0(nie '0'). Przykład:
C/C++
char tekst[] = "długi_tekst" //tekst zawiera 11 znaków

printf( "%d\n", sizeof( tekst ) ); //wynik to 12 bo tablica zawiera 11 znaków + kończący je NULL

printf( "%s\n", tekst ); //wyświetla "długi_tekst"

tekst[ 5 ] = 0;

printf( "%s\n", tekst ); //wyświetla "długi"

printf( "%s\n", tekst + 6 ); //wyświetla "tekst"

Gdybyś nie daj Boże przekazał ciąg znaków, który nie kończy się NULL'em funkcja printf(albo cout) wypisywałaby kolejne bajty tak długo aż natrafiłaby na NULL'a. Spora szansa, że nie natrafiłaby na niego i doszłaby do obszaru pamięci, którego nie wolno Ci dotykać i... Segmentation fault...
P-49687
DejaVu
» 2012-01-28 17:28:26
@up: O fajnie, że uzupełniłeś moją wypowiedź bo nie chciało mi się już o tym pisać ;p
P-49688
Karol_14
Temat założony przez niniejszego użytkownika
» 2012-01-28 17:35:18
Wielkie dzieki. Można zamknąć
P-49692
« 1 »
  Strona 1 z 1