Problem z char

Odpowiedz Nowy wątek
2011-08-31 21:45
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!

edytowany 1x, ostatnio: madmike, 2011-09-04 12:46

Pozostało 580 znaków

2011-08-31 21:48
0

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

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

Pozostało 580 znaków

2011-08-31 21:50
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?

Pozostało 580 znaków

2011-08-31 21:54
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 :)

edytowany 2x, ostatnio: transient, 2011-08-31 22:06

Pozostało 580 znaków

2011-08-31 22:05
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.

edytowany 1x, ostatnio: pavon147, 2011-08-31 22:06

Pozostało 580 znaków

2011-08-31 22:08
0

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

Pozostało 580 znaków

2011-08-31 22:09
0

Flush opróżnia bufor strumienia.

http://www.cplusplus.com/reference/iostream/manipulators/flush/


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-08-31 22:12
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 ;)


edytowany 1x, ostatnio: byku_guzio, 2011-08-31 22:12

Pozostało 580 znaków

2011-08-31 22:58
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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