我正在使用Linux的LXLE 14.04发行版。我想编写一个C程序来读取命令,解释并执行它们。我希望程序高效,我不想使用链表。命令是对集合的操作。每个集合可以包含0到127之间的任何值。我决定将一个集合表示为一个包含128位的字符数组。如果位置pos处的位被打开则数字pos在该组中,并且如果位置pos处的位被关闭,则该组中不存在数字pos。例如,如果位置4的位为1,则数字4出现在集合中,如果位置11的位为1,则数字11出现在集合中。
程序应该读取命令并以某种方式解释它们。有几个命令:read_set,print_set,union_set,intersect_set,sub_set和halt。
例如,终端中的命令read_set A,1,2,14,-1将导致将列表值读入命令中的指定集合。在这种情况下,命令中的指定集是A.列表的末尾用-1表示。因此,在编写此命令后,集合A将包含元素1,2,14。
这是我到目前为止所拥有的。下面是文件set.h
#include <stdio.h>
typedef struct
{
char array[16]; /*Takes 128 bits of storage*/
}set;
extern set A , B , C , D , E , F;
这是文件main.c
#include <stdio.h>
#include "set.h"
#include <string.h>
#include <stdlib.h>
set A , B , C , D , E , F; /*Variable definition*/
set sets[6];
/*Below I want to initialize sets so that set[0] = A set[1] = B etc*/
sets[0].array = A.array;
sets[1].array = B.array;
sets[2].array = C.array;
sets[3].array = D.array;
sets[4].array = E.array;
sets[5].array = F.array;
void read_set(set s,char all_command[])
{
int i, number = 0 , pos;
char* str_num = strtok(NULL,"A, ");
unsigned int flag = 1;
printf("I am in the function read_set right now\n");
while(str_num != NULL) /*without str_num != NULL get segmentation fault*/
{
number = atoi(str_num);
if(number == -1)
return;
printf("number%d ",number);
printf("str_num %c\n",*str_num);
i = number/8; /*Array index*/
pos = number%8; /*bit position*/
flag = flag << pos;
s.array[i] = s.array[i] | flag;
str_num = strtok(NULL, ", ");
if(s.array[i] & flag)
printf("Bit at position %d is turned on\n",pos);
else
printf("Bit at position %d is turned off\n",pos);
flag = 1;
}
}
typedef struct
{
char *command;
void (*func)(set,char*);
} entry;
entry chart[] = { {"read_set",&read_set} };
void (*getFunc(char *comm) ) (set,char*)
{
int i;
for(i=0; i<2; i++)
{
if( strcmp(chart[i].command,comm) == 0)
return chart[i].func;
}
return NULL;
}
int main()
{
#define PER_CMD 256
char all_comm[PER_CMD];
void (*ptr_one)(set,char*) = NULL;
char* comm; char* letter;
while( (strcmp(all_comm,"halt") != 0 ) & (all_comm != NULL))
{
printf("Please enter a command");
gets(all_comm);
comm = strtok(all_comm,", ");
ptr_one = getFunc(comm);
letter = strtok(NULL,",");
ptr_one(sets[*letter-'A'],all_comm);
all_comm[0] = '\0';
letter[0] = '\0';
}
return 0;
}
我定义了一个名为chart的命令结构,它具有每个命令的命令名和函数指针。然后我创建了一个这样的数组 可以在循环内匹配的结构。
在main函数中,我创建了一个名为ptr_one的指针。 ptr_one根据用户输入的命令保存正确函数的值。 问题是,由于用户决定使用哪个集合,我需要将集合表示为某个变量,以便可以将不同的集合发送到函数ptr_one。我想过 在main.c中创建一个数组,如此
set sets[6];
sets[0] = A;
sets[1] = B;
sets[2] = C;
sets[3] = D;
sets[4] = E;
sets[5] = F;
然后在main函数中调用函数ptr_one,如ptr_one(sets [* letter-'A'],all_command)。 这样,我将我的角色转换成一套。
问题是在编写上面的代码时遇到了以下编译错误:
错误:预期 = , , , ; , asm 或 属性 在 . 标记之前
我还在main.c文件中尝试了以下内容。
sets[0].array = A.array;
sets[1].array = B.array;
sets[2].array = C.array;
sets[3].array = D.array;
sets[4].array = E.array;
sets[5].array = F.array;
但我得到了这个编译错误预期 = , , , ; , asm 或 attribute 之前 . 令牌
我知道有类似的问题被提出来,因为他们似乎没有帮助我 具体案例。我厌倦了这套装[6] = {{A.array},{B.array},{C.array},{D.array},{E.array},{F.array}}但它确实不编译。
我的错误是什么?如何初始化集合以便它保存集合A到F?