ページ 11

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

Posted: 2019年5月02日(木) 18:31
by ryusei
今、双方向の構造体の確認で、本の管理を行うようなプログラムを作っています。

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

//
#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
とでます。

なぜでしょうか?

だれか教えてください。

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

Posted: 2019年5月02日(木) 21:49
by みけCAT
それっぽいコードが提示されていないので断定はできませんが、
エラーメッセージ通り、strcpy関数ではなく代入演算子で値をセットしようとしたからではないでしょうか?

p.s.
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

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

Posted: 2019年5月02日(木) 21:51
by littlestream
27行目の
*(book_list[num])->title = 1;

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

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

Posted: 2019年5月02日(木) 23:08
by ryusei
回答して下さった方ありがとうございます。
もう一度自分で勉強しなおしてみます。

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

Posted: 2019年5月02日(木) 23:18
by みけCAT
littlestream さんが書きました:
3ヶ月前
27行目の
*(book_list[num])->title = 1;
しまった、確かにここ(の元のコード)は配列に代入していて、提示されたエラーメッセージが出そうですね。
bufが関係していないので、見落としました。
申し訳ありません。

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

Posted: 2019年5月03日(金) 21:31
by かずま
ryusei さんが書きました:
3ヶ月前
エラー: 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: どなたか教えてください。構造体について

Posted: 2019年5月06日(月) 10:21
by ryusei
返信遅くなってすみません。
とても分かりやすい説明ありがとうございます。
結論、代入するものとされるものの型を揃える
必要があるということで間違いないでしょうか?

双方向リストの構造体についての説明がほしいですか?
->これについては大丈夫です。
 自分でやってみてまたわからなければ、別途質問記入してみようと思います。
かずま さんが書きました:
3ヶ月前
ryusei さんが書きました:
3ヶ月前
エラー: 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: どなたか教えてください。構造体について

Posted: 2019年5月06日(月) 12:45
by かずま
ryusei さんが書きました:
3ヶ月前
結論、代入するものとされるものの型を揃える
必要があるということで間違いないでしょうか?
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;

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

Posted: 2019年5月13日(月) 23:58
by ryusei
わかりやすい回答ありがとうございます。
納得できました。

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

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

Posted: 2019年5月14日(火) 09:19
by Math
viewtopic.php?f=3&t=20628 と同様に”勘違い”をされていますね。

http://www.cs.shinshu-u.ac.jp/Lecture/P ... ist-2.html
をよくご覧ください