Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pocetnicko pitanje

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pocetnicko pitanje

[ Pregleda: 5107 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Black
Belgrade

Član broj: 4199
Poruke: 71
*.verat.net



Profil

icon Pocetnicko pitanje15.08.2002. u 02:33 - pre 263 meseci
Zanima me kako da deklarisem funkciju koja vraca string, odnosno niz karaktera...
Pokusao sam nesto kao:

char [20] DajIme () {return Ime;}

ali ne funkcionise...
 
Odgovor na temu

anon676

Član broj: 676
Poruke: 759
*.verat.net



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 03:47 - pre 263 meseci
Code:

/* prvo da je definiramo ;-) */
char *funkcija ();

char *
funkcija (char *nekistring)
{
   return nekistring;
}
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.drenik.net



+27 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 09:58 - pre 263 meseci
Citat:

Black:

char [20] DajIme () {return Ime;}


Na osnovu ovog, rekao bih da si hteo da funkciju pozoveš na sledeći način:

Code:

int main()
{
char [20] Ime;
...
Ime=DajIme();
...
}


Ako sam u pravu, onda to moraš da uradiš ovako:

Code:

void DajIme (char** Ime);
/* Deklaracija, funkciji saljes [i]pokazivac[/i] na string */

int main()
{
char [20] Ime;
...
DajIme(&Ime);
...
}

void DajIme (char** Ime)
{
char [20] NovoIme;
...
/* Ovde nesto radis sa NovoIme */
...
*Ime = NovoIme;
}
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.telemaxx.net



+7169 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 10:11 - pre 263 meseci
Samo promeni ** u * u Caslavovom odgovoru u deklaraciji funkcije DajIme...

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.beg.sezampro.yu



+27 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 11:57 - pre 263 meseci
Citat:

Ivan Dimkovic:
Samo promeni ** u * u Caslavovom odgovoru u deklaraciji funkcije DajIme...


Uh, još je gore, ne znam o čemu sam mislio. U svakom slučaju, ispravna verzija je:

Code:

void DajIme (char* Ime);

int main()
{
char [20] Ime;
...
DajIme(Ime);
...
}

void DajIme (char* Ime)
{
...
/* Ovde radis sta god hoces sa Ime, sve promene ce ostati posle povratka u main() */
...
}

 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 13:58 - pre 263 meseci
Pocetnice, u C/C++-u razline izmedju pokazivaca i nizova NEMA.
recimo da imas
char* sIvan;
i
char aDragiTata[16];

Sa ova dva mozes da radis ovako nesto:
sIvan[1] = 'I';
sIvan[0] = aDragiTata+2;

Za dARKmIND-a: neki su me ucili da se kaze "definisemo", a ne "definiramo"... "Definiramo" je na hrvatskom, "definisemo" je na srpskom. A obe reci su pravilne u (virtuelnom) srpskohrvatskom, odnosno (virtuelnom) hrvatskosrpskom.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.telemaxx.net



+7169 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 14:06 - pre 263 meseci
Da, samo kod pokazivaca moras biti siguran da je memorija na koju pokazivac pokazuje alocirana i dovoljno velika da izdrzi tvoje akrobacije :)

dakle, u Lekinom primeru bi dobio segfault ako sIvan nije alocirano :)

Sto se Srpskog/Hrvatskog/Bosnjackog/Crnskog i Gorskog jezika tice - u modi je BHS, koji se koristi u Haagu i koji je varijanta starog dobrog srpskohrvatskog :))

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Black
Belgrade

Član broj: 4199
Poruke: 71
*.verat.net



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 16:40 - pre 263 meseci
Kao prvo zelim da se zahvalim svima na odgovorima :)
Neke stvari su mi sada mnogo jasnije, pre svega ta povezanost nizova, stringova i pokazivaca. Do sada sam radio u Paskalu a tamo su stvari ipak najvecim delom "skrivene" od programera tako da nisam razmisljao o tim stvarima, sav posao je radio kompajler...

Neke stvari su mi i dalje neobicne, na primer:

char Ime [20]="Milorad";
char *pIme;
pIme=Ime;

cout << pIme << "\n"; // na ekranu ce se ispisati 'Milorad'
cout << *pIme <<"\n"; // na ekranu ce se ispisati 'M'

Shvatio sam kako ovo mogu da upotrebim ali i dalje mi je malo neobicno da u prvom slucaju ispisuje ceo niz karaktera a ne samo adresu na koju pokazivac upucuje kao sto bi ispisao da je to na primer pokazivac na neki int.

Takodje primetio sam da ne mogu (u istom ovom primeru) da uradim
pIme=Ime[5];
kompajler mi prijavljuje gresku.
 
Odgovor na temu

Black
Belgrade

Član broj: 4199
Poruke: 71
*.verat.net



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 17:40 - pre 263 meseci
Uh izgleda da mi ipak mnogo toga nije jasno...
Evo saljem ceo primer pa ako neko moze da mi napise ispravnu metodu kojom bih pristupio private atributu... inace u ovom programu mi kompajler ne prijavljuje gresku ali zato dobijem poruku illegal operation kada pokrenem program...

class Automobil
{
public:
Automobil () {}
~Automobil () {}
void IspisiPodatke ();
void UpisiPodatke ();
void DajBoju (char *ulaz) {ulaz=Boja;}

private:
char Boja [20];
int MaxBrzina;
};

void Automobil::UpisiPodatke ()
{
cout << "Unesi boju automobila:";
cin.get (Boja, 19);
cout << "Unesi maksimalnu brzinu automobila:";
cin >> MaxBrzina;
}

void Automobil::IspisiPodatke ()
{
cout << "Boja:" << Boja << "\n";
cout << "Maksimalna brzina:" << MaxBrzina << "\n";
}

int main()
{
char *B;
Automobil Yugo;
Yugo.UpisiPodatke();
Yugo.IspisiPodatke ();
Yugo.DajBoju(B);
cout << B;


system("PAUSE");
return 0;
}
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 17:55 - pre 263 meseci
Problem sa *poknachar je sto pristupas 1. znaku u nizu kao sa nizchar[0]. Pokreni ovaj primer pa ce ti sve biti jasnije.

#include <iostream.h>
#include <string.h>

void main(){
int i = 0;
char c[20] = "Black is back";
char *cp = c;
cout<< "c: " << c <<"\n";
cout<< "cp: " << cp <<"\n";
while( i < strlen(cp) ){
/* isto sto i c */
cout<< i << ":\t " << *(cp +i) << "\n";
i++;
}
}

Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 18:02 - pre 263 meseci
Greška je u funkciji DajBoju. Ne možeš da kopiraš nizove operatorom =, a i treba da se ulaz iskopira u Boja, a ne obrnuto.

Uopšte, meni se čini da si izabrao malo pogrešan put da učiš C++. Ostavi za sad char* na miru i koristi std::string (deklarisan u header-u <string>). Yako bi umesto dela

Code:

void DajBoju (char *ulaz) {ulaz=Boja;}

private:
char Boja [20];


imao

Code:

void DajBoju (const std::string& ulaz) {Boja = ulaz;}

private:
std::string Boja;


I ne zaboravi na početku fajla

#include <string>

Pointeri su moćna stvar, ali mogu totalno da slude početnika, a čak i iskusni programeri umeju da naprave bagove koje je teško otkriti kada koriste char* i slične stvari.

Da napomenem da čuveni virus Nimda nikad ne bi nastao da su Microsoft-ovi programeri koristili std::string umesto char*.

 
Odgovor na temu

Black
Belgrade

Član broj: 4199
Poruke: 71
*.verat.net



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 19:55 - pre 263 meseci
Huh cini mi se da sam ipak uspeo da uradim to sta sam zeleo samo... to je vise posledica nasumicnih pokusaja nego nekog smisljenog pisanja programskog koda... cak bih rekao da su rezultati suprotni od onoga sta sam ocekivao da ce se desiti...
Inace ipak sam zeleo da pomocu metode DajBoju omogucim dodeljivanje vrednosti private atributa Boja drugim promenljivama u programu.
Metodom koju mi je Dragi Tata napisao sam nameravao kasnije da se pozabavim, samo ja bih je nazvao PostaviBoju :)
Prepravio sam prethodni primer:

class Automobil
{
public:
Automobil () {}
~Automobil () {}
void IspisiPodatke ();
void UpisiPodatke ();
char *DajBoju () {return Boja;}

private:
char Boja [20];
int MaxBrzina;
};

void Automobil::UpisiPodatke ()
{
cout << "Unesi boju automobila:";
cin.get (Boja, 19);
cout << "Unesi maksimalnu brzinu automobila:";
cin >> MaxBrzina;
}

void Automobil::IspisiPodatke ()
{
cout << "--Podaci objekta-- \n";
cout << "Boja:" << Boja << "\n";
cout << "Maksimalna brzina:" << MaxBrzina << "\n";
}

int main()
{
char *B;
Automobil Yugo;
Yugo.UpisiPodatke(); // unesemo na primer boju 'crvena'
Yugo.IspisiPodatke ();
B=Yugo.DajBoju ();
cout <<"B:" << B <<"\n"; // ispisuje se 'crvena'
B="plava";
cout <<"B:" << B <<"\n"; //ispisuje se 'plava'
Yugo.IspisiPodatke (); // ispisuje se 'crvena'

system("PAUSE");
return 0;
}


E sad... ja sam mislio da ce kada uradim B=Yugo.DajBoju () pokazivac B pokazivati na pocetak niza Boja i da ce se sve promene koje budem izvrsavao pomocu pokazivaca B odnositi i na sam sam niz Boja ali kada izvrsim program vidim da nije tako i da i posle dodele B="plava" atribut Boja zadrzava prethodnu vrednost "crvena"... Eto to mi je malo cudno jer sam mislio da se nizovi ne mogu kopirati na taj nacin.
Nadam se da nisam suvise smorio svim ovim pitanjima ali meni je ova tema jako interesantna...
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Pocetnicko pitanje15.08.2002. u 20:14 - pre 263 meseci
Ja stvarno nisam siguran da razumem šta hoćeš, ali ne vidim ništa nelogično u tvojim rezultatima.

Kada uradiš B=Yugo.DajBoju (), onda B zaista pokazuje na početak niza boja i ako uradiš npr *(B+1) = 'k', IspisiPodatke će da vrati vrednost "ckvena" a ne "crvena".

U tvom primeru si najpre postavio B da pokazuje na Boja, a posle si ga promenio da pokazuje na "plava" (posebna lokacija u memoriji). Boja je ostala "crvena", jer je nikad nisi ni promenio.

 
Odgovor na temu

Black
Belgrade

Član broj: 4199
Poruke: 71
*.verat.net



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 22:25 - pre 263 meseci
Ma ja sam zeleo da vrednost private atributa Boja dodelim promenljivoj B, odnosno da kopiram sadrzaj. Medjutim nisam shvatio koncept nizova, odnosno stringova u C++u tako da sam se samo sve vise i vise upetljavao sa pokazivacima...
Cini mi se da je ovo resenje mog problema:

class Automobil
{
public:
Automobil () {}
~Automobil () {}
void IspisiPodatke ();
void UpisiPodatke ();
void DajBoju (char NizUl []) {strcpy (NizUl, Boja);}

private:
char Boja [20];
int MaxBrzina;
};

void Automobil::UpisiPodatke ()
{
cout << "Unesi boju automobila:";
cin.get (Boja, 19);
cout << "Unesi maksimalnu brzinu automobila:";
cin >> MaxBrzina;
}

void Automobil::IspisiPodatke ()
{
cout << "--Podaci objekta-- \n";
cout << "Boja:" << Boja << "\n";
cout << "Maksimalna brzina:" << MaxBrzina << "\n";
}

int main()
{
char B [20];
Automobil Yugo;
Yugo.UpisiPodatke();
Yugo.IspisiPodatke ();
Yugo.DajBoju (B);
cout <<"B:" << B <<"\n";


system("PAUSE");
return 0;
}
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.bitsyu.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Pocetnicko pitanje16.08.2002. u 20:44 - pre 263 meseci
Nisam detaljno gledao, ali čini mi se da je sve što si trebao da zameniš u prethodnoj varijanti je dodela ,,B="plava"'' sa ,,strcpy(B,"plava")''.

Toliko.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pocetnicko pitanje

[ Pregleda: 5107 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.