5

好的,所以我在使用 IDE Turbo C++ 3.0 时尝试在模拟环境(DosBox)中应用双缓冲技术我正在运行 Windows 7 64 位(不确定这是否重要)并且我不知道如何正确执行缓冲例程在这种环境下。

我遇到的主要问题是我似乎无法执行以下赋值语句:

double_buffer = (byte_t far*)farmalloc((unsigned long)320*200);

(请注意,320 和 200 是屏幕尺寸)...我只是为分配获得 NULL。

我尝试将 DosBox 的默认 RAM 使用更改为 32 而不是 16,但这并没有做任何事情。我不确定是模拟器还是 Turbo C 的代码有问题。(请注意,它符合得很好)。

这是我在网上找到的一个示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <alloc.h>

typedef unsigned char byte_t;

byte_t far* video_buffer = (byte_t far*)0xA0000000;

void vid_mode(byte_t mode){
    union REGS regs;
    regs.h.ah = 0;
    regs.h.al = mode;
    int86(0x10,&regs,&regs);
}

void blit(byte_t far* what){
    _fmemcpy(video_buffer,what,320*200);
}

int main(){

    int x,y;
    byte_t far* double_buffer;

    double_buffer = (byte_t far*)farmalloc((unsigned long)320*200);
    if(double_buffer == NULL){
        printf("sorry, not enough memory.\n");
        return 1;
    }
    _fmemset(double_buffer,0,(unsigned long)320*200);

    vid_mode(0x13);

    while(!kbhit()){
        x = rand()%320;
        y = rand()%200;
        double_buffer[y * 320 + x] = (byte_t)(rand()%256);
        blit(double_buffer);
    }

    vid_mode(0x03);
    farfree(double_buffer);
    return 0;
}
4

1 回答 1

3

您的问题与在 Turbo-C IDE 调试器中运行您的应用程序有关。如果您编译它然后退出 IDE 并在没有 IDE 的情况下直接从 DosBox 命令行运行它,它应该可以按预期工作。

通过 IDE 运行时,默认调试选项是仅为程序的堆分配额外的 64KiB 内存。这不足以处理您对 64000 字节 (320*200) 的请求。在 Turbo-C IDE 下拉options菜单中,单击debugger。您应该得到一个如下所示的屏幕:

在此处输入图像描述

的默认值为Program Heap Size64。将其更改为最大 640,然后单击Ok。重新运行您的程序,它应该在随机位置的显示器上显示随机颜色的像素。

于 2019-08-29T21:00:52.707 回答