memcpy什么都不做

alabdaly891

我试图在我的VGA dos程序中添加双缓冲,但是当我使用memcpy函数时似乎出现了问题。

我确定我分配了所需的内存,但似乎无法正常工作。

这是程序:

#include <dos.h>
#include <string.h>
unsigned char* doublebuffer;
unsigned char far* VGA = (unsigned char far*) 0xA0000000L;
void setmode(int mode)
{
   union REGS regs;
   regs.h.ah = 0x0;
   regs.h.al = mode;
   int86(0x10, &regs, &regs);
}

void main()
{
    doublebuffer =(unsigned char *) malloc(320*200);

    setmode(0x13);
    VGA[9*320+11] = 0x41;
    doublebuffer[9*320+10] = 15;
    if(doublebuffer[9*320+10]  != 15)
    {
     exit(1);
    }
    memcpy(VGA, doublebuffer, 320*200);
    getch();
}

malloc 可以正常运行,因为程序不会崩溃并且缓冲区接受颜色,但是memcpy似乎不起作用,因为屏幕上没有任何内容。

当我直接写入VGA地址时,它可以工作。(11,9)上会有一个粉红色像素,但(10,9)上没有白色像素

罗斯里奇

您的问题是您大概是在使用Near数据模型进行编译,例如默认情况下数据指针接近的微小存储模型。Near数据指针只能引用默认数据段中的内容,而VGA帧缓冲区位于此默认段的外部。在将变量正确定义VGA为远指针时,将其传递memcpy给近指针时,因为memcpyvoid *第一个参数设为as,所以将其转换为近指针由于您使用的是Near数据模型,因此void *是Near指针类型。

要解决此问题,您应该改用_fmemcpyvoid far *指针作为参数的函数,这样您的VGA指针就不会转换为Near指针。

您还应该注意编译器警告。您的编译器应已通过以下消息警告您有关此问题的信息:

Warning: test.c 24: Suspicious pointer conversion in function main

您还应该留意并修复有关没有原型就调用函数的警告,因为正确原型化的函数可以使编译器对上述可疑指针转换发出警告。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章