|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
Marcina
Joined: 15 Aug 2006 Posts: 26 Location: Rīga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
Marcina
Joined: 15 Aug 2006 Posts: 26 Location: Rīga
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
|
|
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
|