構造体について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
okiru

構造体について

#1

投稿記事 by okiru » 14年前

構造体について質問です。
構造体に格納した個人情報を年齢の高い順に表示するのですが
うまくいきません。
エラー内容を調べるとsort関数の
stu = (p+i);
(p+i) = (p+i-1);
(p+i-1) = stu;
の部分に問題点があるようなのですが
構造体とポインタにおいてまだ理解が不十分なので
説明とともに本来の解答を教えていただけないでしょうか

コード:

#include <stdio.h>

struct student{
char name[20];
int age;};

void sort(struct student *p){
 struct student *stu;
 int i;
 for(i=3;i>0;i--){
  if((p+i)->age > (p+i-1)->age){
   stu = (p+i);
   (p+i) = (p+i-1);
   (p+i-1) = stu;
  }
 }
}

int main(void){
struct student s[] = {{ "Daniel", 7 }, { "Michael", 3 }, { "Ethan", 2 }, { "Joshua", 6 }};
sort(s);
return 0;
}

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 構造体について

#2

投稿記事 by beatle » 14年前

okiru さんが書きました: エラー内容を調べるとsort関数の
stu = (p+i);
(p+i) = (p+i-1);
(p+i-1) = stu;
の部分に問題点があるようなのですが
構造体とポインタにおいてまだ理解が不十分なので
説明とともに本来の解答を教えていただけないでしょうか
コンパイルエラーが出るならそのエラーメッセージをきちんと貼り付けてくださいね。これはフォーラムルールです。

説明の都合上、今回は僕が代わりに貼り付けます。

コード:

main.c: In function 'sort':
main.c:13:10: error: lvalue required as left operand of assignment
main.c:14:12: error: lvalue required as left operand of assignment
このエラーを日本語に訳すと「代入の左辺として、左辺値が必要です」という感じになります。
何を言ってるかというと、代入の左辺には変数を書け!ということです。

以下のコードがおかしいのは分かりますか?

コード:

int x = 0;
(x + 1) = 100;
(x + 1)というのは、xの値に1を足した値を表しますが、(x + 1)自体は変数ではありません。そんな名前の変数、ないでしょう?
okiruさんのプログラムで発生している問題も、xが単にポインタ型になっただけで、基本は同じ問題です。

初級者
記事: 200
登録日時: 15年前

Re: 構造体について

#3

投稿記事 by 初級者 » 14年前

コード:

/*
 * 字下げ(インデント)に、明確なポリシーを持ちましょう。
 * せっかくソートしたのだから、結果を出力しましょう。
 */

#include <stdio.h>

#define SZ(a) (sizeof(a) / sizeof(a[0]))

typedef struct student {
    char name[20];
    int age;
} student;

void sort(student *stu, int size)
{
    student t;
    int i, j;

    for (i = 0; i < size-1; i++) {
        for (j = i + 1; j < size; j++) {
            if (stu[i].age < stu[j].age) {
                t = stu[i], stu[i] = stu[j], stu[j] = t;
            }
        }
    }
}

void print(student *stu, int size)
{
    int i;

    for (i = 0; i < size; i++) {
        printf("%s %d\n", stu[i].name, stu[i].age);
    }
}

int main(void)
{
    student s[] = {
        { "Daniel",  7 },
        { "Michael", 3 },
        { "Ethan",   2 },
        { "Joshua",  6 },
    };

    sort(s, SZ(s));
    print(s, SZ(s));
    return 0;
}

閉鎖

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