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

Ogranicenja malloc() funkcije

[es] :: C/C++ programiranje :: Ogranicenja malloc() funkcije

[ Pregleda: 2531 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Ogranicenja malloc() funkcije04.03.2008. u 15:54 - pre 173 meseci
Dali postoje neka ogranicenja malloc funkcije (naravno da treba biti dovoljno memorije). I koji su nejcesci problemi u radu sa njom.
Ovo me zanima zato sto imam program u kojem alokacija radi samo za prvih 409 elemenata (jedan element velicine 148 bajta) a posle puca. I zbog toga nemogu da napravim jednostruko povezanu listu.
Sta bi to moglo biti i kako to da resim.
 
Odgovor na temu

POW R TOC H
Dark Side of The Moon

Član broj: 174541
Poruke: 31
*.cpe.vektor.net.



Profil

icon Re: Ogranicenja malloc() funkcije04.03.2008. u 16:39 - pre 173 meseci
Koliko ja znam jedino ogranicenje malloc-a (osim kolicine memorije) jeste to sto kao argument koristi broj tipa size_t, pa ti je maksimalna memorija koju mozes da alociras jednaka najvecem broju koji se moze predstaviti brojem size_t. Velicina sizeof(size_t) zavisi od implementacije i masine, a kod mene je 4.
Jos nesto : postavi source, ako ti nije problem, makar deo koji koristi malloc, i izgled strukture koju si napravio...
 
Odgovor na temu

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Re: Ogranicenja malloc() funkcije04.03.2008. u 18:05 - pre 173 meseci
1. Hvala ti na pomoci. Ovo mi je stvarno vazno za odgonetnuti.
2. Kod mene je sizeof(size_t) 2, ali iskreno neshvatam sta mi to znaci (koliko je to 2 i sta to 2 znaci).
3. Evo mog koda. Znaci da ponovim - prvih 410 alokacija funkcionise, a posle problem.

Code:

#include <stdio.h>
#include <alloc.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
typedef struct cvor
{
char indikator;
char radnik[6];
char nebitno[77];
char neto[14];
char nebitno2[48];
struct cvor *sledeci;
}PODACI;

int main(void)
{
FILE *fptr;
int i=0;
void pisi();
void sumiraj();
PODACI *pocetak,*novi,*pomocni;
pocetak=NULL;
putchar('\n');
fptr=fopen("ldprizar.dbf","r");
fseek(fptr,832,SEEK_SET);
while(i<409)
{
novi=(PODACI *)malloc(sizeof(PODACI));
assert(novi);
fread(novi,sizeof(PODACI),1,fptr);
if(feof(fptr)) goto line;
novi->sledeci=pocetak;
pocetak=novi;
fwrite(pocetak->radnik,sizeof(char)*6,1,stdout);
fwrite(pocetak->neto,sizeof(char)*14,1,stdout);
putchar('\n');
i++;
}
line: fclose(fptr);
getchar();
pisi(pocetak);
pomocni=pocetak;
return(0);
}

void pisi(PODACI *tekuci)
{
putchar('\n');
if(tekuci==NULL)
{
printf("\n\n LISTA JE PRAZNA");
getchar();
return;
}
while(tekuci!=NULL)
{
fwrite(tekuci->radnik,sizeof(char)*6,1,stdout);
fwrite(tekuci->neto,sizeof(char)*14,1,stdout);
putchar('\n');
tekuci=tekuci->sledeci;
}
getchar();
return;
}
 
Odgovor na temu

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Re: Ogranicenja malloc() funkcije04.03.2008. u 21:02 - pre 173 meseci
Pocetnik sam pa pravim velike previde.
Analizirajuci kod programa primetio sam da nigde nisam koristio FREE() funkciju. Mozda mi zato alokacija ne uspeva. Ali tu se radja novi problem za mene - gde staviti FREE(). Ako stavim u while petlju - to nije to.
Ali s druge strane mozda moj prvobitni problem i nije zbog FREE(). U ovom trenutku stvarno ne znam. Zato trebam VAS.
Hvala unapred.
 
Odgovor na temu

POW R TOC H
Dark Side of The Moon

Član broj: 174541
Poruke: 31
*.cpe.vektor.net.



Profil

icon Re: Ogranicenja malloc() funkcije04.03.2008. u 21:10 - pre 173 meseci
Program ne bi trebao ni da pocne da radi. Neznam sa cim kompajliras (ja koristim GCC) ali imas par fatalnih gresaka :
prvo, prototipi funkcija treba da budu na pocetku source fajla, izvan funkcije main.
Drugo, prototip mora u sebi sadrzati tipove argumenata koji ce se koristiti, a kod tebe ih nema :
Code:

void pisi();


Posle toga si pozivao funkciju
Code:

void pisi(PODACI *tekuci)
{
...
}

u kojoj postoji argument tipa "PODACI", sto ne sme da bude tako. Prototip sluzi da kaze kompajleru koji tip podatka da ocekuje kao argument, a ti mu nisi dao nikakvu vrednos, a onda funkciju definisao sa nekim argumentom.
Prototip treba, dakle, da ti izgleda ovako :
Code:

void pisi(PODACI*);
//ILI OVAKO :
void pisi(PODACI *tekuci);
//Kompajleru generalno nije bitno da li si napisao ime argumenta (promenljive) u prototipu,
//Ali mu je bitan tip

Takodje, nesto da znas za u buduce :
ako hoces da napises prototip funkcije koja nema argumente, nemoj koristiti prazne zagrade '()' vec tip void (void)

Jos jedna bitna stvar jeste da gledas da retko koristis goto
Code:

while(i<409)
{
novi=(PODACI *)malloc(sizeof(PODACI));
assert(novi);
fread(novi,sizeof(PODACI),1,fptr);
if(feof(fptr)) goto line;    
novi->sledeci=pocetak;
pocetak=novi;
fwrite(pocetak->radnik,sizeof(char)*6,1,stdout);
fwrite(pocetak->neto,sizeof(char)*14,1,stdout);
putchar('\n');
i++;
}
line: fclose(fptr);
getchar();
pisi(pocetak);
pomocni=pocetak;
return(0);
}

Neznam tacno sta ti je bila namera, ali posle goto skoka, program se ne vraca u 'while' petlju, nego nastavlja dalje.
Ako ti je to i bio cilj, onda si to trebao da stavis kao uslov izvrsavanja petlje, a ako nije, onda si sebi napravio problem
jer goto ne vraca na petlju. Moj predlog je da sve ispod line: stavis u posebnu funkciju, i nju pozoves umesto da pravis bezuslovni skok.
 
Odgovor na temu

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Re: Ogranicenja malloc() funkcije04.03.2008. u 21:33 - pre 173 meseci
1. Koristim TURBO C 2.01.
2. Sto se tice funkcija : literatura koju sam prvu dobio i iz koje sam ucio i stekao (verovatno i lose navike) je OSNOVI PROGRAMIRANJA - MILAN CABARKAPA. Neznam puno o programiranju ali ovaj program sigurno funkcionise. Mozda je to jedan od nacina za koristenje funkcija (prvo se deklarise ispod main() kao na primer void pisi(); i onda se u programu poziva na onaj nacin). Veruj mi svaki programcic koji sam napravio koristeci funkcije na ovaj nacin je radio. Nije mi nepoznata deklaracija i koristenje funkcija na nacin koji si ti naveo i moracu to da promenim svakako.
3. Znam da trebam maksimalno izbjegavati goto i to cu promeniti posle sigurno. Cilj mi je da dobijem bilo kakav kod koji ce raditi ono sto sam zamislio, a posle cu da radim finese. Ipak sam pocetnik i ovo je moj prvi iole ozbiljniji program i sa puno stvari se prvi put susrecem (ucim programiranje u C jeziku tek oko cetiri mjeseca).
4. Nisi mi nista rekao oko malloc() problema a to mi je sada jedino u glavi.
 
Odgovor na temu

POW R TOC H
Dark Side of The Moon

Član broj: 174541
Poruke: 31
*.cpe.vektor.net.



Profil

icon Re: Ogranicenja malloc() funkcije04.03.2008. u 21:47 - pre 173 meseci
Nisam ti rekao jer ne mogu bas da nadjem problem... Ono sto mi pada na pamet jeste da (mozda) taj goto pravi problem izlazeci iz petlje kad ne treba... Vidi to nekako da sredis, ako mozes...
Koliko ja znam, po ANSI standardu, ove stvari se moraju raditi tako... Evo ti par linkova gde to mozes bolje da pogledas :
http://home.att.net/~jackklein/c/standards.html
http://www.jetcafe.org/jim/c-style.html
http://www.ericgiguere.com/articles/ansi-c-summary.html
Ovo je jako dobar FAQ za C:
http://c-faq.com/index.html
 
Odgovor na temu

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Re: Ogranicenja malloc() funkcije04.03.2008. u 21:58 - pre 173 meseci
100% sam siguran da goto nepravi ama bas nikakve probleme. Jedini razlog zasto sam stavio goto je taj sto ako u uslov u while petlji stavim

while(!feof(fptr))
{
code...
}

on mi zadnji podatak u fajlu ispise 2 puta. E to sam hteo da izbegnem. Prvobitno sam napisao kod bez goto ali svejedno, isti problem. Meni nije jasno zasto bas najednom da prestane alocirati. Zasto prvih 410 puta uspije i onda najednom nece.
 
Odgovor na temu

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Re: Ogranicenja malloc() funkcije05.03.2008. u 19:54 - pre 173 meseci
Narode evo upload-ovo sam .dbf bazu s kojom radim. Netrazim da mi neko napise program nego samo da mi ukaze na greske u mom i poneki savet. HVALA.
Prikačeni fajlovi
 
Odgovor na temu

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Re: Ogranicenja malloc() funkcije08.03.2008. u 22:38 - pre 173 meseci
Neceg sam se sjetio u vezi ovog mog programa sto bi moglo biti uzrok problema (a mozda i nemora).
Velicina jedne cjeline koju citam iz fajla je 148 bajta.

char indikator;
char radnik[6];
char nebitno[77];
char neto[14];
char nebitno2[50];

Posto mi pokazivacka promenjiva (potrebna za povezanu listu) zauzima 2 bajta, onda sam ja uradio sledece

char indikator;
char radnik[6];
char nebitno[77];
char neto[14];
char nebitno2[48];
struct cvor *sledeci;

Znaci char nebitno2 sam smanjio (jer mi ti podaci iz fajla nisu potrebni) za dva bajta da bi se velicina strukture uklopila u 148 bajta.
Ako ova modifikacija u ovom programu ne smeta ja stvarno ne znam kako bih ucitao sve podatke (pod uslovom da su mi svi podaci potrebni) u povezanu listu.

Ove stvari me stvarno muce i ne mogu napredovati (stojim u mestu vec neko vreme) dok ovo ne shvatim. Trazim neke literature na netu u vezi ovog problema, ali ne mogu naci (bar za sada). Pomozite.
 
Odgovor na temu

IgorDX
Zagreb

Član broj: 175337
Poruke: 7
*.xnet.hr.



Profil

icon Re: Ogranicenja malloc() funkcije10.03.2008. u 00:19 - pre 173 meseci
> Koristim TURBO C 2.01.

> alokacija radi samo za prvih 409 elemenata (jedan element velicine 148 bajta)

Ima skoro 20 godina od kad sam radio u TurboC-u, ali da probam svejedno,

TC pod DOSom ima one modele ili kako li se zovu, Small, Big, Huge ili tako nekako.
Da nisi izabrao onaj model koji ti daje samo 64K heap size?

409 x 148 je 57.260 a to je opako blizu 64K.

Ja kad sam vidio naslov pomislih da se tu razgovara o OOM Killeru pod linuxom,
al eto TurboC - barem budi uspomene na doba kad sam tek pocinjao.

Igor
 
Odgovor na temu

brankec
Bosanski Brod

Član broj: 140157
Poruke: 161
*.teol.net.



Profil

icon Re: Ogranicenja malloc() funkcije10.03.2008. u 20:49 - pre 173 meseci
Kod mene je bio SMALL MODUL i njega sam promenio u HUGE. Ali i on me muci. broj uspesno alociranim elemenata se povecao na nesto preko 1200 i onda preko te granice program (mislim na TURBO C) se prilikom kompajliranja zaglavi??
Nesto sam na netu nasao u vezi funkcija FARCALLOC i FARMALLOC i alokacije izvan HEAP-a ali iskreno ne znam kako bih sada promenio svoj program pa da mi to funkcionise (za ovo kratko vreme probao sam razne nacine, koliko mi moje trenutno znanje dopusta).

Koje su inace tehnike programiranja u radu sa velikim bazama U C-u.
 
Odgovor na temu

IgorDX
Zagreb

Član broj: 175337
Poruke: 7
88.207.22.*



Profil

icon Re: Ogranicenja malloc() funkcije11.03.2008. u 00:33 - pre 173 meseci
Iskusio si iz prve ruke one sto neki ljudi stavljaju kao SIG na dno poruka: "640K ought to be enough for anybody, Bill Gates".

Kad svladas osnove C-a u TurboC-u makni se sto prije na nesto drugo - VisualStudio, GCC, bilo sto samo ne DOS.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Ogranicenja malloc() funkcije

[ Pregleda: 2531 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

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