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

Reference i liste

[es] :: C/C++ programiranje :: Reference i liste

[ Pregleda: 2262 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

4063
Zaharije Pasalic

Član broj: 19862
Poruke: 29
*.as54.bi.bih.net.ba.

Sajt: www.maspic.netfirms.com


Profil

icon Reference i liste15.08.2004. u 00:42 - pre 239 meseci
Dali je moguce napraviti listu u kojoj "node" ne sadrzi pointer na podatak vec sadrzi referencu na njega?

Radio sam na par gluposti ali mi GCC s*** ili ja ne kontam! Problem mi je funkcija koja dodaje podatak u listu. Ako prenesem podatak sa "tip &" i pridruzim ga referenci u nodu, destruktor se vec izvrsi?! Fazon je sto u standardu pise da temporalni objekat zivi sve dok ne izleti iz svog bloka ili dok referenca pokazuje na njega. Ocigledno, u ovom slucaju to nije OK (Probao sam i sa BRoland C++ 5.0, i desava se isto s*****)? HELP!
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.smin.sezampro.yu.

Jabber: DarkMan


Profil

icon Re: Reference i liste20.08.2004. u 22:58 - pre 239 meseci
Ako gresim neka me neko ispravi.

Koliko znam reference, za razliku od pointera, moraju biti inicijalizovani tj. da pokazuju na neku postojecu varijablu, objekat i slicno (mislim da reference ne mogu da pokazuju na NULL).
Elementi liste se prave sa new ili malloc pa im se tek onda dodeljuju vrednosti za sta je potrebna osobina pointera da moze da pokazuje na bilo sta (pa i na varijable i objekte koji uopste ne postoje).
Dakle, ako ces koristiti liste, zaboravi na reference.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dial.InfoSky.Net



+2789 Profil

icon Re: Reference i liste23.08.2004. u 02:24 - pre 239 meseci
Reference (upućivanja) se u jeziku C++ korisste samo za prenos argumenata funkcije po adrsi i za vraćanje vrednosti po adresi.

Code:

// Primer 1


#include <iostream>


using namespace std;


int& manja(int &a, int &b)
{
        if (a<b)
                return a;
        else
                return b;
}

void zameni(int &a, int &b)
{
        int t;

        t = a;
        a = b;
        b = t;
}

int main()
{
        int a=5, b=7;

        zameni(a,b);
        manja(a,b)++;

        cout << a << endl << b << endl;

        return 0;
}



Ako si nekada učio Pascal i voleo with naredbu koju sam ja oduvek iz dna duše mrzeo (ne znam zašto), možeš upućivanja da koristiš i za to.

Code:

// Primer 1


#include <iostream>


using namespace std;


typedef
    struct llista
    {
    int cvor;
    struct llista *sledeci;
    }    *lista;

void dodaj_na_kraj(lista &l, int n)
{
    if (l==0)
    {
    l = new struct llista;
    l->cvor = n;
    l->sledeci = 0;
    }
    else
    dodaj_na_kraj(l->sledeci, n);
}

void brisi(lista &l)
{
    if (l!=0)
    {
    brisi(l->sledeci);
    delete l;
    l = 0;
    }
}


int main()
{
    lista l = 0;
    
    dodaj_na_kraj(l,1);
    dodaj_na_kraj(l,2);
    dodaj_na_kraj(l,3);

    lista &p = l->sledeci;
    
    cout << p->cvor << endl << p->sledeci->cvor << endl;

    brisi(l);
    
    return 0;
}



Naravno, ovo je C-ovski pristup. U duhu jezika C++ je upotreba šablona za liste iz standardne biblioteke šablona STL. Ako baš hoćeš da odradiš sve ručno, onda je u duhu jezika C++ pravljenje odgovarajuće klase, ili još bolje šablona.

Drugih smislenih primena upućivanja (ili referenci) u jeziku C++ nema. Pomenuću još da postoje situacije kada je vraćanje rezultata po vrednosti nemoguće. Naime, metod klase ne može da vrati kao rezultat objekat iste te klase, ali pokazivač ili referencu na njega može.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

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

Član broj: 234
Poruke: 2534
*.231.216.81.gus.vf.siwnet.net

Sajt: dejan.lekic.org


+2 Profil

icon Re: Reference i liste23.08.2004. u 02:34 - pre 239 meseci
Moze i bez sablona da se dobije genericka lista... Ko zeli da vidi kako - imate u sorsu od RTK projekta - http://www.sf.net/projects/rtk . - Pogledajte SList, List i DList ...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

4063
Zaharije Pasalic

Član broj: 19862
Poruke: 29
*.bbone.utic.net.ba.

Sajt: www.maspic.netfirms.com


Profil

icon Re: Reference i liste23.08.2004. u 11:57 - pre 239 meseci
OK, trebao sam mozda drugacije formulirati pitanje. Imam slijedeci kod i on ne radi:

Code:

#include <iostream>
using namespace::std;

class base {
public: 
    virtual void dump() = 0;
};

class chr : public base {
    char ch;
public:
    chr(char s) { ch = s; }
    ~chr() { }
    void dump() { cout << ch ; }
};

class num : public base {
    int n;
public:
    num(int i) {n = i; }
    ~num() {}
    void dump() { cout << n; }
};

struct node {
    base &data; // ako stavim pointer sve je OK
    node *next;
};

class list {
    node *n;
public:
    list() : n(0) {}
    void add(base &d);
    void dump() {
        for(node *tmp = n; tmp; tmp = tmp->next)
            tmp->data.dump();  // OVDE KOD PUCA
    }
};

void list::add(base &d)
{
node *tmp = n;
    if (!n) {
        n = new node;
        n->next = 0;
        n->data = d;
        tmp = n;
    }
    else {
        while(tmp->next)
            tmp = tmp->next;
        tmp->next = new node;
        tmp = tmp->next;
    }
    tmp->next = 0;
    tmp->data = d;
}

int main()
{
num n1(3);
num n2(3);
chr s1(49);
chr s2(49);
list l;
    l.add(n1);
    l.add(s1);
    l.add(n2);
    l.add(s2);
    l.dump();
return 0;

 
Odgovor na temu

4063
Zaharije Pasalic

Član broj: 19862
Poruke: 29
*.bbone.utic.net.ba.

Sajt: www.maspic.netfirms.com


Profil

icon Re: Reference i liste23.08.2004. u 12:02 - pre 239 meseci
Usput, kod odlicno radi pod Borland C++ 5.0 i Microsoftovm kompajlerom (valjda 6.0), no kod MinGW-a izleti poruka "THIS PROGRAM PREFORM ILLEGAL ....", takodjer pod bilo kojom LINU distribucijom dobijam SEGMENTATION FAULT!
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dial.InfoSky.Net



+2789 Profil

icon Re: Reference i liste23.08.2004. u 14:42 - pre 239 meseci
Ne znam za starije verzije Borlandovih kompajlera, ali Borland C++ 5.5 free commandline tools izbacuje poruku

Code:

Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland 
orbad.cpp: 
Error E2232 orbad.cpp 28: Reference member 'node::data' in class without constructors 
Warning W8027 orbad.cpp 36: Functions containing for are not expanded inline 
*** 1 errors in Compile *** 


Slično, program ne može da se prevede ni u MS Visual C++ 6 okruženju. Dakle, nema neinicijalizovanih referenci! Ako program radi u nekom kompajleru, to ne znači da je pisan po standardima, pa samim tim ne mora da radi pod drugim kompajlerima. To je zato što svaki proizvođač kompajlera nudi neka svoja proširenja jezika koja nisu standardna, i ona se razlikuju od kompajlera do kompajlera. Koristi pokazivače, to je standardno. Šaljem ti ispravan kod.

Code:

#include <iostream>
 using namespace::std;
 
 class base {
 public: 
     virtual void dump() = 0;
 };
 
 class chr : public base {
     char ch;
 public:
     chr(char s) { ch = s; }
     ~chr() { }
     void dump() { cout << ch ; }
 };
 
 class num : public base {
     int n;
 public:
     num(int i) {n = i; }
     ~num() {}
     void dump() { cout << n; }
 };
 
 struct node {
     base *data; // Ovde ide pokazivac
     node *next;
 };
 
 class list {
     node *n;
 public:
     list() : n(0) {}
     void add(base &d);
     void dump() {
         for(node *tmp = n; tmp; tmp = tmp->next)
             tmp->data->dump();  // Ovda ide -> umesto . jer je data pokazivac
     }
 };
 
 void list::add(base &d)
 {
 node *tmp = n;
     if (!n) {
         n = new node;
         n->next = 0;
         n->data = &d;  // Dodeljuje se adresa objekta jer je data pokazivac
         tmp = n;
     }
     else {
         while(tmp->next)
             tmp = tmp->next;
         tmp->next = new node;
         tmp = tmp->next;
     }
     tmp->next = 0;
     tmp->data = &d;  // Dodeljuje se adresa objekta jer je data pokazivac
 }
 
 int main()
 {
 num n1(3);
 num n2(3);
 chr s1(49);
 chr s2(49);
 list l;
     l.add(n1);
     l.add(s1);
     l.add(n2);
     l.add(s2);
     l.dump();
 return 0;
 } 



Ovaj kod je testiran na GNU kompajleru za Linux, Borlandovom C++ 5.5 freecommandline tools, MS Visual C++ 6 i u Dev C++ okruženju (MinGW kompajler). Program koji si ti priložio nije mogao da mi radi ni u jednoj od tih varijanti.

I ja bih voleo kada bi se upućivanja (reference) mogle za još ponešto pametno upotrebiti osim onoga što sam napisao, ali po važećem standardu ne može. Inače, koliko znam MinGW nije podržavao ceo standard jezika C++. Ne znam da li se u međuvremenu nešto promenilo.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

4063
Zaharije Pasalic

Član broj: 19862
Poruke: 29
*.bbone.utic.net.ba.

Sajt: www.maspic.netfirms.com


Profil

icon Re: Reference i liste01.09.2004. u 10:15 - pre 238 meseci
Jap, do mene je! Borland 5.0 takodjer trazi da se referenca u strukturi inicijalizira. KOd bi trebao izgledati:

Code:

struct node {
     base &data; // Ovde ide pokazivac
     node *next;
     node(base &n) : data(n) {}
 };
 

 void list::add(base &d)
 {
 node *tmp = n;
     if (!n) {
         n = new node(d);
         n->next = 0;
         tmp = n;
     }
     else {
         while(tmp->next)
             tmp = tmp->next;
         tmp->next = new node(d);
         tmp = tmp->next;
     }
     tmp->next = 0;
 }


Citava frka se digla zbog toga sto sam cuo da temporalni objekat mora postojati dok god postoji referenca koja pokazuje na njega, STO NIJE TACNO! NEki dan to potvrdio, tako da se za objekte koje predam lista::add pozove destruktor odma nakon metode, tako da ne postoje u listi!

Ionako, hvala puno.
 
Odgovor na temu

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

Član broj: 234
Poruke: 2534
*.231.216.81.gus.vf.siwnet.net

Sajt: dejan.lekic.org


+2 Profil

icon Re: Reference i liste01.09.2004. u 15:45 - pre 238 meseci
sto bi rekao neko na IRC-u (ne secam se ko) - "qq meni" ... Prema C++ standardu, referenca nije first-class objekat... Ovo u prevodu znaci da referenca ne moze da egzistira sama po sebi bez necega na sta ce da REFERISE. Dakle, deklaracija reference poput
Code:

int &ref;

je ILEGALNA iz prostog razloga - na sta ce 'ref' da referise?
Tako da je jasno zasto imamo gresku u
Code:

struct node {
     base &data;
     node *next;
     node(base &n) : data(n) {}
};


Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

[es] :: C/C++ programiranje :: Reference i liste

[ Pregleda: 2262 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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