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 を保持するようにセットを初期化するにはどうすればよいですか?