我对枚举和数组有疑问。基本上我有一个枚举“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”数组中的一个位置。
答案 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;
}