gpt4 book ai didi

c - memcpy 什么都不做

转载 作者:行者123 更新时间:2023-12-04 15:18:06 27 4
gpt4 key购买 nike

我试图将双缓冲放入我的 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 数据指针只能引用默认数据段中的东西,而 VGA 帧缓冲区位于此默认数据段之外。虽然您将变量 VGA 正确定义为远指针,但当您将此指针传递给 memcpy 时,它会被转换为近指针,因为 memcpy 需要一个void * 作为第一个参数。由于您使用的是近数据模型 void * 是近指针类型。

要解决此问题,您应该使用函数 _fmemcpy 而不是将 void far * 指针作为参数,这样您的 VGA 指针就赢了' 转换为近指针。

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

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

您还应该注意并修复有关在没有原型(prototype)的情况下调用函数的警告,因为正确的原型(prototype)函数允许编译器警告上述可疑指针转换。

关于c - memcpy 什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63950594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com