Problem z char

0

Witam, mam pytanie, dlaczego nie działa taki zapis?

char tablica[5] = {"[----]", "[#---]", "[##--]", "[###-]", "[####]"};

kompilator wypisuje: error: initializer-string for array of chars is too long

Próbuję także taki zapis:

char *tablica[5] = {"[----]", "[#---]", "[##--]", "[###-]", "[####]"};

ale uzyskuję: warning: deprecated conversion from string constant to ‘char*’

Korzystam z kompilatora g++, piszę w systemie Ubuntu. (W książce z której korzystam pisze, że drugi zapis jest prawidłowy).

Dzięki za odpowiedź, pozdrawiam!

0

Drugi zapis jest częściowo prawidłowy. Dokładnie powinno być:

const char *tablica[5] = {"[----]", "[#---]", "[##--]", "[###-]", "[####]"};
0

Właśnie przed chwilą znalazłem odpowiedź i już miałem usuwać temat :) Dzięki za Twoją tutaj :) Ale dlaczego nie działa pierwszy zapis?

0

Pierwszy nie działa, bo to tablica pojedyńczych obiektów typu char. Czyli do każdego jednego z tych obiektów mógłbyś wpisać tylko po jednym znaku np.

 char tabl[5] = {'a', 'b','c'};

Edit: To, co napisałem, to tzw. inicjalizacja zbiorcza. Wszystkie obiekty, które pominąłem (czyli te o indeksach [3] i [4] zostaną zainicjalizowane zerami.

A jeszcze słówko nt. dlaczego ta definicja działa:

const char *tablica[5] = {"[----]", "[#---]", "[##--]", "[###-]", "[####]"};

Tutaj dochodzi do definicji tablicy wskaźników mogących pokazywać na obiekty typu const char, do których podczas inicjalizacji są wpisywane adresy do ciągów znaków (będących stałymi dosłownymi). Czyli w tych wskaźnikach przechowywane są adresy, gdzie np. C-string [----] jest przechowywany :)

0

Ok, dzięki :)

Nie chcę zakładać już nowego tematu. Czy mógłby mi ktoś wytłumaczyć co konkretnie robi flush? Bo używam go, ale nie do końca rozumiem jak działa.

np mam:

for(int index=0;index<=5;index++)
{
cout<<1<<flush;
sleep(1);
}

Gdybym nie użył flush'a, to program nie wypisywałby jedynek po sekundzie, tylko musiałbym odczekać 5 sek i wypisałby jedynki.

0

Flush, podobnie jak endl, to manipulator, który inicjalizuje wypis na ekran, ale w przeciwieństwie do endl nie dodaje znaku nowej linii :)

0

Od takich pytań jest dokumentacja ;) flush jest manipulatorem, który wypycha wszystko z bufora. cout jest strumieniem buforowanym, tzn. że nie wszystko od razu po wywołaniu jest wypisywane na ekranie, do urządzenia jest wysyłane w momencie jak uzbiera się jakaś tam ilość danych.

//zostałem wyprzedzony ;)

0

Ok, dzięki wszystkim za odpowiedzi, już wszystko jest jasne :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1