c++ problem s cyklom (char < 128) [problem vyrieseny]

Programovacie jazyky, rady, poradňa...
Oblak
Light Expert
Light Expert
Príspevky: 60
Registrovaný: 27 máj 2015, 15:40

c++ problem s cyklom (char < 128) [problem vyrieseny]

Príspevok od používateľa Oblak »

Ucim sa ako samouk c++ a prvy krat som narazil na problem ktory sam neviem vyriesit.

Napisal som si kod, ktory mi vypise vsetky znaky ktore char umoznuje. Je to dokopy 256 znakov. Pri pisani kodu som narazil na jednu vec, na ktoru neviem prijst.

moj povodny kod vyzeral takto:

Kód: Vybrať všetko

#include <iostream>
using namespace std;

int main()
{
	char p = 0;

	for (int i = 0; p < 256; p++)
	{
		cout << "Char: " << p << " cislo: " << i << "|";
		if ((i>1) && (i % 4 == 0))
			cout << "\n";
		else
			cout << " ";
		i++;
	}
	cout << "\nKoniec programu. \n";
	return 0;
}
Kompilator (VS 2013 Community Edition) mi ho skompiloval bez problemov, no po spusteni mi bezal pokial som ho nezrusil (furt vypisoval znaky, bez zastavenia) a kedze ku kazdemu znaku som si nechal zobrazit aj cislo, tak cisla tam boli velmi velke. Zaujimave bolo, ze pokial som namiesto hodnoty 256 dal hodnotu mensiu ako 127, tak program bezal bez problemov. Nakoniec som to vyriesil tak, ze namiesto p som tam dal i a bezalo vsetko ako malo. No a otazka je, preco ak som mal p < 127 az 256, preco mi bezal program bez zastavenia?
aacid
Hardcore addict
Hardcore addict
Príspevky: 8135
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: c++ problem s cyklom (char < 128)

Príspevok od používateľa aacid »

ak sa nemylim, tak char ma maximalnu velkost prave tych 256 (8bitov) a v C-cku to funguje tak ze ked inkrementujes a dostanes na po najvacsie cislo, tak dalsi inkrement to vrati na najnizsie cislo. teda v tom loope p nebolo nikdy > 256, pretoze po 255 skocilo zase na 0.

lepsie by si to videl keby si mal iba jednu premennu, napriklad i a pri vypisovani by si ju pretypoval na char teda cout << (char)i.
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: c++ problem s cyklom (char < 128)

Príspevok od používateľa Fabo »

A naco tam inkrementujes i v cykle, v for() zase miesas i s p...
Oblak
Light Expert
Light Expert
Príspevky: 60
Registrovaný: 27 máj 2015, 15:40

Re: c++ problem s cyklom (char < 128)

Príspevok od používateľa Oblak »

aacid:
Na to som rozmyslal aj ja, ale problem je v tom, ze program mi ide do nekonecna od akejkolvek hodnoty z 127 a vyssie. Cize ak dam p < 200 alebo p < 128 tak program bude bezat do nekonecna.

Fabo:
i mam pre zobrazenie cisla, vo vysledku budem mat zobrazeny znak a vedla neho cislo.

//autoeditácia príspevku (27 Máj 2015, 17:04)
aacid:
Kedze pretypovanie este neovladam, tak som o takom niecom nevedel. No teraz s tymto poznatkom som si naprogramoval to, ze mi char vypisal ciselnu hodnotu a zistil som, ze po cisle 127 skoci hodnota char na cislo -128, preto p < 127 je nekonecny cyklus.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: c++ problem s cyklom (char < 128)

Príspevok od používateľa BX »

Oblak, problém je v znamienku. Char je číselný typ a v závislosti od použitého kompilátora môže byť znamienkový (čiže niečo ako signed int), alebo neznamienkový (niečo ako unsigned int) v rozsahu 8 bitov.

Takže ak si kompiler zmyslí, že default je signed, tak má char rozsah -128 až 127. Ak si zmyslí, že je unsigned, tak má rozsah 0 až 255.

Riešenie - explicitne uveď, že ide o unsigned char
aacid
Hardcore addict
Hardcore addict
Príspevky: 8135
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: c++ problem s cyklom (char < 128)

Príspevok od používateľa aacid »

ale aj keby z toho spravil unsigned, tak to pojde stale donekonecna, pretoze p nebude nikdy >255.

teda som mal vpodstate pravdu, zalezi vsak od implementacie ci je defaultne signed alebo unsigned.
Oblak
Light Expert
Light Expert
Príspevky: 60
Registrovaný: 27 máj 2015, 15:40

Re: c++ problem s cyklom (char < 128)

Príspevok od používateľa Oblak »

BX, vdaka, toto som nevedel ze char moze byt signed alebo unsigned.
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: c++ problem s cyklom (char < 128)

Príspevok od používateľa Fabo »

Oblak napísal:Fabo:
i mam pre zobrazenie cisla, vo vysledku budem mat zobrazeny znak a vedla neho cislo.
ako ja to chapem, len to mas pomiesane krizom krazom, a to je zle.
Oblak
Light Expert
Light Expert
Príspevky: 60
Registrovaný: 27 máj 2015, 15:40

Re: c++ problem s cyklom (char < 128) [problem vyrieseny]

Príspevok od používateľa Oblak »

A co je na tom zle? Mne to az tak krizom krazom nepride. Ako by si to riesil ty? (ak by tam muselo byt aj "p" aj "i")
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: c++ problem s cyklom (char < 128) [problem vyrieseny]

Príspevok od používateľa javatar »

takto - upravujem tvoj povodny kod:

Kód: Vybrať všetko

#include <iostream>
using namespace std;

int main()
{
	char p = 0;

	for (int i = 0; i < 256; i++)
	{
		cout << "Char: " << p << " cislo: " << i << "|";
		if ((i>1) && (i % 4 == 0))
			cout << "\n";
		else
			cout << " ";
		p++;
	}
	cout << "\nKoniec programu. \n";
	return 0;
}
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: c++ problem s cyklom (char < 128) [problem vyrieseny]

Príspevok od používateľa Fabo »

napriklad. Alebo cele p vyhodit a riesit len i castovane do charu.
Napísať odpoveď