memcpy 什么都不做
memcpy doesn't do anything
我试图将双缓冲放入我的 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, ®s, ®s);
}
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 数据指针只能引用默认数据段中的东西,而 VGA 帧缓冲区位于此默认数据段之外。虽然您将变量 VGA
正确定义为远指针,但当您将此指针传递给 memcpy
时,它会被转换为近指针,因为 memcpy
将 void *
作为第一个参数.由于您使用的是近数据模型 void *
是近指针类型。
要解决此问题,您应该使用函数 _fmemcpy
而不是将 void far *
指针作为参数,因此您的 VGA
指针不会被转换为近指针。
您还应该注意编译器警告。您的编译器应该已通过如下消息警告您此问题:
Warning: test.c 24: Suspicious pointer conversion in function main
您还应该注意并修复有关调用没有原型的函数的警告,因为正确的原型函数允许编译器警告上述可疑指针转换。
我试图将双缓冲放入我的 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, ®s, ®s);
}
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 数据指针只能引用默认数据段中的东西,而 VGA 帧缓冲区位于此默认数据段之外。虽然您将变量 VGA
正确定义为远指针,但当您将此指针传递给 memcpy
时,它会被转换为近指针,因为 memcpy
将 void *
作为第一个参数.由于您使用的是近数据模型 void *
是近指针类型。
要解决此问题,您应该使用函数 _fmemcpy
而不是将 void far *
指针作为参数,因此您的 VGA
指针不会被转换为近指针。
您还应该注意编译器警告。您的编译器应该已通过如下消息警告您此问题:
Warning: test.c 24: Suspicious pointer conversion in function main
您还应该注意并修复有关调用没有原型的函数的警告,因为正确的原型函数允许编译器警告上述可疑指针转换。