我的全局变量不断重新定义自己

时间:2015-09-03 16:03:31

标签: c initialization global

编辑:已解决。 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

3 个答案:

答案 0 :(得分:3)

s_init()

    s_update;

应该是

    s_update();

不应该吗?

此外 - 由于flags是签名字符 -

flags < 128 

总是如此。

尝试将flags定义为unsigned char

编辑:

实际上 - 正如@KeithThompson所指出的那样 - char可能表现为有符号或无符号,具体取决于实现。

答案 1 :(得分:2)

根据编译器的不同,char的范围与signed charunsigned 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) != 0unsigned char。就目前而言,128是char中的符号位,被解释为-128,因此flags < 128始终为真,0和-128。