C中不兼容的枚举类型

时间:2011-09-30 04:49:57

标签: c arrays enums typedef enumeration

我对枚举和数组有疑问。基本上我有一个枚举“BIT”的数组声明为枚举类型“单词”。

typedef enum {
ZERO = (uint8_t) 0, ONE = (uint8_t) 1
} BIT;

typedef BIT word[16];

正如我所解释的那样,“word”只是一个由16个BIT组成的预定义数组。但是,当我尝试分配一个声明的单词时,我只是得到一个错误,说不兼容的类型单词和BIT。

BIT ten = ZERO;
word Bob;
Bob[10] = ten;

我是否只能用另一个单词写入Bob这个词,我会想,因为“word”是一个“BIT”数组,我可以简单地将一个位分配给“word”数组中的一个位置。

2 个答案:

答案 0 :(得分:0)

我认为问题在于您尝试在文件范围内的函数作用域之外执行Bob[10] = ten;赋值。你不能这样做。在文件范围内,您无法自由地索引事物,并且您不能使用除常量值之外的任何值初始化变量,10不是其中之一。

现在,我有点模糊,为什么以下不想编译(使用gcc 3.4.4和Open Watcom 1.9):

typedef enum {
ZERO = 0, ONE = 1
} BIT;

typedef BIT word[16];

const BIT ten = ZERO;

word Bob =
{
  ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
  ZERO, ZERO, ten, ZERO, ZERO, ZERO, ZERO, ZERO
};

int Bob2[] =
{
  ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO,
  ZERO, ZERO, ten, ZERO, ZERO, ZERO, ZERO, ZERO
};

int main(int argc, char** argv)
{
  return 0;
}

两个编译器都说Bob [10]和Bob2 [10]没有用常量初始化。

答案 1 :(得分:0)

上下文

问题的一个版本包括代码:

  

源文件logic.c

#include "logic.h"
void word_not(word *R, word *A)
{
    for (int i = 0; i<16; i++)
    {
        if ((A+i))
            {*(R+i) = ZERO;}
        else
            {*(R+i) = ONE; }
    }
}
     

头文件logic.h

#ifndef LOGIC_H_
#define LOGIC_H_

#include <stdint.h>

/**
 * Basic element of the LC-3 machine.
 *
 * BIT takes on values ZER0 (0) or ONE (1)
 */
typedef enum {
ZERO = (uint8_t) 0, ONE = (uint8_t) 1
} BIT;

/**
* A 16-"BIT" LC-3 word in big-endian format
*/
typedef BIT word[16];

void word_not(word *R, word *A);

#endif

问题说明

问题是word_not()的参数是指向数组的指针。内部的符号必须相应调整:

void word_not(word *R, word *A)
{
    for (int i = 0; i < 16; i++)
    {
        if ((*A)[i])
            (*R)[i] = ZERO;
        else
            (*R)[i] = ONE;
    }
}

虽然你可以更简洁地写出:

void word_not(word *R, word *A)
{
    for (int i = 0; i < 16; i++)
        (*R)[i] = !(*A)[i];
}

或者,您可以简单地将该功能重新定义为:

void word_not(word R, word A)
{
    for (int i = 0; i < 16; i++)
    {
        if (A[i])
            R[i] = ZERO;
        else
            R[i] = ONE;
    }
}

或者,再次,更简洁,如:

void word_not(word R, word A)
{
    for (int i = 0; i < 16; i++)
        R[i] = !A[i];
}

可编译的测试用例 - 输出

0: 1 1 1 1
1: 0 0 0 0
0: 1 1 1 1
1: 0 0 0 0
1: 0 0 0 0
0: 1 1 1 1
1: 0 0 0 0
0: 1 1 1 1
0: 1 1 1 1
0: 1 1 1 1
1: 0 0 0 0
1: 0 0 0 0
1: 0 0 0 0
1: 0 0 0 0
0: 1 1 1 1
0: 1 1 1 1
sizeof(BIT) = 4; sizeof(word) = 64

可编译的测试用例 - 源

#include "logic.h"

void word_not_1(word *R, word *A)
{
    for (int i = 0; i < 16; i++)
    {
        if ((*A)[i])
            (*R)[i] = ZERO;
        else
            (*R)[i] = ONE;
    }
}

void word_not_2(word *R, word *A)
{
    for (int i = 0; i < 16; i++)
        (*R)[i] = !(*A)[i];
}

void word_not_3(word R, word A)
{
    for (int i = 0; i < 16; i++)
    {
        if (A[i])
            R[i] = ZERO;
        else
            R[i] = ONE;
    }
}

void word_not_4(word R, word A)
{
    for (int i = 0; i < 16; i++)
        R[i] = !A[i];
}

#include <stdio.h>

int main(void)
{
    word in =
    {
        ZERO,  ONE, ZERO, ONE,
        ONE,  ZERO, ONE,  ZERO,
        ZERO, ZERO, ONE,  ONE,
        ONE,  ONE,  ZERO, ZERO,
    };
    word out1;
    word out2;
    word out3;
    word out4;

    word_not_1(&out1, &in);
    word_not_2(&out2, &in);
    word_not_3(out3, in);
    word_not_4(out4, in);

    for (int i = 0; i < 16; i++)
        printf("%d: %d %d %d %d\n", in[i], out1[i], out2[i], out3[i], out3[i]);

    printf("sizeof(BIT) = %zu; sizeof(word) = %zu\n", sizeof(BIT), sizeof(word));
    return 0;
}