设置结构的一个成员变量似乎正在改变另一个

时间:2013-09-23 02:59:18

标签: c flags

这是关于编译器的课程。

我正在调用此代码:

struct attribute attr = {.token = token, .buffer = *buffer, .length = length, .format = format};
fprintf(stdout, "after struct: %d\n", data.flags);
data.attributes[i] = attr;
fprintf(stdout, "after data.attributes[i] = attr: %d\n", data.flags);

来自这个原型的函数:

int attribute( int token, char *buffer, unsigned int length, int format);

它转到这个结构:

#define DATA    struct data
DATA
{
//define the scanner attribute table
#define MAX_ATTRIBUTES  128
    ATTRIBUTE attributes[MAX_ATTRIBUTES];
    unsigned int index;
    int column;
    int flags;
#define FLAGS_ECHO      0x0001
#define FLAGS_DEBUG     0x0002
#define FLAGS_PARSE     0x0004
#define FLAGS_SYMBOL    0x0008
#define IS_FLAGS_ECHO(a)    (a & FLAGS_ECHO)    
#define SET_FLAGS_ECHO(a)   (a |= FLAGS_ECHO)
#define CLR_FLAGS_ECHO(a)   (a &= ~FLAGS_ECHO)
#define IS_FLAGS_DEBUG(a)   (a & FLAGS_DEBUG)   
#define SET_FLAGS_DEBUG(a)  (a |= FLAGS_DEBUG)
#define CLR_FLAGS_DEBUG(a)  (a &= ~FLAGS_DEBUG)
#define IS_FLAGS_PARSE(a)   (a & FLAGS_PARSE)   
#define SET_FLAGS_PARSE(a)  (a |= FLAGS_PARSE)
#define CLR_FLAGS_PARSE(a)  (a &= ~FLAGS_PARSE)
#define IS_FLAGS_SYMBOL(a)  (a & FLAGS_SYMBOL)
#define SET_FLAGS_SYMBOL(a) (a |= FLAGS_SYMBOL)
#define CLR_FLAGS_SYMBOL(a) (a &= ~FLAGS_SYMBOL)
};

ATTRIBUTE结构在这里:

#define ATTRIBUTE       struct attribute
ATTRIBUTE{
    int token;
#define MAX_BUFFER_SIZE     128
    char buffer[MAX_BUFFER_SIZE];
    int length;
#define FORMAT_NONE         0
#define FORMAT_CHAR         1
#define FORMAT_DECIMAL      2
#define FORMAT_HEXIDECIMAL  3
#define FORMAT_OCTAL        4
#define FORMAT_FLOAT        5
    int format;
};

问题在于,当我第一次调用第一位代码时,data.flags的值会从8重置为0.

所有的格式和(至少看似我)过度使用宏都是教授的,所以我没有改变它们。

有谁知道为什么会发生这种情况?如果您需要的信息比我提供的更多,请告诉我。

编辑:

似乎问题很可能来自我确定i

的地方
for(i = sizeof(data.attributes)/sizeof(data.attributes[0]) - 1; i >= 0; i--){
    if(&(data.attributes[i]) != NULL) break;
}

问题已回答编辑:

感谢从Zan Lynx的回答中获得的信息,我发现除了我一直在做的方式之外,我需要在这样的地方初始化属性数组的元素:

int i;
struct attribute null_attr = {.token = -1, .format = -1, .length = -1};
for(i = 0; i < sizeof(data.attributes)/sizeof(data.attributes[0]); i++){
    data.attributes[i] = null_attr;
}

然后检查最早的未初始化属性,如下所示:

for(i = sizeof(data.attributes)/sizeof(data.attributes[0]) - 1; i >= 0; i--){
    if(data.attributes[i].token != -1
      && data.attributes[i].length != -1
      && data.attributes[i].format != -1)
    break;
}

1 个答案:

答案 0 :(得分:1)

如果可能的话,我们真的需要在单个代码文件中使用可重现的示例。也许发布一些链接到一些编译在ideone.com上的代码?

如果i为0时确实发生了这种情况(请验证),那么我猜你的struct属性在不同的编译单元中被定义为不同的大小。这可能吗?

我之前在其他代码中看到过它并没有引起混乱。在其他代码中,它是由#define符号引起的,该符号在不同的Makefile中获取了不同的值。

I decided to do it myself.