Šta je novo?

funkcija za dinamicku dodelu memorije

sinke

Čuven
Učlanjen(a)
18.10.2000
Poruke
253
Poena
620
Pomoc, malo ucimo C na faxu i ima jedan zadatak ali na zalost u knjizi nije detaljno objasnjeno ovo poglavlje i sad mi to nedostaje. Skinuo sam neke knjige sa neta i nije lose ali moram da pitam. Pocetak zadatka glasi ovako: treba da se formiraju 2 celobrojna niza preko standardnog ulaza koristeci funkcije za dinamicku dodelu memorije. Ja sam uradio sledece:

#include <stdio.h>
void main()
{
int niz1[10], niz2[10];
int *p,i,;
for (i=0;i<5;i++)
{
p=(int*)malloc(sizeof(int));
printf("\nUnesi %d. clan niza: ",i+1);
fscanf(stdin,"%d",&p);
niz1=p;
}
for (p=niz1;p<niz1+5;p++)
printf("%d",*p);

}

Ovo sam dosta kasno radio i moguce da moze i mnogo lakse ali me interesuje da li je i ovaj nacin tacan, a i koji je laksi nacin. Kako recimo calloc da upotrebim da rezervise 5 ili 10 mesta u koja cu kasnije da strpam brojeve ? Naravno ovo nije ceo posao, nego posto sam zurio samo sam proverio da li radi za jedan niz a posle cu ja lako da napravim jos jedan. Nastavak zadatka je da se nizovi spoje i pronadje najveca vrednost ali to nije toliki problem za sada. Zasto to pitam, ova funkcija rezervise prostor za tip int u memoriji i to u toku izvrsavanja programa, a kod statickih varijabli se to uradi po pokretanju programa i memorija ostaje rezervisana sve dok traje program. Buni me, pa zar samom deklaracijom "niz1[10]" mi vec ne rezervisemo prostor za niz od 10 elemenata i da taj prostor ostaje dok je program pokrenut ? jer je deklaracijom vec unapred rezervisano mesto, a dok program ne dodje do malloc-a on vec pre toga ima rezervisano mesto, zar ne ? Ili to dok prevodilac unapred prevodi program procita pa zna da ne mora ? Ne razumem.
 
nacin na koji radis nije resenje zadatka

kada se na pocetku funkcija vrsi deklaracija, taj prostor bice rezervisan.

To si sasvim dobro rekao. Sta god napisemo u sekciji za deklaraciju, to ce biti dostupno u datoj funkciji. (govorim funkcija jer pricamo o Ce-u)

int NIZ[100];
rezervise 100x2bajta u "memoriji" (4bajta ako je win32). Memorija je sirok pojam, pa ne bih bas da zalazim u detalje .. u kojim delovima memorije to ide..

int *p;
rezervise 4 bajta za POKAZIVAC na integer !!!!!
float *p; rezervise 4 bajta za pokazivac na float;

e sad .. resenje je ovako

int *p1,*p2;

p1 = (int *)calloc(5, sizeof(int));
p2 = (int *)calloc(10, sizeof(int));


dalje je lako

//prvi niz
for (i=0;i<5;i++)
{
scanf("%d",&p1); /* ili scanf("%d",p1+i) */
}

// drugi niz
for (i=0;i<10;i++)
{
scanf("%d",&p2); /* ili scanf("%d",p2+i) */
}


Pazi dalje, sastavljanje niza nije jednostavno !!
moras da otvoris i treci pokazivac koji ce da bude novi niz !!
int *p3;
p3 = calloc(15,sizeof(int));
for (i=0;i<5;i++) p3 = p1;
for (i=0;i<10;i++) p3[5+i] = p2;

pa onda prodji kroz p3 ... i nadji maksimum..

dealociraj na kraju sve zivo!!


Pokazivaci su zeznuti .. i najtezi u Ce-u.
Sto se tice samog kompajlera.. on nista ne zna..
odvaja prostor u memoriji koji deklariane promenljive traze i nista vise ne rezervise. Taj prostor NE OSTAJE dok je program pokrenut, vec dok je funkcija aktivna.. pazi zato postoji termin GLOBALNA i lOKALNA promenljiva..

On tebi da mesta za pokazivac (4Bajta), a ti ces da kreiras dinamicki memoriju i da je dodelis tom pokazivacu .. na kraju ces naravno da je dealociras .. sa free(p1), free(p2);


koji je to fax

ako je etf .. idi obavezno kod andrije bosnjakovica na konsultacije !
 
pjsoft je napisao(la):
nacin na koji radis nije resenje zadatka
kada se na pocetku funkcija vrsi deklaracija, taj prostor bice rezervisan.
To si sasvim dobro rekao. Sta god napisemo u sekciji za deklaraciju, to ce biti dostupno u datoj funkciji. (govorim funkcija jer pricamo o Ce-u)
int *p1,*p2;
p1 = (int *)calloc(5, sizeof(int));
p2 = (int *)calloc(10, sizeof(int));
for (i=0;i<5;i++)
{
scanf("%d",&p1); /* ili scanf("%d",p1+i) */
}
for (i=0;i<10;i++)
{
scanf("%d",&p2); /* ili scanf("%d",p2+i) */
}
Pazi dalje, sastavljanje niza nije jednostavno !!
moras da otvoris i treci pokazivac koji ce da bude novi niz !!
int *p3;
p3 = calloc(15,sizeof(int));
for (i=0;i<5;i++) p3 = p1;
for (i=0;i<10;i++) p3[5+i] = p2;
pa onda prodji kroz p3 ... i nadji maksimum..
dealociraj na kraju sve zivo!!
Pokazivaci su zeznuti .. i najtezi u Ce-u.
je funkcija aktivna.. pazi zato postoji termin GLOBALNA i lOKALNA promenljiva..
On tebi da mesta za pokazivac (4Bajta), a ti ces da kreiras dinamicki memoriju i da je dodelis tom pokazivacu .. na kraju ces naravno da je dealociras .. sa free(p1), free(p2);
koji je to fax
ako je etf .. idi obavezno kod andrije bosnjakovica na konsultacije !


Hvala na iscrpnom odgovoru. Sad mi je jasnije, dobro u pocetku je tesko tek sad ucim ali mislim da sam ukapirao neke stvari. Ovo mi je sad jasno, samo je trebalo malo razmisliti. Skinuo sam neku skriptu sa nekog hrvatskog sajta ali je tamo dinamicko dodeljivanje objasnjeno uz strukture i tip je deklarisao strukturu i zato me sve zbunilo, sto ja da deklarisem niz jer time vec rezervisem memoriju. Pokazivaci jesu teski ali nije nemoguce razumeti. Da, delocirati treba kasnije. E sto se tice faxa nije etf, nego je ekonomski, da dobro pise, eto bavimo se i time malo. Zamisli kako je spremiti devojkama koje su u ovaj smer upale tako sto nisu primljene na finansije a racunare znaju samo da ukljuce. :) Samo, malo je tezak ispit, tj. nije toliko tezak koliko je obiman, imam 4 sata a 5 zadataka, 1. da nadjem sintaxne greske u C programcicu i da opisem sta program radi (red po red), 2. i 3. su zadaci ovog tipa u C-u stim da ovaj zadatak je obiman jer jos pored ovoga treba i sortirati clanove niza. A 4. i 5. zadatak je C++ i rad sa klasama i "funkcijama". Hvala na pomoci jos jednom.
 

Jos jedan problem, ne razumem zasto ovaj primer ne radi, mislim u cemu je fora, prvi niz mozes da unosis sve dok ne uneses znak a drugi niz uopste nece da pocne da unosi ?
#include <stdio.h>
#include <conio.h>
void main()
{
int *p,i,*s,*t,b=0,d=0;
clrscr();
s=(int*)calloc(10,sizeof(int));
p=(int*)calloc(10,sizeof(int));
printf("\nUnesi %d. clan niza: ",b+1);
scanf("%d",&p);
while (p!=0)
{
b+=1;
printf("\nUnesi %d. clan niza: ",b+1);
scanf("%d",&p);
}
printf("\nUnesi %d. clan drugog niza: ",d+1);
scanf("%d",&s[d]);
while (s[d]!=0)
{
d+=1;
printf("\nUnesi %d. clan drugog niza: ",d+1);
scanf("%d",&s[d]);
}
printf("\nPrvi niz je:\n");
for (i=0;i<b;i++)
{
printf("%d,",p);
}
printf("\nDrugi niz je:\n");
for (i=0;i<d;i++)
{
printf("%d,",s);
}
}
Ajde molim nek mi neko objasni dosta je hitno.
 
E da, cim sam poslao mail setio sam se da mi je neko sa foruma jednom objasnio nesto slicno, da treba navodno bafer izbrisati sa funkcijom flushall(), ali mi ipak treba malo pojasnjenje.
 
fali ti #include <stdlib.h>, zato sto se u njemu nalazi malloc deklaracija.

greska kompajlera je u pitanju, a ti budi svestan da se ovakav problem ne bi desio ni u jednom normalnom C alatu, koji nije TurboC za dos.. :))

salu na stranu.. moras znati gde se deklarise koja funkcija, i koristi help
 
pjsoft je napisao(la):
fali ti #include <stdlib.h>, zato sto se u njemu nalazi malloc deklaracija.

greska kompajlera je u pitanju, a ti budi svestan da se ovakav problem ne bi desio ni u jednom normalnom C alatu, koji nije TurboC za dos.. :))

salu na stranu.. moras znati gde se deklarise koja funkcija, i koristi help

Nesto se ne razumemo, pa radi program samo drugi scanf ne radi, ne radi dok ne ispraznim buffer valjda, a cim ja stavim flush on proradi. E jos jedno pitanje za tebe, izvini malo mucim ali sta ces, kako da prekinem unos u niz celih brojeva kad unesem slovo. Mislim kako ide logicki izraz da on kad vidi da sam uneo nesto sto nije int prekine unos i predje na unos drugog niza ? E ne znam vrteo sam po netu, knjizi, skripti nekog hrvta ali svugde su primeri recimo da unosis u niz tipa char pa kad nije char da prekine, to znam ali za moj primer je malo drugacije. Ja sam pisao if(p!=0) ali to nije bas resenje. Znam da logicki izrazi proveravaju da li je uslov tacan ili ne i ako je tacan vracaju 1 a ako nije onda 0 ali ovo moje mislim dan nije dobro.

P.S. moram da radim u Turbo C jer je to ispit.
 
Nikako drugacije osim unosenja karaktera po karakter !!

to je i cilj zadatka, da od niza brojeva prikazanih kao karakteri ti napravis binaran broj (integer).

moras malo da se mucis :)
 
Nazad
Vrh Dno