1

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;
}

各コマンドのコマンド名と関数ポインターを持つチャートと呼ばれるコマンド構造を定義しました。次に、ループ内で一致するこれらの構造の配列を作成しました。

メイン関数では、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(sets[*letter-'A'] , all_command) のようにメイン関数で関数 ptr_one を呼び出します。このようにして、キャラクターをセットに変換します。

問題は、上記のコードを書いているときに、次のコンパイル エラーが発生したことです。

エラー: ���=���、���、���、���;���、���asm��� または ���<strong>attribute��� が ��� の前にあると予想されます。 ��� トークン

ファイル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��� before ���� で発生しました。 .��� トークン

同様の質問が寄せられていることは知っていますが、私の特定のケースでは役に立たないようです。このセット sets[6] = { {A.array},{B.array},{C.array},{D.array},{E.array},{F.array} } も疲れましたが、そうでしたコンパイルしません。

私の間違いは何ですか? セット A から F を保持するようにセットを初期化するにはどうすればよいですか?

4

0 に答える 0