Problem z char

pavon147
  • Rejestracja: dni
  • Ostatnio: dni
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!

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
const char *tablica[5] = {"[----]", "[#---]", "[##--]", "[###-]", "[####]"};
pavon147
  • Rejestracja: dni
  • Ostatnio: dni
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?

transient
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 24
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.

Kopiuj
 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:

Kopiuj
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 :)

pavon147
  • Rejestracja: dni
  • Ostatnio: dni
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.

transient
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 24
0

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

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
byku_guzio
  • Rejestracja: dni
  • Ostatnio: dni
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 ;)

pavon147
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.