
C言語で2次元配列を戻り値として返したいです。基礎的な質問で申し訳ありません。 ...
2017/10/1617:59:51
C言語で2次元配列を戻り値として返したいです。基礎的な質問で申し訳ありません。
C言語で2次元配列を戻り値として返し、その後違う関数に渡したいです。
今作成中のプログラムが、大体下記みたいな感じになっています。
void main(){
int i, j;
a( i, j ); //?
b( X,H[][] ); //?
}
void a( int i, int j ){
int A[100][200];
int X;
「 iとjを利用しfor 構文でA[][]に値を格納済み。
int XにA[][]の最大値を格納済み。」
}
void b (???){
「ここで配列A[][]の値とXの値を使用したい。」
}
今ここで実現したい事は関数aで求めた配列A[][]とXをmainに戻り値として返し、その後関数bで使用したいです。
Xに関してはポインタを利用すれば、出来そうなのですが配列に関してはどう戻り値として返したらいいか全く分かりません。
???のところを埋めるように教えて頂けるようお願い致します。
ベストアンサーに選ばれた回答
2017/10/1619:05:36
このままでは、どうやっても関数a()のA[][]を関数b()に渡すことはできません。
A[][]はローカル変数なので、関数a()からmain()に戻った時点で、A[][]はもう有効ではありません。単純にポインタを戻しても、実態はなくなっています。xは戻り値として、返せば良いでしょう。
これを実現する方法は幾つかありますが、一番簡単なのはA[][]をmain()で確保して、関数a()に渡して値を格納後、関数b()に渡せば良いでしょう。
int a(int i, int j, int A[100][200])
{
int x;
/* A[][]に値を格納 */
return x; /* xの値を返す */
}
void b(int x, int A[100][200])
{
/* A[][] を使う */
}
int main()
{
int A[100][200];
int i, j;
int x;
x = a(i, j, A);
b(x, A);
}
-
質問者
2017/10/1620:47:13
回答ありがとうございます。
今は戻り値がxだけですが、yが増えて複数になった場合に備えて
なるべくreturnを使用したくないのですが、
ポインタで返したい場合は以下のソースコードでいけますか?
int a(int i, int j, int A[100][200],int *x)
{
/* A[][]に値を格納 */
*x = 「整数」;
}
void b(int x, int A[100][200])
{
/* A[][] を使う */
}
int main()
{
int A[100][200];
int i, j;
int x;
a(i, j, A,&x);
b(x, A);
}
返信を取り消しますが
よろしいですか?
- 取り消す
- キャンセル
ベストアンサー以外の回答
1〜4件/4件中
- 並び替え:回答日時の
- 新しい順
- |古い順
2017/10/1718:39:48
いろいろやり方は考えられますが、Cで一番ふつーにそれを書くとしたら、
関数の呼び出し元で配列の格納領域を確保してそれを(そのポインタを)関数に渡し、書き込ませる
でしょう。
int main(void){//教科書的、というかC規格に登場する普遍的なmainはこれ
int i, j;
int a[100][200];
int X=a( i, j, a );
b(X,a);
return 0;
}
int a( int i, int j, int array[][200] ){
int max;
for(int ii=0;ii<i;ii++){
for(int jj=0;jj<j;j++){
array[ii][j]=func(ii,j);//とかなんとか配列の要素を設定
}
}
//最大値を求めて
return max;
}
付帯する情報が増えたとして、構造体にまとめれば返り値でコピー渡しも出来るのですが、やはりコピーのコストを嫌って呼び出し元で変数領域を確保して
//構造体定義
struct st{
int a[100][200];
int max,min;
};
int main(void){
struct st A;
a( &A);
b( &A);
retrun 0;
}
void a(struct st* arg){
for(int ii=0;ii<i;ii++){
for(int jj=0;jj<j;j++){
arg->a[ii][j]=func(ii,j);
}
}
int max,min;
//最大値を求めて
arg->max=max;
//最小値を求めて
arg->min=min;
}
とかやるかなぁ。
2017/10/1623:27:37
2017/10/1619:22:11
2017/10/1618:55:04
(1)
ひとまとまりとして扱いたいデータは構造体としてまとめるのがよいでしょう。
typedef struct _Data
{
int A[100][200];
} Data;
みたいな形で。
あとは、Data 型を関数の引数にしたり、戻り値にしたり。
(2)
ただ、関数の引数も戻り値もコピー渡しなので、
大きなサイズのデータも全体をコピーします。
それが大きな無駄になる可能性もあります。
それを避けたい場合は、引数に Data のポインター(Data* 型) を渡す。
戻り値の場合もポインターを返す。
(3)
ただ、
一時変数のポインターを戻り値として返す形だと
一時変数が破棄され、無効な領域のポインターを扱うバグが生じます。
なので、
malloc(sizeof(Data));
で割り当てたメモリに Data 型のデータを構築して返すのがいいでしょう。
ただし、malloc したメモリを誰が free するかはきちんと設計する必要があります。
小さいプログラムなら、メモリリークが起こっても気にならないかもしれませんが、
まあ、作法として。
(4)
ひとまとまりのデータを構造体にする考え方になれれば、
自然と class 的な発想、C++的な発想、オブジェクト指向的な発想につながりそうです。
class は構造体に関係する関数もくっつけたようなものですから。
この構造体に、メモリ管理の機能までくっつけたいな、
そういうことを C++ なら実現できます。
返信を取り消しますが
よろしいですか?
- 取り消す
- キャンセル
あわせて知りたい
- C言語で関数から2次元配列を返してmain関数で使えるようにしたいです。 1次元配...
- C言語の自作関数で定義した配列を戻り値で返す ことはできますかポインタとかを...
- C言語で使用する変数名の最大文字数とはいくらまででしょうか?
- ダブルクリックの仕様を教えて下さい。 始めのクリックの何秒後~何秒後にクリッ...
- OpenCVをCmakeでビルドしようとしているのですが、なかなかうまくできずに困って...
- float型とdouble型の計算速度はどちらが速いですか? 精度のビット数によって変わ...
- C言語に関して質問です。 以下のプログラムは2行2列の行列2つの積を求めるプ...
- 「フラグを立てる」の反対語は何ですか?
- C#で多次元配列に戻り値として配列を代入したいのですが、構文を教えて下さい str...
- 鉄とアルミ どちらが剛性高いですか??
- c言語でfgets関数でエンターキーのみが入力されるまでループを続けるプログラムを...
- 【100枚】【C言語】2次元配列に文字列を代入したいのですがうまく代入できません...
- 変数の初期化は必ず必要なのでしょうか? 初期化されていない変数には、不定値が...
- C#配列の質問です。一次元の配列を二次元に変換したいのですが、そのようにすれば...
- よく顔がキモいと言われます。 俺はキモいんだなと自覚して生きてます。俺はいわ...
- 途中参加の対義語はなんですか?
- あかさたなはまやらわん を通称なんといいますか?
- C言語での多次元配列の初期化 多次元配列を同じ値で初期化するために、以下のよう...
- オナニーを止められません おすすめのオナニー方法を教えてください
- c言語で「もし配列が空なら~」,「もし配列に何かデータが入っているなら~」 ...
このカテゴリの回答受付中の質問
- イギリスの物理学者ティム・バーナーズ=リーが著した"Weaving the Web"(邦題:W...
- VRoidからMMDでの使用の為VRM→PMXに変換したのですがVRoidで作ったオリジナルのテ...
- Effective C++という本を読んでいるのですが、翻訳が酷すぎて何度も読み返す事に...
- MMDモデルについて質問です。 MMD初心者なので解決できず質問させていただき...
- unityでプレイヤを伸ばして壁にくっつけて移動する (スパイダーマンみたいな感...
- c++ country road http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2...
- c++ cheese 下のリンク43行目 xcodeで Thread 1: EXC_BAD_ACCESS (code=2, add...
- uWebSocketsについて ゲームのサーバーを立てるためにコマンドプロンプトでnod...
- c++ lis 下2つのコードで計算速度があまり変わらないのはなぜでしょうか。 http:...
- MT4のEAで、資金管理の部分のコードの書き方を教えてください。 最初は1枚スタ...
このカテゴリの投票受付中の質問
- 関数の出力プログラムについてです。 下の画像の青線のところがわからないので解...
- インクルードファイルとライブラリの違いは? MQL4における、インクルードファ...
- [MT4]インクルードファイルとライブラリの違いは? MQL4でEA作成の際、インク...
- プログラム初心者です。 現在、大学でプログラムの課題をしているのですが、 ...
- Arduinoボード(UNO R3またはMEGA)にMozziを使用してシンセサイザー音源を作ろうと...
- c++でファイラなど作るのは難しいですか?
- Unity Remote5というアプリでWindowsの動作をiPhoneで確認したいのですが、 Edit ...
- PowerAppsでLeft関数を使うとエラーがでる。 下記のコードで、自動で採番す...
- 1-1 卒業にかかわるので 早急な回答よろしくお願いします! 図形Lに対し...
- プログラムについて質問です 奇数だったら0、偶数だったら1を返してくれるとい...
カテゴリQ&Aランキング
- 戻る
- 次へ
総合Q&Aランキング
Yahoo!知恵袋カテゴリ
お客様自身の責任と判断で、ご利用ください。

