【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21934

構造体とアロー演算子の使い方について
投稿者---ayama(2005/07/15 16:43:28)


データの最大と最小を求めるプログラムをつくりたいのですが、
構造体を関数に渡すときに、ポインタを使ったのですが、ポインタを使うと"メンバが定義されていません"というエラーが、関数内のポインタを使った部分全部に出るのですがどうしたらいいでしょうか。
*をはずすと通りますが目的の最小のデータを表示することができません。

プログラムは、

typedef struct heikin{
int x;
double data;
}heikin;
void keisan(int n,struct heikin *d,struct heikin *ma,struct heikin *y,double *a);

keisan(N,dt,&max,&min,ave);
       ・
       ・
       ・
void keisan(int n,struct heikin *d, struct heikin *ma,struct heikin *y,double *a){
int i,j;
double w,x=0.0,z;
for(j=0;j<n;j++){
for(i=0;i<n;i++){
if((d+i)->data<(d+i+1)->data){
w=(d+i)->data;
(d+i)->data=(d+i+1)->data;
(d+i+1)->data=w;
z=(d+i)->x;
(d+i)->x=(d+i+1)->x;
(d+i+1)->x=z;}}
for(i=0;i<n;i++){
x+=(d+i)->data;}
*a=x/n;
ma->x=d->x;
ma->data=d->data;
y->x=(d+n-1)->x;
y->x=(d+n-1)->data;}
という感じなのですが、どこが悪いのでしょうか?




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体とアロー演算子の使い方について 21939 まきじ 2005/07/15 18:07:45
<子記事> Re:構造体とアロー演算子の使い方について 21957 shu 2005/07/16 00:09:24


No.21939

Re:構造体とアロー演算子の使い方について
投稿者---まきじ(2005/07/15 18:07:45)


>void keisan(int n,struct heikin *d,struct heikin *ma,struct heikin *y,double *a);
>keisan(N,dt,&max,&min,ave);

dt は配列と推察させて頂きました。
配列とすれば、keisan() で heikin *d と受け取るのは問題ありません。
但し、メンバの参照方法に問題があります。
参照方法は、d[i].data あるいは *(d + i).data です。

あと、typedef してるので、struct heikin ではなく、
heikin で良いのでは?


この投稿にコメントする

削除パスワード

No.21940

Re:構造体とアロー演算子の使い方について
投稿者---まきじ(2005/07/15 18:13:45)


>参照方法は、d[i].data あるいは *(d + i).data です。

*(d + i).data を (*(d + i)).data に訂正。


この投稿にコメントする

削除パスワード

No.21941

Re:構造体とアロー演算子の使い方について
投稿者---円零(2005/07/15 19:03:25)


別に(d + i)->dataでも構わないのでは?

とは言え、貼りつけられたコード範囲内では、おかしい部分は
a->x = d->x;
(ma->x = d->x;の間違いではないでしょうか)、
y->x = (d + n - 1)->data;
(y->data = (d + n - 1)->data;の間違いではないでしょうか)
くらいしか見当たらなかったので、
おそらくは貼られていない部分に間違いがあるのでしょう。

(尤も、いきなり放り出されている
keisan(N,dt,&max,&min,ave);
は謎なんですが意図もよくわからないので見なかったことに)


この投稿にコメントする

削除パスワード

No.21945

Re:構造体とアロー演算子の使い方について
投稿者---まきじ(2005/07/15 20:10:01)


>別に(d + i)->dataでも構わないのでは?

はい、構いませんでした(^^;

>a->x = d->x;
>(ma->x = d->x;の間違いではないでしょうか)

a->x = d->x; の様な行はみあたりませんが?
*a=x/n; の次の行の事なら、ma->x=d->x; となっていますよ。


この投稿にコメントする

削除パスワード

No.21958

Re:構造体とアロー演算子の使い方について
投稿者---円零(2005/07/16 01:21:30)


>>a->x = d->x;
>>(ma->x = d->x;の間違いではないでしょうか)
>
>a->x = d->x; の様な行はみあたりませんが?
>*a=x/n; の次の行の事なら、ma->x=d->x; となっていますよ。

私が自分の手元で見やすいようにインデント入れてたときに消してしまったようです。
すみません。無視しちゃってください。


この投稿にコメントする

削除パスワード

No.21973

Re:構造体とアロー演算子の使い方について
投稿者---ayama(2005/07/16 17:29:31)


いろいろと試してみてうまくいくように出来ました。
お答えありがとうございました。


この投稿にコメントする

削除パスワード

No.21957

Re:構造体とアロー演算子の使い方について
投稿者---shu(2005/07/16 00:09:24)


>データの最大と最小を求めるプログラムをつくりたいのですが、

データを並べ替えてしまえば、
最終的には、配列の始めと終わりに、最大と最小が入っていることになる。

…平均を求める処理は、並べ替えとは関係無いので、別処理にすることを勧める。

void heikin_sort( int n, struct heikin d[] )
{
    struct heikin swap;
    int i, j;
    
    for (i = 0; i < (n - 1); i++)
     for (j = 0; j < (n - i - 1); j++)
        if (d[j]->data < d[j + 1]->data)
           swap = d[j],
           d[j] = d[j + 1],
           d[j + 1] = swap;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧