dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

MALLOC 2 - memory allocation error

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
Marcina



Joined: 15 Aug 2006
Posts: 26
Location: Rīga

PostPosted: Fri Oct 27, 2006 2:19 pm    Post subject: MALLOC 2 - memory allocation error

Izveidojot vienkāršu progu, radās problēma - tā rod 100000 floatu. Ja te proga beigtos - tā normāli aizvērtos! Taču, ja turpina veikt JEBKĀDU operāciju ar tiem, proga vairs nevar aizvērties automātiski - memory allocation error!
Taču interesanti ir tas, kāpēc rezultāts tomēr tika dots un ir absolūti pareizs! Kāpēc proga uzkaras?

int main(void)
{
FILE *out;
float h,*at;
long int j;
clrscr();


if ((out = fopen("G:\\float.rez", "w")) == NULL)
{
printf("DAT");
return 1;
}

if ((at = (float *) malloc(100000l * sizeof(float)))==NULL) // Te kļūdu nemet ārā!
{
printf("Error at\n");
exit(1);
}


at[0]=0.34*99999.0f; // Veiktās operācijas!
for(j=0;j<100000l;j++)
{
at[j]=at[0];
fprintf(out,"%f\n",at[j]);
}

return 0;
}
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Fri Oct 27, 2006 2:34 pm    Post subject:

Man tava programma strādā kā vajag. Aizpildīja masīvu un nenokārās.
Tev kurā rindiņā programma nokarās (apskaties debugerī).

A tu kādu executabli taisi - DOS vai Windows? Tb Turbo C vai kautkādu Borland Builderi lieto? Jo DOSā nevar izdalīt atmiņu vairāk par 64KB ar parastiem līdzekļiem.

Jā un vēl viens bugs - atmiņu vajag atbrīvot programmas beigās! Ar free() fju. Tāpat arī failu vajag aizvērt programmas beigās! Ar fclose() fju.
Back to top
View user's profile Send e-mail
Marcina



Joined: 15 Aug 2006
Posts: 26
Location: Rīga

PostPosted: Fri Oct 27, 2006 2:44 pm    Post subject:

Progu šoreiz jātaisa Borland c++ for Dos
Jā, zinu, ka nevar izdalīt vairāk kā 64KB uz segmentu...
Un lieta tāda, ka tā izpilda itin visu, taču negrib aizvērties.
Esmu dzirdējis, ka it kā jāraksta tādos gadījumos
float huge *at;
bet nelīdzēja...
ko nu...
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Fri Oct 27, 2006 3:20 pm    Post subject:

Ja gribi darīties ar tik lieliem floatu masīviem, tad iesaku pāriet uz Windows (vai Linux). Nav vērts DOSā čakarēties, ja nav īpaši nepieciešams. Ar Borland C++ neesmu īpaši darbojies, tapēc nemācēšu tev pateikt vai tur vispār var darboties ar vienu masīvu virs 64Kb robežas. Vēl var padomāt, par masīva glabāšanu failā - tādu kā virtuālo atmiņu realizēt. Un uzrakstīt pašam funkcijas, kas pielādē attiecīgo elementu no diska (ja vajag lasīt masīva elementu), un saglabā tajā (ja vajag ierakstīt masīvā kādu vērtību).

Ja tik tiešām ir nepieciešams strādāt DOSā, tad iesaku apskatīt DJGPP - tas ir GNU GCC ports zem DOS. Tā kompilētas programmas darbojās 32-bit aizsargātajā režīmā, tāpēc ar atmiņas daudzumu nebūs problēmas (tb atļaus taisīt lielumlielos masīvus).
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group