Daká chyba v C++ programe

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:

Daká chyba v C++ programe

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

Kód: Vybrať všetko

cout << "Pridavaj zamestnancov:" << endl;
   int i;
   int poc=0;
   char odpoved[4]="ano";
   for (int i=0; i<x; i++){
       cin.getline(zamestnanci[i].meno,30);
       cin >> zamestnanci[i].vek;
       cin.get();
       cin.getline(zamestnanci[i].druhPrace,50);
       poc++;
       cout << "Chces pridat dalsieho zamestnanca? ano/nie ";
       cin >> odpoved;
       if (odpoved="nie") i=x;
   }
No a píše mi to na tomto riadku chybu:
Riadok:

Kód: Vybrať všetko

if (odpoved="nie") i=x;
Chyba:
ISO C++ forbids assignment of arrays
invalid use of non-lvalue array
Čo je tam zle?

P.S. premmená x je typu int.
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 »

if (odpoved=="nie") i=x;
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 »

Chybné je to odpoved="nie". Pri porovnávaní sa používa ==. Samozrejme by to nefungovalo ani keby si tam dal to ==, musíš tam použiť nejakú funkciu na porovnávanie reťazcov.

Inak namiesto tej zvláštnosti if (odpoved="nie") i=x; tam môžeš použiť break.

A ešte jedna poznámka, skúšal si namiesto ano/nie zadať dlhší reťazec?
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 »

Díky za užitočné poznámky, no ja viem, že kebyže dám dlhší reťazec tak program zlyhá, ale to ešte ošetrím. A mal by si nejaký elegatný návrh na ošetrenie, lebo kebyže to robím ja tak to by bolo dosť tak neelgatne si myslím


EDIT:
Tu mám celý program:

Kód: Vybrať všetko

#include <iostream>   
using namespace std;   

int main()
{  
   char firma[30];
   cout << "Zadaj nazov firmy: ";
   cin.getline(firma,30);
   int x;
   cout << "Zadaj pocet zamestnancov max 32000: ";
   cin >> x;
   while ((x>32000) && (x<0)) cin >> x;
   
   struct ludia
   {
          char meno[30];
          int vek;
          char druhPrace[50];
   }zamestnanci[x];  
   cin.get();
   cout << "Pridavaj zamestnancov" << endl;
   int poc=0;
   char odpoved[4]="ano";
   for (int i=0; i<x; i++){
       cout << "Zapis meno zamestnanca: ";
       cin.getline(zamestnanci[i].meno,30);
       cout << "Zapis vek zamestnanca: ";
       cin >> zamestnanci[i].vek;
       cin.get();
       cout << "Zapis pracovny odbor zamestnanca: ";
       cin.getline(zamestnanci[i].druhPrace,50);
       poc++;
       cout << "Chces pridat dalsieho zamestnanca? ano/nie ";
       cin >> odpoved;
       cin.get();
       if (strcmp(odpoved,"nie")==0) break;
   }
   system("cls");
   cout << "\t\t" << firma << endl;
   for (int i=0;i<poc;i++) cout << zamestnanci[i].meno << "\t" << zamestnanci[i].vek
                                << "\t" << zamestnanci[i].druhPrace << endl;
   system("pause"); 
   return 0;   
}   
No skúšal som, že čo sa stane keď zadám dlhší reťazec a v pohode to načíta do premennej a tak kým nezapíše, čo je potrebné, čiže nie tak to bude pokračovať, kým sa cyklus neukončí, takže to je aj tak fajne.

Len by ma zaujímalo ako by sa dalo ošetriť ten vstup premennej x, lebo vieme, že ako do int premenej zadáme väčšiu hodnotu ako je možná obsahovať tak program skončí a to nechcem, chcel by som aby keď dostane takú hodnotu nech poprosí o vstup ešte raz. Dalo by sa to spraviť?
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 »

Môžeš vyskúšať niečo ako:

Kód: Vybrať všetko

string odpoved;
cout << "Chces pridat dalsieho zamestnanca? ano/nie ";
getline(cin, odpoved);
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 »

No hej, ale ty si mi asi ešte nevidel editovaný príspevok, no hádam teraz uvidíš. No takže to funguje v pohode aj s char, lebo hádam, že ono si to spravý ďalšie prvky poľa ak zadám dlhší reťazec.

P.S. Nefunguje daká funkcia Maxlength? Hľadal som po googli, ale moc som o tom v c++ nenašiel nič, len v HTML.
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 »

Áno, odoslal som to ešte pred tou tvojou úpravou príspevku. Síce sa ti tam načíta len toľko znakov, koľko sa zmestí do poľa, ale čo sa stane, ak napíše niečo ako anonie (pripadne naopak)?

Myslíš si, že táto podmienka je správna?

Kód: Vybrať všetko

while ((x>32000) && (x<0)) cin >> x;
(x nemôže byť súčasne viac ako 32000 a menej ako 0)

Inak na načítanie čísla môžeš vyskúšať niečo takéto (prípadne si môžeš urobiť funkciu, ktorej dáš ako argumenty zobrazovaný reťazec, minimálnu a maximálnu hodnotu...):

Kód: Vybrať všetko

	do {
		cout << "Zadaj pocet zamestnancov max 32000: ";
		cin >> x;
		if (cin.fail()) {
			cin.clear();	// vymazeme chybovy stav
			cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');	// odstranime cely riadok
			continue;	// zopakujeme nacitanie cisla
		}
	} while (x < 0 || x > 32000);
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 »

Tak pomohlo by aj to kebyže zväčšíme pole znakov o jeden prvok napr.
char odpoved[5];
Tak by sme mali miesto pre 4 znaky a tak kebže používateĺ zapíše slovo "niekedy" tak by sa načítalo "niek" a nie "nie", čiže by podmienka pokračovala až kým nezadá to slobo "nie" správne.

Veľmi tomu cin.ignore nechápem skúsil som to aj s tým aj beztoho a funguje to tak i tak, takže načo je to dobré? aký riadok vymaže? veď vstupný prúd sa už vyprázdnil pomocou cin.clear(). Sorry, že sa toľko pýtám, ale keď to už raz mám predsebou nech tomu chápem poriadne.
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 cin.clear() iba vyčistí stavovú informáciu toho streamu (napr. ak nastane chyba, tak sa nastaví jeden príznak, ktorý sa dá otestovať pomocou tej funkcie cin.fail()). Je možné, že to bude fungovať aj bez toho (volanie ignore tú stavovú informáciu pravdepodobne vymaže), ale ničomu to tam neprekáža (pri ošetrovaní chyby je rozumné to tam dať, nemalo by sa potom stať, že to bude spôsobovať problémy aj tam, kde nie sú).

Keby si ten riadok so zlým číslom nevymazal, ostali by tie údaje v cin a tak by sa znovu načítali - vyhodnotili ako chybné - znovu načítali - vyhodnotili... (a teda by sa to tam neustále opakovalo).


Inak skús bez toho cin.clear() zadať napr číslo 10000000000 a zistíš, že aj to clear tam plní nejakú funkciu (prípadne namiesto čísla zadaj reťazec).
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 »

NOVÁ CHYBA

Kód: Vybrať všetko

#include <iostream>
using namespace std;

void zmenapole(double, double, int);     

int main()
{
    double pole[10];
    for (int i=0; i<10;i++) cout << pole[i]; 
    zmenapole(2.0,pole,10);
    for (int i=0; i<10;i++) cout << pole[i];   
}

void zmenapole(double r, double pole[], int n)     
{          
   for (int i = 0; i<n ; i++)              
   pole[i] *= r;             
}  
Píše chybu
cannot convert `double*' to `double' for argument `2' to `void zmenapole(double, double, int)'
Prečo nevie prekonvertovať double na double? Čo mu vadí?
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

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

este raz sa pozri na toto

Kód: Vybrať všetko

void zmenapole(double, double, int);   
a potom na toto

Kód: Vybrať všetko

    zmenapole(2.0,pole,10);
a skus hadat :wink:

rada (pozerat na vlastne nebezpecentvo)
*druhy parameter*
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 »

aha, takže chýbalo mu tam toto [] v druhom parametry ako si napísal :)
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

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

no samozrejme ... funkcia cakala ako parameter obycajny double a ty si tam pchal pole doublov ... a to je rozdiel
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 »

Prečo mi nefunguje toto?

Kód: Vybrať všetko

int sucty[R+S]={0};
píše mi nasledovnú chybu
variable-sized object `sucty' may not be initialized
Prečo mi nedovolí inicializovať prvky poľa?
Pomôžte poprípade napíšte iný spôsob vynulovania prvkov poľa(okrem cyklu), ďakujem.
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Tu nulu by si tam mal napisat R+Skrat, cize {0, 0, 0 ...}, aby si inicializoval kazdy prvok pola.
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 »

No ale to je dosť nereálné a nedynamické riešenie, ináč veď int pole[25]={0} funguje, ale keď tam dám výraz tak už nie. Čiže zatiaĺ som použil cyklus, ktorý postupne každému prvku priradí 0, ale ak sa tu nájde daké lepšie riešenie, tak pls napíšte.
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

No, tak v tom pripade bude chyba inde, R a S su premenne? Ak hej, tak je problem v tom, musia to byt konstanty, lebo pole je vytvorene staticky... alebo si chcel dynamicke?
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 »

Hej R a S sú premenné a to pole chcem mať dynamické, ale tak asi jediná možnosť je cyklus.
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Ak je dynamicke, tak ho mozes vytvorit funkciou malloc(), vynulovat uz len v cykle.
Napísať odpoveď