1. ホーム
  2. コンパイラ言語
  3. C

構造体の配列--[エラー] '['トークンの前に一次式があることが予想される

2022-01-21 08:42:34

<スパン 時間節約ヘルパー : 構造体配列のアクセス、代入などのエラー報告についてです。Error] expected primary-expression before '[' tokenが報告された原因です。[Error] expected primary-expression before '[' token.

構造体の配列に値を代入する際に発生するコンパイルエラーは、本当は基本的な概念に過ぎないのですが、Baiduを開いて検索すると、ヘッダーなどに関する複雑な記述がたくさん出てくるので、慣れるまで大変でした。そこで、問題を再掲してみました。

理由:typedef 構造体の中で、配列 stu[10] はエイリアスとして扱われるため。

回避策 typedefを削除するか、以下の方法で構造体の配列を定義してください。


<スパン 詳細 

主な理由は、やはり構造体型に不慣れなことです。

最初の定義方法(学生専用の情報テーブルを作る場合)。

struct student 
{
		long stuid;
		char name[10];
		int age;
		int score;
}stu[10];
	
stu[1].stuid=1; //This way you can assign values to the elements in the array, simply written like this.


for(int i=0;i<10;i++) //Input assignment to the defined array of structs
{
	scanf("%d %c%d%d",&stu[i].stuid,&stu[i].name,&stu[i].age,&stu[i].score);
		 
}

2つ目の定義方法(生徒用と先生用の情報シートを作成する場合)。

typedef struct infomation  
	{
		long stuid;
		char name[10];
		int age;
		int score;
	}infor; // alias, if you don't add typedef, then the meaning is "infor is a structure variable"
                                
	
	infor student[40]; //assume 40 students and 5 teachers, so that everyone's information can be set.
	infor teacher[5]; 


別の書き方で書く を使えば、より明確に見ることができます。

struct infomation //information is the name of the structure, also called the "label" of the structure
	{
		long stuid;
		char name[10];
		int age;
		int score; //member of the structure
	};
	
	struct infomation student[40]; //structure variable
	struct infomation teacher[5]; 

 間違った書き方

この定義方法では,構造体型を定義する際に,すでに構造体変数を infor として定義しています.この場合、名前情報を持つ構造体型(構造体テンプレート)は、使用できる変数が infor の1つだけです。そのため、inforの後にstudent変数を追加すると、この時点ではinforの後に追加できるのはメンバー名だけなので、エラーを報告することになります。そして、最初の文にある typedef を追加する場合、infor は information の別名です。 

キーワード typedef は、すでに存在するデータ型の別名を定義する。

データ型は、以下のように分けられます。 基本データ型 カスタム)データ型の構築 (他にもいろいろな名称があります)。

基本的なデータ型は、int , float , double , void , char の5つです。

構成要素:構造体型、配列型、ポインタ型、列挙型、共有型、など。

 多くの記事やビデオで、仕様書では3つの定義方法が示されていますが、struct型、structタグ、structメンバ、struct変数、typedefの役割を理解すれば、それらを覚える必要は全くありません。

(ご批判をお願いします)