[ sportbili @ 10.09.2002. 03:25 ] @
Imam sledeci problem. U programu uzimam celobrojne vrednosti i smestam u
niz. Kada naidje EOF zelim da program od tog elementa pa nadalje sve
elemente niza do LENGTH-og inicijalizuje na 0, medjutim nesto ne stima.

Ovo su definicije koriscenih funkcija.
Funkcija geta(niz) puni niz podacima koje korisnik unosi,
dok bi ini(niz,i) trebalo da inicijalizuje niz pocev od i-tog elementa
medjutim to ne radi vec ti elementi dobiju slucajne vrednosti.

HELP! I jos jedno pitanje a to je sta je garbage collector?

#define LENGHT 10

int nekiniz[LENGHT];

deklaracije funkcija

main() {...}

void geta(int a[])
{
int i;
for (i=0; i<LENGTH; i++)
if (a != EOF) scanf("%d", &a);
else { ini(a, i); break; }
}


void ini(int a[], int b)
{
int i;
for (i=b; i<LENGTH; i++) a=0;
}

nekiniz[] nije globalna promenljiva nego eto neka stoji da ne bude greska
sto je nema.

Da napomenem da sam petljao cak i sa getw-om (skroz bezuspesno).
[ Dragoslav Krunić @ 10.09.2002. 10:30 ] @
Koliko ja vidim, incijalozovao si LENGHT, ali kasnije u programu koristiš LENGTH, tj. zamenio si slova. Inače, česta greška u kucanju te reči, barem kod mene.
[ sportbili @ 10.09.2002. 11:31 ] @
Samo sam definicije paste-ovao a ovo gore sam kucao na brzinu online,
tako da je u originalu ispravno. Nesto drugo ne valja. Ipak hvala.
[ turncoat @ 10.09.2002. 13:02 ] @
Sledeci kod ce delimicno da uradi to sto si hteo.
Stavio sam a[ii]!=-1 jer ne znam kako da preko tastature unesem EOF.
Trebalo bi da bude ^Z ali nece (kod mene na WinME).
U tvom kodu ne valja dodeljivanje vrednosti clanovima niza.
Ne treba a=0. vec a[ii]=0.
Samo a je pointer na prvi clan niza, mogao si da stavis i *(a+ii).

Code:

/*-------------------------  primer.c -------------------------------*/
#include <stdio.h>
#define LEN 10   /* niz ce imati 11 clanova*/

void geta(int a[]);
void ini(int a[],int);

void geta(int a[])
{
int ii;
ii=0;
scanf("%d",&a[ii]);
while ((a[ii] != -1)  && (ii!=LEN))
{    ii++;   scanf("%d", &a[ii]);   };
ini(a, ii);
}


void ini(int a[], int b)
{
int ii;
for (ii=b; ii<LEN; ii++) a[ii]=0;
}


int main()
{
int ii;
int nekiniz[LEN];  
geta(nekiniz);
for (ii=0;ii<LEN;ii++) printf ("%d  ",nekiniz[ii]);
printf("\n");
system ("PAUSE");
  return 0;
}

/*-------------------------  primer.c -------------------------------*/


[Ovu poruku je menjao turncoat dana 11.09.2002 u 01:59 AM GMT]
[ anon676 @ 10.09.2002. 15:02 ] @
garbage colection nemas u c-u, to imas u moduli 3. mnogo korisna i dobra stvar, bar sam tako cuo :)
[ leka @ 10.09.2002. 16:38 ] @
Jos jedan pocetnicki problem izgleda... Te vrednosti koje te bude NISU slucajne! :) Tu vrednosti koje se nalaze u memoriji na adresama koje odgovaraju elementima niza koji nameravas da koristis u svom programu. O cemu se radi...
Recimo da zelis da koristis niz iaMojNiz koji ima 5 elemenata, i uradis dakle nesto tipa
Code:

int iaMojNiz[4];

Nakon ove linije se zna da isMojNiz niz pocinje od adrese 0xbabadeda (pretpostavka, ovo se nikad ne zna :), ali sama linija NIJE OBRISALA podatke koji su na toj adresi (na toj adresi pocinje prvi element niza iaMojNiz!) bili pre izvrsavanja te linije. Dakle, prostim recima stari podaci su jos tu, u memoriji. Zbog toga kad se odmah nakon ove linije ovaj niz odstampa sa recimo:
Code:

int ii;
for (ii = 0; ii < 5; ++ii)
  printf("Element %d : %d\n", ii, iaMojNiz[ii]);

dobice se rezultat koji je nemoguce predvideti. Evo sta sam ja dobio:
Code:

Element 0 : 2293640
Element 1 : -1
Element 2 : 2293644
Element 3 : 575
Element 4 : 2293664

Neko od vas kad bi iskompajlirao programcic (na kraju cu dati i kod) koji ovo stampa i kada bi ga startovao na svom kompjuteru dobio bi totalno drugacije rezultate...

A evo i koda:
Code:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int iaMojNiz[4];
    
    int ii;
    for (ii = 0; ii < 5; ++ii)
        printf("Element %d : %d\n", ii, iaMojNiz[ii]);

    getch();
    return 0;
}


(Dev-C++ projekat cu da zalepim uz poruku.)

[ Dragi Tata @ 10.09.2002. 17:31 ] @
Citat:
dARKmIND:
garbage colection nemas u c-u, to imas u moduli 3. mnogo korisna i dobra stvar, bar sam tako cuo :)


"Đubretar" imaš u većini OO jezika, uključujući Javu i C#, a imaš ga i u Lisp-u.

Što se rada sa memorijom tiče postoje dva različita pristupa:

1) Lisp pristup: "Memorija je previše bitna stvar da bismo pustili programera da upravlja njome."

2) C pristup: "Memorija je previše bitna stvar da bismo pustili kompjuter da upravlja njome."

Moja malenkost je pristalica pristupa br 2), ali ima dosta onih koji više vole 1) i ti su ljubitelji garbage collector-a - programa koji "čisti" memoriju koja više nije u upotrebi.

Mada se u mnogim knjigama može naći tvrdnja kako GC povećava produktvinost programeru, jer ga oslobađa brige o čišćenju memorije, empirijska istraživanja nisu donela potvrdu ovakvog mišljenja. Međutim, dokazano je da programi rađeni u GC jezicima zahtevaju mnogo više memorije i CPU resursa (sporije rade) nego isti takvi programi rađeni u jezicima bez GC-a.

Uostalom, memorija je samo jedan od resursa koji programi upotrebljavaju, a GC ne samo da ne čisti ostale, nego otežava njihovo čišćenje.

Ako je neko posle ove moje tirade zaključio da nisam "zaljubljen" u GC, taj je potpuno u pravu :)
[ sportbili @ 10.09.2002. 19:56 ] @
Citat:
leka:
Jos jedan pocetnicki problem izgleda... Te vrednosti koje te bude NISU slucajne! :) Tu vrednosti koje se nalaze u memoriji na adresama koje odgovaraju elementima niza koji nameravas da koristis u svom programu. O cemu se radi...


Dalo se primetiti da se slicne vrednosti ponavljaju. Medjutim nije problem u tome
koje se vrednosti javljaju jer su skroz uselles vec kako njih zameniti bilo kojom
drugom, u konkretnom slucaju nulom.

- U medjuvremenu problem resen - kao da ga nije ni bilo. Svasta. Pogledaj poruku ispod. *:-)

Citat:

Nakon ove linije se zna da isMojNiz niz pocinje od adrese 0xbabadeda (pretpostavka, ovo se nikad ne zna :), ali sama linija NIJE OBRISALA podatke koji su na toj adresi (na toj adresi pocinje prvi element niza iaMojNiz!) bili pre izvrsavanja te linije. Dakle, prostim recima stari podaci su jos tu, u memoriji.


Kapiram nego me interesuje kako su ti podaci tu i dospeli? Posto su evidentan junk. Da li ih kompajler generise ili os ili ko/sta?

POZ

[Ovu poruku je menjao sportbili dana 10.09.2002 u 08:08 PM GMT]
[ sportbili @ 10.09.2002. 20:07 ] @
Citat:
turncoat:
Sledeci kod ce delimicno da uradi to sto si hteo.
Stavio sam a!=-1 jer ne znam kako da preko tastature unesem EOF.
Trebalo bi da bude ^Z ali nece (kod mene na WinME).


Zbog EOF-a je int c da bi mogao da poredi sa njim.

Citat:

U tvom kodu ne valja dodeljivanje vrednosti clanov
ima niza.
Ne treba a=0. vec a[ i ]=0.
Samo a je pointer na prvi clan niza, mogao si da stavis i *(a+i).


[ i ] je tag za italic na forumu tako da si me u prvi mah zbunio sa "ne treba a=0 vec a=0" :-)) . Uf bre :-) u "originalnom" sorsu sam uredno stavio a[ i ], UZMEM I
ISKOMPAJLIRAM DOK OVO PISEM I RADI.

Imam duhove u kompu :-) Znaci niti je LENGHT niti je a=0 vec nesto drugo bilo
po sredi. Inace radim pod Win2000 i sa edit-om kucam C pa u istom prozoru
kompajliram sa Borland C/C++ 3.1. Postoji mogucnost da je on recimo nesto izbagovao, jer ja sors NISAM menjao od tada (da li je win nesto baferovao ko zna).

U svakom slucaju hvala i tebi i ostalima koji su odgovorili na ovaj topic.
[ leka @ 11.09.2002. 01:21 ] @
Ti podaci su u memoriji ostali nakon nekog programa... Nikada se ne zna kog programa, zasto su tu ostali i tako dalje...