構造体の配列変数を引数として関数に渡すにはどうしたらいいのでしょうか?

[戻る]
kenta 2001/08/08(水) 20:27:40
二度目の投稿となるkentaです。
質問の通り、構造体の配列変数を引数として関数に渡したいのですが、
VC++でコンパイルしようとすると、どうしてもコンパイルエラーになってしまいます。
以下がその現象を再現したコードです。

#include <stdio.h>

struct HOGE {
    int a;
    int b;
};
int foo(HOGE* hoge[], int idx);

int main()
{
    struct HOGE hoge[20];

    printf("%d", foo(&hoge, 0));

    return 0;
}

int foo(HOGE* hoge[], int idx)
{
    return hoge[idx]->a + hoge[idx]->b;
}

初歩的は質問ですみません。

kenta 2001/08/08(水) 20:58:14
説明不足でした。
先ほどのコードは、main関数内で宣言されたhogeを、foo関数内で操作したい、という意図があります。
すみません。

ららら 2001/08/09(木) 00:06:53
int foo(HOGE* hoge, int idx)
{
    return hoge[idx].a + hoge[idx].b;
}

printf("%d", foo(hoge, 0));

で、どうでしょう。

TURITURI 2001/08/09(木) 00:12:11
なんかちょっと変です。
試してないですが多分いけると思うのを書いときました。

#include <stdio.h>

struct HOGE {
    int a;
    int b;
};
int foo(HOGE* hoge, int idx);  ←[]はいるのかな(あってもいいのかも。自分はいっつも書かないので)

int main()
{
    struct HOGE hoge[20];

    printf("%d", foo(hoge, 0)); ←&いらない 配列だからhoge自体がポインタ

    return 0;
}

int foo(HOGE* hoge, int idx)  ←[]はいるのかな(あってもいいのかも。自分はいっつも書かないので)

{
    return hoge[idx]->a + hoge[idx]->b;
}

これでいいじゃないかなぁと思うのですがはずしてたらごめんなさい。

コンパイルエラーのときはどういうエラーか書いとくと答えるほうも答えやすいです。はい。

Bun 2001/08/09(木) 00:12:38
Bunです。
kentaさん、初めまして。

> 初歩的は質問ですみません。
いえ、こういう基本は大事ですから、がんばって理解してください。

*** 定義 **************

struct HOGE {
    int a;
    int b;
};

struct HOGE hoge[10];

***********************

(解1)
fooの引数の数が変わりましたけど、処理内容は同じですね。

hoge[0].a = 1;
hoge[0].b = 2;
int n = foo(&hoge[0]); // これは foo(hoge);でもOK

int foo(HOGE *hp)
{
    return hp->a + hp->b;

}

とするとnには3が入ります。

===============================================================
(解2)

呼び出し側

hoge[1].a = 1;
hoge[1].b = 2;
int n = foo(&hoge[0], 1); // これは foo(hoge, 1)でもOK

呼ばれる側
int foo(HOGE h[], int idx)
{
    return h[idx].a +  h[idx].b;

}

===============================================================
(解3)

呼び出し側

hoge[2].a = 3;
hoge[2].b = 4;
int n = foo(&hoge[0], 2); // これは foo(hoge, 2)でもOK

呼ばれる側
int foo(HOGE *hp, int idx)
{
    return (hp + idx)->a +  (hp + idx)->b;

}

とするとnには7が入ります。

参考になりましたか?
ほんじゃ、わしゃ、寝まっせ。Zzz。

Bun 2001/08/09(木) 00:15:33
うぅ。TURITURIさんに27秒負けた。がくっ。
ほんとーに、ねまっす。Zzz。

kenta 2001/08/09(木) 02:47:46
kentaです。
Bunさんのおっしゃった解3のとおりにコーディングしたところ、無事に思い通りの動作をしました。


> コンパイルエラーのときはどういうエラーか書いとくと答えるほうも答えやすいです。はい。

すみません。次回からは気をつけます。


>> 初歩的は質問ですみません。
>いえ、こういう基本は大事ですから、がんばって理解してください。

不安がほぐれました。ありがとうございます。


らららさん、TURITURIさん、Bunさん、どうもありがとうございました。

kenta 2001/08/09(木) 02:49:09
[[解決]]
チェックを入れ忘れました。
無事に解決です。
どうもありがとうございました。

たーぼ 2001/08/09(木) 14:05:35
はじめまして、ターボです。
便乗質問させてください。

解2 引数は配列
int foo(HOGE h[], int idx)
{
    return h[idx].a +  h[idx].b;

}

解3 引数はポインタ
int foo(HOGE *hp, int idx)
{
    return (hp + idx)->a +  (hp + idx)->b;

}

↓

解2 引数は配列
int foo(HOGE h[], int idx)
{
//    return h[idx].a +  h[idx].b;
    return (h + idx)->a +  (h + idx)->b;
}

解3 引数はポインタ
int foo(HOGE *hp, int idx)
{
//    return (hp + idx)->a +  (hp + idx)->b;
    return hp[idx].a +  hp[idx].b;
}

というように変えても動いちゃいますよね。
(たしかめてないですけど)

これは、やはり好みとかの問題なのですか?
ポインタはポインタとして扱う。配列は配列として扱いたいから
ですか。
それとも、なにか問題が起こるとか...

すいません。初歩的なことですが気になったのでお願いします。

Bun 2001/08/09(木) 19:09:51
> ポインタはポインタとして扱う。配列は配列として扱いたいから
> ですか。

はい、私は
ポインタはポインタとして扱う。配列は配列として扱いたいからです。(見栄え?よく)

> それとも、なにか問題が起こるとか...
起こらないと思います。(多分)

すんません。細かいことは、わからんっす。

たーぼ 2001/08/10(金) 00:40:07
>はい、私は
>ポインタはポインタとして扱う。配列は配列として扱いたいからです。(見栄え?よく)
そうですか。すっきりしました。ありがとうございます。

古いスレッドには追加発言できません。