Dobry den snazil som sa vytvorit program ktory po nesplneni podmienky zopakuje funkciu main ale namiesto toho mi dookola vypisuje main ale tak ze nemozem nic napisat nieco na sposob while. Neviete i niekto poradit co s tym moze byt ? pri skompilovani vo windowse to robi takuto chybu ale ked to spustim v Linuxxe cez wine tak to ide normalne a ked to znovu skompilujem v Linuxe aj tak to spravi tu istu chybu. Este par malych problemov ved v kode su popisane.
Tak v prvom rade by si mal kód odsadzovať, nech sa v tom vyzná aj niekto iný, ako ty (To je veľmi dôležité, keď s tým ideš na fórum po pomoc)
A za druhé: Áno dá. Ale narozdiel od "ktorejkoľvek inej funkcie", toto volanie nespravuješ ty, ale systém (príp. ovplyvňuješ argumentami programu, ale to nerieš...) A pri jej rekurzívnom volaní to vie urobiť poriadnu galibu...
Takže v prvom rade sa zbav toho volania mainu - a to tak, že tam pekne použiješ cykly a procedúry (tak ako to aj robíš, len ich sprav možno viac. A môžeš používať aj odkazy, alebo ukazatele)
Cykly poznáme tri, jeden si už vyber. Tiež poznáme magické slovká continue a break. Tie ti určite budú nápomocné.
Na prvý pohľad mi príde, že aj prúdy sú tam dosť chaoticky použité. Skús napísať o čo presne sa pokúšaš, alebo to viac okomentovať (nech to nemusím lúštiť z kódu) a nejak už to napravíme.
BX napísal:Tak v prvom rade by si mal kód odsadzovať, nech sa v tom vyzná aj niekto iný, ako ty (To je veľmi dôležité, keď s tým ideš na fórum po pomoc)
A za druhé: Áno dá. Ale narozdiel od "ktorejkoľvek inej funkcie", toto volanie nespravuješ ty, ale systém (príp. ovplyvňuješ argumentami programu, ale to nerieš...) A pri jej rekurzívnom volaní to vie urobiť poriadnu galibu...
Takže v prvom rade sa zbav toho volania mainu - a to tak, že tam pekne použiješ cykly a procedúry (tak ako to aj robíš, len ich sprav možno viac. A môžeš používať aj odkazy, alebo ukazatele)
Cykly poznáme tri, jeden si už vyber. Tiež poznáme magické slovká continue a break. Tie ti určite budú nápomocné.
Na prvý pohľad mi príde, že aj prúdy sú tam dosť chaoticky použité. Skús napísať o čo presne sa pokúšaš, alebo to viac okomentovať (nech to nemusím lúštiť z kódu) a nejak už to napravíme.
Vies si predstavit ako do toho mam narvat do while pritom pouzit switch ako to je povodne na zaciatku ?
int main()
{
int odpoved;
while(true) // nekonecny cyklus
{
cout << "\nProgram ma 3 krat zapipat.Pre vstup do programu zadajte heslo (1) alebo pockajte 10 sekund(2):";
cout << "\nHeslo je: Astorko";
cout << "\nvyberte moznost:";
cin >> odpoved;
switch (odpoved)
{
case 0: continue; // choď v cykle odznovu
case 1: heslo();
break;
case 2: sleepp();
break;
default : continue; // choď v cykle odznovu
}
char prikaz[7];
cout << "\n Ak chcete program zopakovat napiste repete \nak chcete program ukoncit napiste exit\nodpoved:";
cin.getline (prikaz,7);
if ( strcmp (prikaz, "exit") == 0 ) break; // skonci cyklus
// Tu je zbytocne testovat aj repete. Ak sa nesplni ani jedna podmienka, cyklus sa aj tak zopakuje
}
return 0;
}
Ešte raz a poriadne si pozri môj kód a všimni si, čo som od tiaľ vyhodil.
1.) Na čo dávaš kód zbytočne do blokov? Zbytočne tým programu komplikuješ život,
2.) Na čo načítavaš "prikaz" dva krát? (Raz cez cin a potom cez getline()).
A strcmp radšej pekne porovnávaj s nulou. Takto je to zbytočne komplikované. Nehovoriac o tom, že miešaš C a C++, ale o tom asi nemá zmysel písať.
BX napísal:Ešte raz a poriadne si pozri môj kód a všimni si, čo som od tiaľ vyhodil.
1.) Na čo dávaš kód zbytočne do blokov? Zbytočne tým programu komplikuješ život,
2.) Na čo načítavaš "prikaz" dva krát? (Raz cez cin a potom cez getline()).
A strcmp radšej pekne porovnávaj s nulou. Takto je to zbytočne komplikované. Nehovoriac o tom, že miešaš C a C++, ale o tom asi nemá zmysel písať.
Spytam sa ta jedna vec preco si myslis ze miesam c a c++ to by ma zaujimalo viem ze ti to pride smiesne ale ucim sa z knihy c++ za 21 dni pre poriadok uz 3 mesiace. A druha vec ked mi program da na vyber medzi zadanim hesla a medzi 10 sekundovou pauzou (prvy vstup do programu) tak ked zadam cokolvek ine tak sa mi donekonecna opakuje cely cyklus reaguje to podobne ako pri tom rekurzivnom volani funkcie main.
1. Tie includes, spravne by si v C++ mal mat len iostream, string, ziadne stdio.h ktore patri do C.
2. Ked uz si si includol ten C++ string, tak by si ho aj mohol pouzivat. Cize namiesto char prikaz[7] zadefinuj string prikaz
3. Ked uz pouzivame stringy tak nie cin.getline ale getline(cin, prikaz)
4. strcmp patri do C, v C++ pouzi prikaz.compare() metodu
5. Nastav si TAB na 4 spaces a pozivaj ho, inak tvoj kod ani necitam, len co som ho zbezne pozrel kde miesas C, C++ a bohvie co este
2.) To, čo sa stane defaultne definuješ, celkom prekvapivo, za slovkom default v tom switchi. Teraz tam máš continue - dal som to tam, aby sa to chovalo rovnako ako tvoja divná verzia s main(). Zmeň si to tam na čokoľvek iné (napr. break, alebo return, alebo ja neviem...)
3.) Úprimne ti môžem povedať, že kniha Naučte sa C++ za 21 dní je na hovno a nikdy nikomu by som ju neodporúčal Skús sa radšej pozrieť po Mistrovství v C++. Ešte pred tým by si si mal ale prečítať knihu pána Herouta o jazyku C, pretože ti chýbajú aj najzákladnejšie základy.
2.) To, čo sa stane defaultne definuješ, celkom prekvapivo, za slovkom default v tom switchi. Teraz tam máš continue - dal som to tam, aby sa to chovalo rovnako ako tvoja divná verzia s main(). Zmeň si to tam na čokoľvek iné (napr. break, alebo return, alebo ja neviem...)
3.) Úprimne ti môžem povedať, že kniha Naučte sa C++ za 21 dní je na hovno a nikdy nikomu by som ju neodporúčal Skús sa radšej pozrieť po Mistrovství v C++. Ešte pred tým by si si mal ale prečítať knihu pána Herouta o jazyku C, pretože ti chýbajú aj najzákladnejšie základy.
Ja by som povedal Mistrovství by nemal čítať ako prvé. Lepšie je aj keď nedočíta to za 21 dní nemusel by chápat hned Mistrovství na Mistrovství by si mal mat aspon trochu základ. Ale inac so všetkým suhlasim ale ako ta tam preboha napadlo dat Main()
Ale uz aspoň chápem preco môže byt nevýhodou keď si predtým čítal C
V simol som si ako sa tu rozplivate nad rekurzivnym mainom, nehovorim ze je to zdrave v proceduralnych jazykoch, ale na druhej strane to ci to bude robit spominane blbosti zavisi od kompilatora.
Pre gcc a kompilatory od IBM je main iba obycajna funkcia a je ju z uplne cistym svedomim volat rekurzivne.
A v niektorych jazykoch je to dokonca nutnost.