どなたか教えてください。構造体について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ryusei
記事: 6
登録日時: 5ヶ月前

どなたか教えてください。構造体について

#1

投稿記事 by ryusei » 5ヶ月前

今、双方向の構造体の確認で、本の管理を行うようなプログラムを作っています。

これが途中まで作成したコードです。

//
#include <stdio.h>
#include <string.h>

#define MAX_ORDER 10
#define buf_size 80

//構造体を定義
struct list{
int book_number;
char title[buf_size];
int *next;
int *back;
};


//構造体に値を登録
void INSERT(struct list *book_list[], int insert_num)
{
//配列の要素数
int num = insert_num;
printf("inputs number is %d!\n", insert_num);
char buf[buf_size];

printf("bookname is enter\n");
fgets( buf, sizeof(buf), stdin);
book_list[num]->title = 1;
printf("%s\n", book_list[num]->title);

}

int main()
{
struct list book_list[20];
int i, insert_num, select_num;
insert_num = 0;
select_num = 0;
char buf[buf_size];
printf("order number is %d\n\n", MAX_ORDER);

puts("order select\n 1.INSERT\n 2.deldete\n 3.delete_first\n 4.delete_last\n");

for( i = 0; i < MAX_ORDER - 1; i++){
puts("enter_num->");
gets( buf );
sscanf( buf, "%d" , &select_num);
if(select_num == 0) {
puts("enter is number");
return -1;
} else {
switch (select_num) {
case 1:
INSERT(book_list, insert_num++);
break;
case 2:
//delete();
break;
case 3:
//delete_first();
break;
case 4 :
//delete_last();
break;
default:
puts("process error");
}
}
}

return 0;
}

//

この中のINSERT関数のなかで、構造体メンバのtitleに対して
fgets関数で入力したbufの値をセットしようとしたら

エラー: assignment to expression with array type
とでます。

なぜでしょうか?

だれか教えてください。

アバター
みけCAT
記事: 6225
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: どなたか教えてください。構造体について

#2

投稿記事 by みけCAT » 5ヶ月前

それっぽいコードが提示されていないので断定はできませんが、
エラーメッセージ通り、strcpy関数ではなく代入演算子で値をセットしようとしたからではないでしょうか?

p.s.
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

littlestream
記事: 33
登録日時: 3年前

Re: どなたか教えてください。構造体について

#3

投稿記事 by littlestream » 5ヶ月前

27行目の
*(book_list[num])->title = 1;

34行目の
struct list *book_list[20];にしたら一応動きはしましたが、何をしたいのかよく分からないのと
これは構造体を使ったリスト処理に似ているなと思いました。

ryusei
記事: 6
登録日時: 5ヶ月前

Re: どなたか教えてください。構造体について

#4

投稿記事 by ryusei » 5ヶ月前

回答して下さった方ありがとうございます。
もう一度自分で勉強しなおしてみます。

アバター
みけCAT
記事: 6225
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: どなたか教えてください。構造体について

#5

投稿記事 by みけCAT » 5ヶ月前

littlestream さんが書きました:
5ヶ月前
27行目の
*(book_list[num])->title = 1;
しまった、確かにここ(の元のコード)は配列に代入していて、提示されたエラーメッセージが出そうですね。
bufが関係していないので、見落としました。
申し訳ありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: どなたか教えてください。構造体について

#6

投稿記事 by かずま » 5ヶ月前

ryusei さんが書きました:
5ヶ月前
エラー: assignment to expression with array type
とでます。

なぜでしょうか?
このエラーメッセージから、ryuseiさんの使っているコンパイラは
gcc だということが分かります。

メッセージを直訳すると、「配列型を持つ式への代入」となります。

 book_list[num]->title = 1;

代入演算子 = の左辺は「book_list[num]->title」という式です。
その式の型ですが、
book_list や num という変数を []演算子や ->演算子で評価した結果、
構造体のメンバ title の型になります。

char title[buf_size]; ですから、title の型は配列です。
配列の要素の型は char です。
char型の変数には 'a' や '#' などの文字を代入できますが、
'a' や '#' も実は 97 や 35 といった小さな整数値なのです。

char c; という宣言があれば、c = 1; という代入は実行できます。
char t[80]; という宣言があれば、t[0] = 1; という代入も OKです。
でも、char t[80]; で t = 1; という代入はできません。
配列型の式や変数に何かを代入することはできません。

以上の説明で納得できましたか?

双方向リストの構造体についての説明がほしいですか?

ryusei
記事: 6
登録日時: 5ヶ月前

Re: どなたか教えてください。構造体について

#7

投稿記事 by ryusei » 5ヶ月前

返信遅くなってすみません。
とても分かりやすい説明ありがとうございます。
結論、代入するものとされるものの型を揃える
必要があるということで間違いないでしょうか?

双方向リストの構造体についての説明がほしいですか?
->これについては大丈夫です。
 自分でやってみてまたわからなければ、別途質問記入してみようと思います。
かずま さんが書きました:
5ヶ月前
ryusei さんが書きました:
5ヶ月前
エラー: assignment to expression with array type
とでます。

なぜでしょうか?
このエラーメッセージから、ryuseiさんの使っているコンパイラは
gcc だということが分かります。

メッセージを直訳すると、「配列型を持つ式への代入」となります。

 book_list[num]->title = 1;

代入演算子 = の左辺は「book_list[num]->title」という式です。
その式の型ですが、
book_list や num という変数を []演算子や ->演算子で評価した結果、
構造体のメンバ title の型になります。

char title[buf_size]; ですから、title の型は配列です。
配列の要素の型は char です。
char型の変数には 'a' や '#' などの文字を代入できますが、
'a' や '#' も実は 97 や 35 といった小さな整数値なのです。

char c; という宣言があれば、c = 1; という代入は実行できます。
char t[80]; という宣言があれば、t[0] = 1; という代入も OKです。
でも、char t[80]; で t = 1; という代入はできません。
配列型の式や変数に何かを代入することはできません。

以上の説明で納得できましたか?

双方向リストの構造体についての説明がほしいですか?

かずま

Re: どなたか教えてください。構造体について

#8

投稿記事 by かずま » 5ヶ月前

ryusei さんが書きました:
5ヶ月前
結論、代入するものとされるものの型を揃える
必要があるということで間違いないでしょうか?
int や char や double などの基本型や、ポインタや構造体型の
変数には代入できますが、「配列型の変数」には代入できません
ということです。

コード:

	int a[3] = { 1, 2, 3 };
	int b[3] = { 4, 5, 6 };
	a = b;  // <-- 型は同じなのにエラー
代入演算子のオペランドの型が異なる場合でも、右辺の値を
左辺の型に変換する暗黙のルールがある場合は代入できます。

コード:

	int i = 97;
	char c;
	double d;
	c = i;
	d = i;

ryusei
記事: 6
登録日時: 5ヶ月前

Re: どなたか教えてください。構造体について

#9

投稿記事 by ryusei » 5ヶ月前

わかりやすい回答ありがとうございます。
納得できました。

また質問させていただく時があると思うので、
その時はよろしくお願いします


返信

“C言語何でも質問掲示板” へ戻る