//a pointer to the first block of screen
int far *SCR = (int far *) 0xB8000000;
(SCR + 6 * 80 + 31) += "HELLO HELLO HELLO";
在上面的代码中,我定义了SCR
,它是指向文本模式下屏幕第一个块的指针。它工作正常,我可以在文本模式下在屏幕上写如下:
#define WHITE 3840
*(SCR + 6 * 80 + 31) = 'h' + WHITE;
*(SCR + 6 * 80 + 32) = 'e' + WHITE;
*(SCR + 6 * 80 + 33) = 'l' + WHITE;
*(SCR + 6 * 80 + 34) = 'l' + WHITE;
*(SCR + 6 * 80 + 35) = 'o' + WHITE;
但是当我想在屏幕上写一些东西时,当我尝试写下面的内容时,我看到下面代码中最后一行的Lvalue required
错误:
#define WHITE 3840
for(int i = 31; i < 36; i++)
*(SCR + 6 * 80 + i) = WHITE;
(SCR + 6 * 80 + 31) += "hello";
为什么我无法访问上面的指针以及如何使用我定义的指针SCR
编写长单词和句子来解决问题?
答案 0 :(得分:2)
你做不了类似的事情:
(SCR + 6 * 80 + 31) += "hello";
因为"hello"
是一个指向char
数组的指针,该数组已使用字符'h'
,'e'
,'l'
等进行初始化。你不能添加指针指针(即使你被允许也不会对你的问题有意义。)
如果要将字符串输出到SCR
指向的位置加上一些偏移量,请编写一个函数以减少它的痛苦。这就是函数的用途:
void write_to_screen( int row, int col, char const* s, int attr)
{
int offs = row * 80 + col;
for (;*s != 0; ++s) {
SCR[offs++] = attr | *s;
}
}
// call it like so:
write_to_screen( 6, 30, "hello", WHITE);
或类似的东西(你可能需要调整其中的细节以及如何写入属性和字符,因为我不记得在实模式下写入屏幕缓冲区的细节。)
答案 1 :(得分:0)
#define WHITE 3840
char *hello = "hello";
for (int i = 0; hello[i]; i++) {
*(SCR + 6 * 80 + 31 + i) = WHITE + hello[i];
}