Программирование видео игр
Необходимо 64000 байт оперативной памяти. Все, что мог пепробовал (malloc,farmalloc,_dos_allocmem) ничего не помогает, может настройки надо изменить, что делать не знаю, помогите чем можите.
Ты под DOSом работаешь? На чем и какую модель компиляции используешь? Скорее всего надо huge.
Работаю под DOS. Все модели перепробовал, ничего не получилось... Может быть, еще какие-нибудь настройки мешают?
Покажи код - как выделяешь.
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <alloc.h>
#include <stdlib.h>
#include <io.h>
#define SCREEN_WIDTH 320L
#define SCREEN_HEIGHT 200L
#define OLL 64000L
typedef struct pcx_header_type
{
char manufacturer;
char version;
char encoding;
char bits_per_pixel;
int x,y;
int width,height;
int horz_res;
int vert_res;
char ega_palette[48];
char reserved;
char num_color_planes;
int bytes_per_line;
int palette_type;
char padding[58];
} pcx_header, * pcx_haeader_ptr;
typedef struct RGB_color_type
{
unsigned char red;
unsigned char green;
unsigned char blue;
} RGB_color, * RGB_color_ptr;
typedef struct pcx_picture_type
{
pcx_header header;
RGB_color palette[256];
char far * buffer;
} pcx_picture, * pcx_picture_ptr;
void Set_Palette_Register(int index,RGB_color_type * str_color)
{
outp(0x3C6,0xFF);
outp(0x3C8,index);
outp(0x3C9,str_color->red);
outp(0x3C9,str_color->green);
outp(0x3C9,str_color->blue);
};
void disp_install(int mode)
{
_asm{ mov AH,0;
mov AL,byte ptr mode;
int 0x10;
end }
};
void disp_pixel(int x,int y,unsigned char color)
{
*((unsigned char far *)0xA0000000L+320*y+x)=color;
};
void PCX_Load(char * filename, pcx_picture_ptr image,int enable_palette)
{
FILE * fp,* f;
int num_bytes,index;
long count;
unsigned char data;
char far * temp_buffer;
fp = fopen(filename,"rb");
for (index = 0; index < 128; index++)
{
temp_buffer[index] = fgetc(fp);
};
count = 0;
while (count <= OLL)
{
data = fgetc(fp);
if ((data >= 192)&&(data <= 255))
{
num_bytes = data-192;
data = fgetc(fp);
while (num_bytes > 0)
{
image->buffer[count] = data;
count++;
num_bytes--;
};
}
else
{
image->buffer[count] = data;
count++;
};
};
fseek(fp,-768L,SEEK_END);
for (index = 0; index < 256; index++)
{
image->palette[index].red = (getc(fp) >> 2);
image->palette[index].green = (getc(fp) >> 2);
image->palette[index].blue = (getc(fp) >> 2);
};
fclose(fp);
if (enable_palette)
{
for (index = 0; index < 256; index++)
{
Set_Palette_Register(index,(RGB_color_ptr)&image->palette[index]);
};
};
};
void main()
{
long count;
pcx_picture pcx_handle;
clrscr();
pcx_handle.buffer = (char far *)malloc(OLL);
if (pcx_handle.buffer == NULL)
{
printf("\ncouldn't allocate screen buffer");
getch();
exit(0);
};
disp_install(0x13);
PCX_Load("C:\\4_lom.pcx",(pcx_picture_ptr)&pcx_handle,1);
for (count = 0; count < OLL; count++)
{
disp_pixel(count%320,count/320,pcx_handle.buffer[count]);
};
getch();
disp_install(0x03);
};
Декодирует PCX - файл. C:\4_lom.pcx. В целом работает правильно, а как дело доходит до выделения памяти и записи в нее накрывается. Попробую про MCB почитать, правда с трудом представляю что это...
Цитата:
#define OLL 64000L
попробуй также
Код:
pcx_handle.buffer = (char far *)calloc(OLL,1);
Попробовал, все то же... Вылетает при выделении памяти :-(
У тебя вообще 24-битный режим поддерживается, многие современные видеокарты не поддерживают его. Например когда у меня был Radeon9800 Pro он не работал в этом режиме, так что можеи дело просто в видеокарте:)
Зачем тебе вообще эти 24 бита, это неудобно и медленно
Скорее всего, дело не в видео карте. Даже при простом выделении памяти возникают ошибки...