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

Pocetnicko pitanje

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

[ Pregleda: 2340 | Odgovora: 14 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Black
Belgrade

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



Profil

icon Pocetnicko pitanje15.08.2002. u 02:33

Zanima me kako da deklarisem funkciju koja vraca string, odnosno niz karaktera...
Pokusao sam nesto kao:

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

ali ne funkcionise...
15.08.2002. u 02:33 

dpanic
Dušan Panić
Loznica

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

Jabber: dpanic@elitesecurity.org
Sajt: www.znamo.se


Profil

icon Re: Pocetnicko pitanje15.08.2002. u 03:47
Code:

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

char *
funkcija (char *nekistring)
{
   return nekistring;
}

15.08.2002. u 03:47 

Časlav Ilić
Braunšvajg, Nemačka

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



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 09:58
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;
}
15.08.2002. u 09:58 

Ivan Dimkovic
Director Platform & Technology, Nero EMEA
EU

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

Sajt: www.linkedin.com/in/ivand..


Profil

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

15.08.2002. u 10:11 

Časlav Ilić
Braunšvajg, Nemačka

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



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 11:57
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() */
...
}

15.08.2002. u 11:57 

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

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

Sajt: dejan.lekic.org


Profil

icon Re: Pocetnicko pitanje15.08.2002. u 13:58
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
15.08.2002. u 13:58 

Ivan Dimkovic
Director Platform & Technology, Nero EMEA
EU

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

Sajt: www.linkedin.com/in/ivand..


Profil

icon Re: Pocetnicko pitanje15.08.2002. u 14:06
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 :))

15.08.2002. u 14:06 

Black
Belgrade

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



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 16:40
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.
15.08.2002. u 16:40 

Black
Belgrade

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



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 17:40
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;
}
15.08.2002. u 17:40 

Au197/79
NBGD

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



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 17:55
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.
15.08.2002. u 17:55 

Dragi Tata

Član broj: 1958
Poruke: 3885
199.171.112.*

Sajt: www.novetehnologije.com


Profil

icon Re: Pocetnicko pitanje15.08.2002. u 18:02
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*.

15.08.2002. u 18:02 

Black
Belgrade

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



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 19:55
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...
15.08.2002. u 19:55 

Dragi Tata

Član broj: 1958
Poruke: 3885
199.171.112.*

Sajt: www.novetehnologije.com


Profil

icon Re: Pocetnicko pitanje15.08.2002. u 20:14
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.

15.08.2002. u 20:14 

Black
Belgrade

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



Profil

icon Re: Pocetnicko pitanje15.08.2002. u 22:25
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;
}
15.08.2002. u 22:25 

tOwk
Danilo Šegan
Zemun/Beograd

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

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


Profil

icon Re: Pocetnicko pitanje16.08.2002. u 20:44
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.
16.08.2002. u 20:44 

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

[ Pregleda: 2340 | Odgovora: 14 ]

Postavi temu Odgovori

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