今、双方向の構造体の確認で、本の管理を行うようなプログラムを作っています。
これが途中まで作成したコードです。
//
#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: どなたか教えてください。構造体について
それっぽいコードが提示されていないので断定はできませんが、
エラーメッセージ通り、strcpy関数ではなく代入演算子で値をセットしようとしたからではないでしょうか?
p.s.
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
エラーメッセージ通り、strcpy関数ではなく代入演算子で値をセットしようとしたからではないでしょうか?
p.s.
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
- 記事: 48
- 登録日時: 7年前
Re: どなたか教えてください。構造体について
27行目の
*(book_list[num])->title = 1;
と
34行目の
struct list *book_list[20];にしたら一応動きはしましたが、何をしたいのかよく分からないのと
これは構造体を使ったリスト処理に似ているなと思いました。
*(book_list[num])->title = 1;
と
34行目の
struct list *book_list[20];にしたら一応動きはしましたが、何をしたいのかよく分からないのと
これは構造体を使ったリスト処理に似ているなと思いました。
Re: どなたか教えてください。構造体について
しまった、確かにここ(の元のコード)は配列に代入していて、提示されたエラーメッセージが出そうですね。
bufが関係していないので、見落としました。
申し訳ありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: どなたか教えてください。構造体について
このエラーメッセージから、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: どなたか教えてください。構造体について
返信遅くなってすみません。
とても分かりやすい説明ありがとうございます。
結論、代入するものとされるものの型を揃える
必要があるということで間違いないでしょうか?
双方向リストの構造体についての説明がほしいですか?
->これについては大丈夫です。
自分でやってみてまたわからなければ、別途質問記入してみようと思います。
とても分かりやすい説明ありがとうございます。
結論、代入するものとされるものの型を揃える
必要があるということで間違いないでしょうか?
双方向リストの構造体についての説明がほしいですか?
->これについては大丈夫です。
自分でやってみてまたわからなければ、別途質問記入してみようと思います。
かずま さんが書きました: ↑5年前このエラーメッセージから、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: どなたか教えてください。構造体について
int や char や double などの基本型や、ポインタや構造体型の
変数には代入できますが、「配列型の変数」には代入できません
ということです。 代入演算子のオペランドの型が異なる場合でも、右辺の値を
左辺の型に変換する暗黙のルールがある場合は代入できます。
Re: どなたか教えてください。構造体について
わかりやすい回答ありがとうございます。
納得できました。
また質問させていただく時があると思うので、
その時はよろしくお願いします
納得できました。
また質問させていただく時があると思うので、
その時はよろしくお願いします
Re: どなたか教えてください。構造体について
viewtopic.php?f=3&t=20628 と同様に”勘違い”をされていますね。
http://www.cs.shinshu-u.ac.jp/Lecture/P ... ist-2.html
をよくご覧ください
http://www.cs.shinshu-u.ac.jp/Lecture/P ... ist-2.html
をよくご覧ください