Инициализация массива структуры в 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?

0 ответов

Другие вопросы по тегам