Poslao: 26 Jan 2015 20:59
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Napisano: 26 Jan 2015 19:04
Vidim, fali mi zagrada. I u funkciji strlen sam ppgresio takodje.
Dopuna: 26 Jan 2015 19:16
Rekao si mi da ta funkcija at treba da ima 2 parametara. Jedan da bude indeks a drugi sam karakter. Ne razumem sta treba da radim sa tim indeksom? Sta bi ta funckija trebala da vraca kao rezultat? Ja sam stavio da vraca char* ali sta.
Dopuna: 26 Jan 2015 20:59
Mozes li mi pomoci?
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 26 Jan 2015 21:20
|
online
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Napisano: 26 Jan 2015 21:09
crusher ::Ne razumem sta treba da radim sa tim indeksom? Sta bi ta funckija trebala da vraca kao rezultat? Ja sam stavio da vraca char* ali sta.Indeks (prvi argument) je pozicija karaktera koji menjaš, a sam karakter (drugi argument) je onaj kojim menjaš karakter na zadatoj poziciji. Funkcija može da bude i bez povratne vrednosti, tj. void, jer sve obavljaš unutar same funkcije. Ako pak želiš da odradiš dodelu koristeći operator =, moralo bi da se malo promisli. U jeziku C++ možeš da predefinišeš operator dodele za određenu klasu, ali bi tako nešto u ovom slučaju zahtevalo da wrap-uješ char u neki klasni tip, pa da njega koristiš. Svakako, to je dodatno i nepotrebno komplikovanje, dovoljno je da odradiš ovu funkciju sa dva parametra i to je to.
Dopuna: 26 Jan 2015 21:20
Ustvari, moglo bi i ovako:
char* at(int a)
{
return name + a;
}
//...
//Upotreba bi bila ovakva
*(rec.at(0)) = 'F';
|
|
|
|
Poslao: 26 Jan 2015 22:24
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Napravio sam ove ali ne daje prave rezultate. Ja stavim X a funkcija ga pretvori u R kada pokrenem program. Evo pogledaj kod:
#include <iostream>
class Test{
char* niz;
public:
Test(){ niz = 0; }
Test(char* a){ niz = new char [strlen(a) + 1]; strcpy(niz, a); }
~Test(){ delete [] niz; }
int length();
char at(int a);
void at1(int a, char x);
char* at2(int a);
};
int Test::length(){
int a, b;
for(a = 0; *niz != '\0'; *niz++, a++)
;
for(b = a; b > 0; b--)
*niz--;
return a;
}
char Test::at(int a){
return *niz + a;
}
void Test::at1(int a, char x){
*(niz + a) = x;
}
char* Test::at2(int a){
return niz + a;
}
int main()
{
Test rec("Programiranje");
std::cout << "Rec sadrzi " << rec.length() << " znakova." << std::endl;
std::cout << "Znak: " << rec.at(0) << std::endl;
rec.at1(2, 'X');
std::cout << "Novo slovo: " << rec.at(2) << std::endl;
*(rec.at2(2)) = 'X';
std::cout << "Novo slovo: " << rec.at(2) << std::endl;
system("PAUSE");
return 0;
}
|
|
|
|
Poslao: 26 Jan 2015 22:29
|
online
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Funkcija at(int) ti ne valja uopšte, zato i "pretvara" tako kako kažeš...
|
|
|
|
Poslao: 26 Jan 2015 22:32
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Jeste, u pravu si. Zaboravio sam zagrade. Evo sada radi kako treba.
Hteo sam jos nesto da te pitam. Kada bih hteo da uradim ovo isto sa operatorom = kako sam rekao u prvom postu, da li bih morao da koristim preopterecenje operatora?
Inace, hvala ti na tvojoj pomoci i ulozenom vremenu.
|
|
|
|
Poslao: 27 Jan 2015 00:21
|
online
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14824
- Gde živiš: Niš
|
Preopterećenje? Lele, nemoj da prevodiš overloading tako, mnogo nakaradno zvuči. Dovoljno je da kažeš predefinisanje. Da, moralo bi tako ako ti se ne sviđa ovako sa referenciranjem/dereferenciranjem. Operator dodele možeš da predefinišeš samo za klasne tipove, pa bi zato morao da napraviš tzv. wraper klasu za koju bi predefinisao operator dodele.
|
|
|
|
Poslao: 27 Jan 2015 14:14
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Napisano: 27 Jan 2015 8:58
Meni tako pise u knjizi kao 4. poglavlje, pa zato i ja koristim taj izraz.
Inace, hvala ti na svemu
Dopuna: 27 Jan 2015 14:14
Ajde da ne otvaram temu nego ovde da vidis moj novi problem. Napravio sam program koji vrsi nekoliko funkcija nad stringovima, ali imam jedan problem. Kada god pokrenem program, izadje mi neki error. Ali nije error kao greska u sintaksi nego kada ukucam ime posle pokretanja programa i pretisnem Enter izadje greska.
Mislim da je ili problem u metodi empty() ili u funkciji Unesi_Ime. Gde gresim?
#include <iostream>
#include <string>
class Test{
char* name;
public:
Test() { name = 0; }
Test(char* a) { name = new char [strlen(a) + 1]; strcpy(name, a); }
~Test() { delete [] name; }
int length();
char at(int a);
char* at1(int a);
int empty();
};
int Test::length(){
int a, b;
for(a = 0; *name != '\0'; *name++, a++)
;
for(b = a; b > 0; *name--, b--)
;
return a;
}
char Test::at(int a){
return *(name + a);
}
char* Test::at1(int a){
return name + a;
}
int Test::empty(){
if(*(name + 0) == '\0')
return 1;
return 0;
}
Test Unesi_Ime(std::string);
int main()
{
Test ime, prezime;
std::string psi, psp;
ime = Unesi_Ime("Unesite Vase ime: ");
prezime = Unesi_Ime("Unesite Vase prezime: ");
psi = ime.at(0);
psp = ime.at(0);
std::cout << "Dobrodosli " << ime.at1(0) << " " << prezime.at1(0) << " u program." << std::endl;
std::cout << "Vase ime ima " << ime.length() << " znakova." << std::endl;
std::cout << "Vase prezime ima " << prezime.length() << " znakova." << std::endl;
std::cout << "Vasi inicijali su: " << psi << "." << psp << "." << std::endl;
system("PAUSE");
return 0;
}
Test Unesi_Ime(std::string Pniz)
{
Test unos;
char ime[20];
char* p;
bool neispravan_unos;
do{
std::cout << std::endl << Pniz << std::endl;
gets(ime);
p = ime;
unos = p;
if(unos.empty()){
std::cerr << "Niste uneli ime - pokusajte ponovo!" << std::endl;
neispravan_unos = true;
}
else
neispravan_unos = false;
} while(neispravan_unos);
return unos;
}
|
|
|
|
|
Poslao: 27 Jan 2015 14:47
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Pokusao sam, ali kad dodje do koda std::string psi, psp ulazi u neke fajlova vazdan i nikako da se vrati nazad. Zato sam i postavio ovde jer nisam mogao da se snadjem sa dibagerom. Je l' moze da se nekako taj deo koda preskoci ili treba nesto drugo?
|
|
|
|
Poslao: 27 Jan 2015 14:47
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Samo sam bacio pogled i koliko vidim, promenljivoj tipa Test dodeljuješ vrednost tipa char* u 67. liniji. Ako bih bio na tvom mestu, tu bih počeo da tražim grešku.
|
|
|
|