我是C的新手,它是继Java之后的第二种高级编程语言.我已经掌握了大部分基础知识,但无论出于何种原因,我无法将单个字符写入屏幕内存.
该程序使用Turbo C for DOS编译,运行速度为120mhz的Am486-DX4-100.该显卡是使用Trio32芯片的非常标准的VLB Diamond Multimedia Stealth SE.
对于操作系统,我运行的PC-DOS 2000加载了ISO代码页.我正在使用标准的MDA/CGA/EGA/VGA 80列文本模式运行.
这是我编写的程序:
#include <stdio.h>
int main(void) {
unsigned short int *Video = (unsigned short int *)0xB8000;
*Video = 0x0402;
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,我对C很新,所以如果我的错误显而易见,我道歉,我无法找到一个可以理解的如何做到这一点的可靠来源.
据我所知,在x86平台上的实模式下,文本模式的屏幕内存从0xB8000开始.每个字符存储在两个字节中,一个用于字符,一个用于背景/前景.我的想法是将值0x0402(应该是一个红色的笑脸)写入0xB8000.这应该放在屏幕的左上角.
我已经考虑了屏幕可能滚动的可能性,因此在执行时会立即以两种方式删除我的角色.要解决此问题,我尝试过:
我可以读取并打印我写入内存的值,所以它显然仍然在内存中,但无论出于何种原因,我都没有在屏幕上显示任何内容.我显然做错了,但我不知道会出现什么问题.如果需要任何其他细节,请询问.感谢您提供任何可能的帮助.
与正面相比,为什么任何数据类型的范围在负面都比较大?
例如,在整数的情况下:
在Turbo C的它的范围是-32768
要32767
和Visual Studio的是-2147483648
要2147483647
.
其他数据类型也是如此......
[UPD:为Visual Studio设置适当的限制值]
我总是发现有些人(大多数来自印度)正在使用turbo C.我找不到任何理由使用这种过时的编译器...但我不知道在试图告诉他们使用现代编译器时给出的理由是什么( GCC,MSVC,...).
我想知道公司使用的当前标准C编译器是什么.我知道以下编译器,并不了解哪一个用于学习目的.
我现在正在学习C并参考K&R书.
任何人都可以指导我使用哪个编译器?
I'm an occasional C programmer. I've come across this bit of inline assembly code in a Turbo C program
#define ADC(dst,src) { asm MOV AX, dst; asm ADD AX, src; \
asm ADC AX, 0; asm MOV dst, AX; }
Run Code Online (Sandbox Code Playgroud)
dst and src are both unsigned 16-bit integers.
It won't compile in GNU C++. Could someone please explain what it's doing? TIA!
让我们说我们上课了
class A
{
int x;
public:
void sayHi()
{
cout<<"Hi";
}
};
int main()
{
A *a=NULL;
a->sayHi();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将在Turbo C(我测试过的地方)上编译并Hi
作为输出打印.
我原以为a
是因为崩溃了NULL
.sayHi()
它说,如果我将功能虚拟化,那就更多了
Abnormal temination(Segmentation fault in gcc)
Run Code Online (Sandbox Code Playgroud)
我知道很多都是依赖于实现的,但是如果有人可以对任何实现有所启发,或者只是给出一个概述它会非常好.
在C中,如何写入特定的内存位置,例如视频内存b800,在DOS(真实DOS,MS DOS 6.22)
我知道C没有内置任何内容来做到这一点,但可能有一些特定的平台,例如DOS特定的API函数可以.
一个小的演示程序,它会很棒.
我有Turbo C(TCC.EXE - 不是小编译器,Turbo C编译器)
我知道调试可以做到这一点(例如我知道的-f b800:0 FA0 21 CE
一些微调) (将一些感叹号写入命令行).但我想要一个C程序写入b800:0
我只是想知道是否有一种方法可以使指针数组指向多维数组整数中每行的第一列.例如,请查看以下代码:
#include <stdio.h>
int day_of_year(int year, int month, int day);
main()
{
printf("Day of year = %d\n", day_of_year(2016, 2, 1));
return 0;
}
static int daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int day_of_year(int year, int month, int day)
{
int leap;
int *nlptr = &daytab[0][0];
int *lpptr = &daytab[1][0];
int *nlend = nlptr + month;
int …
Run Code Online (Sandbox Code Playgroud) 每当我编译我的程序时,我都会得到上面的错误.
在多项选择测试中提出了一个问题:以下程序的输出结果如何:
#include <stdio.h>
int main(void)
{
int a = 10, b = 5, c = 2;
printf("%d %d %d\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并且选择是10,5和2的各种排列.出于某种原因,它适用于我们在大学时使用的Turbo C++.但是,在使用gcc(在启用-Wall时发出警告)或clang(启用了-Wformat并在默认情况下发出警告)或在Visual C++中编译时,它不会.正如预期的那样,输出是垃圾值.我的猜测是它与Turbo C++是16位,在32位Windows XP上运行这一事实有关,或者TCC在标准方面很糟糕.