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

ponovo i ponovo deklarise istu promenjivu?!?

[es] :: C/C++ programiranje :: C/C++ za početnike :: ponovo i ponovo deklarise istu promenjivu?!?

[ Pregleda: 3277 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon ponovo i ponovo deklarise istu promenjivu?!?20.09.2007. u 23:28 - pre 201 meseci


Ovo je primer iz zbirke zadataka "C\C++" od Milana Cabarkape glava 15 zad "3 h - drugo resenje".
Dakle donja f-ja brise one clanove liste koji sadrze karakter koji cuva promenjiva E.
Interesuje me zasto (u liniji oznacenoj sa mnogo "??????" ) svaki put kada se nadje "informacija E"
on ponovo definise pokazivac q. delete q bi trebalo samo da oslobodi memoriju na koju pokazuje a ne i pokazivaca q.
Ja bih recimo pokazivac q definisao odmah u drugom redu f-je (POKC pred=NULL,t=L,q) a "dole" samo q=t.

ima li neko odgovor?

Code:

typedef struct cvor
               {
                 char inf;
                struct cvor *sledeci;
               } CVOR;

typedef CVOR* POKC;

...

void brisi_iter (char E, POKC &L)
       {
         POKC pred=NULL,t=L;
         while (t)
                 if (t->inf==E)
                   {
                     POKC q=t;               // ?????????????????????????
                     if (pred)
                        pred->sledeci=t->sledeci;
                        else
                             L=t->sledeci;
                     t->sledeci;
                     delete q;                     // fusnote
                   }
                  else { pred=t;t=t->sledeci;}
           }
                   
     

a druga stvar moglo bi i sa f-jom free umesto delete. pr:
(red: fusnote)
jel' to Cabarkapa nedosleda pa malo C malo C++ (malo 'leba , malo perece :) )?

Code:

void brisi_iter (char E, POKC &L)
       {
         POKC pred=NULL,t=L;
         while (t)
                 if (t->inf==E)
                   {
                     POKC q=t;               // ?????????????????????????
                     if (pred)
                        pred->sledeci=t->sledeci;
                        else
                             L=t->sledeci;
                     t->sledeci;
                     free( q );                     // fusnote
                   }
                  else { pred=t;t=t->sledeci;}
           }

 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.72.eunet.yu.



+1 Profil

icon Re: ponovo i ponovo deklarise istu promenjivu?!?23.09.2007. u 11:45 - pre 201 meseci
Može se promenljiva definisati i odmah na početku funkcije ali smatra se dobrom praksom da se definiše na mestu na kojem će se upotrebiti.
Ne vidi se kako je zauzimao memoriju: ako je koristio new onda treba delete, a ako je malloc() onda naravno free().
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: ponovo i ponovo deklarise istu promenjivu?!?23.09.2007. u 22:41 - pre 201 meseci
Citat:
karas: Može se promenljiva definisati i odmah na početku funkcije ali smatra se dobrom praksom da se definiše na mestu na kojem će se upotrebiti.
Ne vidi se kako je zauzimao memoriju: ako je koristio new onda treba delete, a ako je malloc() onda naravno free().


Ma to je u redu da se promenjva moze definisati bilo gde u programu!
ali on ovde definise promenjivu UNUTAR PETLJE, tako da svaki put kada se udje u petlju ISTA promenjiva se PONOVO DEFINISE
npr:

Code:

...
i=0;
while (i<10)
{
  int p;
  i++;
...
}

ovaj deo koda 10 puta definise promenjivu p
to je isto kada bih je uradio
Code:

...
int p;
int p;
...
int p;
...


Sto se tice drugog dela - zar se moze u C-u koristiti new i delete, zar to nisu naredbe u C++.
Mislim da za C, new i delete, ne postoje!

hvala na trudu ali mi nisi puno pomogao.

Ima li neko da precizno razume pitanje!?
 
Odgovor na temu

uranium
Beograd

Član broj: 60097
Poruke: 543
*.eunet.yu.

Jabber: uranium@elitesecurity.org
ICQ: 324386953


+5 Profil

icon Re: ponovo i ponovo deklarise istu promenjivu?!?24.09.2007. u 00:05 - pre 201 meseci
Citat:
cobragangsta:

ovaj deo koda 10 puta definise promenjivu p
to je isto kada bih je uradio
Code:

...
int p;
int p;
...
int p;
...



Ne, situacija je zapravo ekvivalentna sledećem:

Code:

...
{
    int p;
    ...
}
{
    int p;
    ...
}
...
{
    int p;
    ...
}
...


promenljiva p je lokalna za svaki blok (nije vidljiva spolja, a po izlasku iz bloka se i uništava)...

Možda sam malo preterao... ali isprobaj i sledeći primer:

Code:

#include<stdio.h>

int main(){
    int i = 42;
    printf("\n1: i == %d", i);    
    {
        int i = 100;
        printf("\n2: i == %d", i);
    }
    {
        int i = 101;
        printf("\n3: i == %d", i);
        {
            int i = 102;
            printf("\n4: i == %d", i);
            {
                int i = 103;
                printf("\n5: i == %d", i);
            }
            printf("\n4: i == %d", i);
        }
        printf("\n3: i == %d", i);
    }
    printf("\n1: i == %d", i);
    return 0;
}



Attempt all the problems. Those you can do, don't do. Do the ones you cannot.
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: ponovo i ponovo deklarise istu promenjivu?!?24.09.2007. u 07:42 - pre 201 meseci
Da, new i delete su C++ operatori, ne postoje u C-u koji isto to regulise preko funkcija malloc() i free()..
Kao sto rece Uranium, promenljiva p je lokalna za blok u kojem se definise. Nalazi se na steku i po zavrsetku bloka uklanja se sa steka. Potpuno je nebitno da li je taj blok u kojem se definise telo funkcije ili petlje. Npr. mozes imati kod tipa
Code:

for (i = 1; i <= 10; i++)
{
  int k = 10;
  {
     int p = 20;
  }
/* ovde se ne vidi p */
}

tj. unutar bloka petlje se definise novi blok (u ovom slucaju bez potrebe) koji definise p. Svaki prolazak kroz petlju i ulazak u taj blok ponovo definise p a po izlasku se unistava. Zato se p ne vidi u ostatku petlje.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: ponovo i ponovo deklarise istu promenjivu?!?24.09.2007. u 23:53 - pre 201 meseci
Bravo,bravo na preciznim odgovorima.
Zaboravio sam na vidljivost u blokovima. Mislim da se nebih setio da svaki prolaz kroz petlju (u slucaju definisanja unutar iste) kreira blok za sebe a samim tim kreira i unistava promenjivu.
Hvala Uranium & Karas, cista 10-ka za vas!!!
 
Odgovor na temu

mjux

Član broj: 124150
Poruke: 158
*.ADSL.neobee.net.



+2 Profil

icon Re: ponovo i ponovo deklarise istu promenjivu?!?06.11.2007. u 21:00 - pre 200 meseci
Code:


typedef struct cvor
               {
                 char inf;
                 struct cvor *sledeci;
               } CVOR;

typedef CVOR* POKC;

...

void brisi_iter (char E, POKC &L)
       {
        
         POKC pred=NULL,t=L,tek;
        
         while (t->sledeci!=NULL)
                 
                   if (t->inf==E)
                   {
                           pred=L;
                           while(pred->sledeci!=t)pred=pred->sledeci;
                           pred->sledeci=t->sledeci;
                           free(t);
                           t=pred;
                   }
                    
                   t=t->sledeci;
      }
                     

ili ova varijanta :)
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: ponovo i ponovo deklarise istu promenjivu?!?

[ Pregleda: 3277 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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