Chyby v programe // C++

Programovacie jazyky, rady, poradňa...
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Chyby v programe // C++

Príspevok od používateľa Fata! ChaoS »

Robím na jednom programe a je trošku dlhší ako som zvikával robiť a je v tom veľa chýb a mám na Vás pár otázok

1.Mám nasledovný kód

Kód: Vybrať všetko

Datum1[0]=retDatum1.substr(1,2);
Datum1[1]=retDatum1.substr(4,2);
Datum1[2]=retDatum1.substr(7,4);
Datum1[3]=retDatum1.substr(12,2);
Datum1[4]=retDatum1.substr(15,2);
Datum1[5]=retDatum1.substr(18,2);
A píše mi tam chybu
cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `int' in assignment
Prečo? poprosím o nejaké riešenie.


2. Dávno som nerobil v C++ a teraz si nepamätám presnp formu if else, čo sa týka zátvoriek a všade na nete je to inak.
Viem, že to rozličné keď je len jeden príkaz, ale keď sú viac, tak je to nejak takto?

Kód: Vybrať všetko

if (podmienka)
{
prikaz1;
prikaz2;
}
else{
prikaz3;
prikaz4;
}
Alebo tie {} nemajú byť všade, ale kde majú byť a kde nie? Keď ide else, tak by som nemal uzavrieť if je tak? Pls napíšte mi správny tvar.


3. Neviem som zvyknutý na pascal, takže neviem, či mám správne switch, ale píše mi tam chyby ako
expected `;' before ':' token
expected `:' before ',' token
expected primary-expression before ',' token
kód je nasledovný

Kód: Vybrať všetko

switch (Datum1[1])
            {
             case 1,3,5,7,8,10,12: kos+=31*24;
                                   break;
             case 4,6,9,11: kos+=30*24;
                              break;
             case 2: kos+=28*24;
                     break;
             default: break;
            }

Kód: Vybrať všetko


Prosím pomôžte, čo najskôr. Vopred ďakujem.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

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

1) ako máš deklarované pole Datum1? Podla tej chyby cheš vopchať string to intovej premennej

2) máš to dobre

3) neviem ako sa zapisuje viac možností (s c a c++ robím len keď radím :D ), ale takto by to malo ísť:

Kód: Vybrať všetko

switch (Datum1[1])
            {
              case 1:
              case 3:
              case 5:
              case 7: 
              case 8:
              case 10:
              case 12: {
                  kos+=31*24;
                  break;
                  }
             case 4:
             case 6:
             case 9:
             case 11: {
                  kos+=30*24;
                  break;
                  }
             case 2: {
                  kos+=28*24;
                  break;
                  }
             default: break;
            }
A tiež si ujasni čo je v poli Datum1. Tu používaš čísla, predtým si sa tam snažil načítať reťazce (pri reťazcoch by to bolo v apostrofoch case '1': ... )
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

Viem viem, díky, len som zabudol atoi(), čo som tu preberal predtým. No tak spravím to a pravdepodobne sa ešte ozvem ak nastanú nejaké ďalšie nejasnosti.

//autoeditácia príspevku ( 11 Oct 2008, 14:51 )
Dal som to takto

Kód: Vybrať všetko

Datum1[0]=atoi(retDatum1.substr(1,2));
   Datum1[1]=atoi(retDatum1.substr(4,2));
   Datum1[2]=atoi(retDatum1.substr(7,4));
   Datum1[3]=atoi(retDatum1.substr(12,2));
   Datum1[4]=atoi(retDatum1.substr(15,2));
   Datum1[5]=atoi(retDatum1.substr(18,2));
Ale stále to nefunguje, robí to kôli substr?
Ináč Datum1 je typu integer a retDatum1 je zas string, a chcel by som s toho retazca vytiahnúť číselné hodnoty. Ako to mám spraviť aby to fungovalo?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

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

Funkcia atoi očakáva ako vstup pole znakov (a nie C++ reťazec). Nechce sa mi hľadať, či má trieda string aj nejakú funkciu na prevod reťazca na číslo, takže môžeš zmeniť ten reťazec na pole znakov:

Kód: Vybrať všetko

Datum1[5]=atoi(retDatum1.substr(18,2).c_str());
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

Ďakujem, ešte mám jeden problém.

Chcem do string premennej načítať hodnotu v takomto tvara:
dd.mm.rr hod:min:sek
ale po zadaní sa zrútí program, asi to bude tým, že je tam biely znak, čiže medzera, robím to pomocou
cin >>

Cez čo to mám načítať?
Skúšal som cin.getline, ale to je asi na niečo iné ako string.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

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

Pochybujem, že by tomu vadila medzera. Pravdepodobne ten reťazec zapisuješ do nesprávnej premennej (buď je príliš malá, alebo je nenainicializovaná, alebo niečo úplne iné). :)
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

Ale predsa je to tá medzera, mám to pekne inicializované

Kód: Vybrať všetko

string retDatum1;
 string retDatum2; 
a potom zas pomocou cin načíta hodnoty z klávesnice

Kód: Vybrať všetko

 cin >> retDatum1 >> retDatum2;
Keď dám hocijaký dlhý retazec bez medzery v pohode, keď dám aj krátky s medzerou program vypne.
Na krúžku sme aj brali, že.
Pre cin končí reťazec \0(bielim) znako;medzera, tabulátor,nový riadok a \0 t.j. cin načíta len jedno slobo aby sme sa takýmto problémom vyhli využívame riadkovo orientovaný vstup
cin.getline(meno,20);
Len6e to cin.getline je asi na nejaké pole, keďže sa tam udáva veľkosť t.j. 20 a ja to mám typu string, tak by to trebalo premeniť na char[], ale zas tak musim pozmenit cely program, preto by trebalo daké riešenie.

//autoeditácia príspevku ( 12 Oct 2008, 14:30 )
Dobre už som to vyriešil nasledovane

getline(cin,retDatum1);
Rixsus
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 288
Registrovaný: 18 nov 2005, 19:40
Kontaktovať používateľa:

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

tak predso nepouzijes radsej sscanf ;) funkcia pre formatovany vstup este z ciast Ccka ;)
ak chces v tvare treabars hh.mm:ss nacitas to do 3 premien jedinym prikazom z pola charu :)

takto :
sscanf(test,"%i.%i:%i",&hh,&mm,&ss);

a mas v premenach celych cisel nacitane 3 hodnoty .,,
Napísať odpoveď