Инициализация массива структуры в C
Я использую LXLE 14.04 дистрибутив Linux. Я хочу написать 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 в терминале вызовет считывание значений списка в указанный набор в команде. В этом случае указанным набором в команде является А. Конец списка представлен -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, в которой есть имя команды и указатель функции для каждой команды. Затем я создал массив этих структур, которые могут быть сопоставлены в цикле.
В основной функции я создал указатель с именем 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;
А затем вызовите функцию 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?