構造体の配列変数を引数として関数に渡すにはどうしたらいいのでしょうか? – プログラミング – Home

構造体の配列変数を引数として関数に渡す...
 
通知
すべてクリア

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


kenta
 kenta
(@kenta)
ゲスト
結合: 24年前
投稿: 6
Topic starter  

二度目の投稿となる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
 kenta
(@kenta)
ゲスト
結合: 24年前
投稿: 6
Topic starter  

説明不足でした。
先ほどのコードは、main関数内で宣言されたhogeを、foo関数内で操作したい、という意図があります。
すみません。


返信引用
ららら
(@admin-rarara)
メンバー Admin
結合: 5年前
投稿: 119
 

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

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

で、どうでしょう。


返信引用
TURITURI
 TURITURI
(@TURITURI)
ゲスト
結合: 23年前
投稿: 3
 

なんかちょっと変です。
試してないですが多分いけると思うのを書いときました。

#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
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

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
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

うぅ。TURITURIさんに27秒負けた。がくっ。
ほんとーに、ねまっす。Zzz。


返信引用
kenta
 kenta
(@kenta)
ゲスト
結合: 24年前
投稿: 6
Topic starter  

kentaです。
Bunさんのおっしゃった解3のとおりにコーディングしたところ、無事に思い通りの動作をしました。

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

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

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

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

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


返信引用
kenta
 kenta
(@kenta)
ゲスト
結合: 24年前
投稿: 6
Topic starter  

チェックを入れ忘れました。
無事に解決です。
どうもありがとうございました。


返信引用
たーぼ
 たーぼ
(@たーぼ)
ゲスト
結合: 23年前
投稿: 5
 

はじめまして、ターボです。
便乗質問させてください。

解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
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

> ポインタはポインタとして扱う。配列は配列として扱いたいから
> ですか。

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

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

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


返信引用
たーぼ
 たーぼ
(@たーぼ)
ゲスト
結合: 23年前
投稿: 5
 

>はい、私は
>ポインタはポインタとして扱う。配列は配列として扱いたいからです。(見栄え?よく)
そうですか。すっきりしました。ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました