编辑:已解决。 unsigned char修复了它。
我遇到了一个家庭酿造库的问题,该库本应该仿效vga 80x25终端,以便我可以处理一些糟糕的操作系统逻辑。每当我调用s_init()
时,它都会完全重置标志字符char,并重新初始化我的缓冲区。
我的目标是仅在第一次调用s_put_char
时才调用#include <stdio.h>
//this is so I can start coding logic without having to build a cross-compiler
//the only s_* method that should access by external code is s_put_char(char,int)
//all methods beginning with s_* are referring to the screen output
#define s_rows 25
#define s_columns 80
#define s_buffer_size 2000 //80x25 = 2000
char flags = 0;
//first bit is if the screen is inited or not.
char s_buffer[s_buffer_size]; //80x25
void s_update()
{
system("cls");
printf(s_buffer);
}
void s_init()
{
int index = 0;
while(index < s_buffer_size)
{
//s_buffer[index] = ' ';
index++;
}
flags += 128; //flip first bit
s_update;
}
void s_put_char(char c, unsigned int index)
{
if(flags < 128){ s_init(); }
//checks to see if the first bit is flipped or not.
//if first bit not flipped, then screen needs to be inited
s_buffer[index] = c;
s_update();
}
。
我的代码:
mv: cannot move ‘/home/me/.nvm/bin/node-v0.12.7-linux-x64’ to ‘/home/me/.nvm/versions/v0.12.7’: No such file or directory
Binary download failed, trying source.
我的规格:Mingw + Msys,Win 8
答案 0 :(得分:3)
在s_init()
:
s_update;
应该是
s_update();
不应该吗?
此外 - 由于flags
是签名字符 -
flags < 128
总是如此。
尝试将flags
定义为unsigned char
。
编辑:
实际上 - 正如@KeithThompson所指出的那样 - char
可能表现为有符号或无符号,具体取决于实现。
答案 1 :(得分:2)
根据编译器的不同,char
的范围与signed char
或unsigned char
的范围相同。如果char flags
的行为类似signed char flags
,则其范围通常为-128到127.因此,如果它以值0开始,则向其添加128将溢出并变为-128。因此,每次调用flags
时,s_init()
变量都会在值0和-128之间翻转。这两个值均小于128,因此s_put_char()
始终会调用s_init()
。
unsigned char
的范围通常为0到255,因此请改用它。
答案 2 :(得分:0)
使用明确的flags ^= 0x80
,(flags & 0x80) != 0
和unsigned char
。就目前而言,128是char
中的符号位,被解释为-128,因此flags < 128
始终为真,0和-128。