• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:引数として二次元配列を利用する方法について(C言語))

C言語で二次元配列の関数化と初期値設定の方法について

このQ&Aのポイント
  • C言語で二次元配列を関数化する方法について悩んでいます。特に第一引数の処理が上手くいかないようです。
  • 質問のコードを読みましたが、関数の内部を変更せずに上手くいく方法はありますか?
  • また、char型の二次元配列に対しても同様の関数を作成したい場合は可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

現行の > char hp[PR_SIZE][3]; を当該関数に渡す場合は、 > void ReadIni_pr(char *a[], const char* str, char* initial){ を void ReadIni_pr(char (*a)[3], const char* str, char* initial){ とすればよいと思います。第一引数の意味は、 「aは、要素数3の配列へのポインタ」です。 こうすれば、呼び出し時の > ReadIni_pr(&(pr.hp[0][3]), "hp", "aa,aa"); は ReadIni_pr(pr.hp, "hp", "aa,aa"); でよいと思います。 なお、 > char sp[PR_SIZE][5];に関しても同様の関数で処理したい のであれば、可能ならば当該配列の定義を char hp[3][PR_SIZE]; や char sp[5][PR_SIZE]; と変更して、当該関数を void ReadIni_pr(char (*a)[PR_SIZE], const char* str, char* initial){ とすれば、当該配列の第一要素数がいくつであっても対応できます。

vtr9
質問者

お礼

なるほど。その場所を括弧で囲むという考えが出てきませんでした。 a[][3]をポインタへ変形させたという捉え方でしょうか。 a[][3] → (a[])[3] → (*a)[3] といった具合に。 (真ん中はソースとしては変ですが…) sp[PR_SIZE][5]に関しては、文字列なので逆転させると別の箇所での扱いが不便になるため、別の関数を使ってみます。 仮に*a[3]としたときには、a[3][]の方でしょうか。 これだと関数の引数としては不適格ではありますが。

vtr9
質問者

補足

一応、C++も扱える状況なので、引数だけを代えて同名で別の関数を作っておくことで回避してみます ありがとうございました

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • bushclean
  • ベストアンサー率26% (6/23)
回答No.2

>ReadIni_pr(&(pr.hp[0][3]), "hp", "aa,aa"); //関数呼び出し あ、宣言細かく見てませんでした。 pr.hp[0][2]ですよね?

vtr9
質問者

補足

ReadIni_pr(&(pr.hp[0][3]), "hp", "aa,aa"); //関数呼び出し すいません、元々構造体だったものを簡略のために省いていたのですが、消し忘れてしまっていました。 ReadIni_pr(&hp[0][3], "hp", "aa,aa"); //関数呼び出し と解釈してください。 ちなみにこの &hp[0][3] の部分なのですが、暫定的にこういった状態になっているだけであって、例えば、 hp、hp[3]、&hp[0][0] などとしても上手く動作しません(型の合わないものも含まれますが、そのレベルも含めて動作云々というよりもコンパイルのレベルでの問題でもあります) さらに関数内にあるstrcpy(a[i], "\0");の部分に関して上手く動作するようにしたい(ここを動作させることが目的です)ので、できればこれを主眼において引数を考えていただけるとありがたいです。 引数を…というのは、関数の呼び出しも勿論ですが、関数の宣言内の方も考慮して下さい。

すると、全ての回答が全文表示されます。
  • bushclean
  • ベストアンサー率26% (6/23)
回答No.1

>ReadIni_pr(&(pr.hp[0][3]), "hp", "aa,aa"); //関数呼び出し これ、pr.hp[0][3] という、一つの値への参照だけしか渡してませんよ。 変数の最後の値を渡しているので、関数内で変数サイズを超えて 書き換えが起こっているのでしょう。 >あと、char sp[PR_SIZE][5];に関しても同様の関数で処理したいのですが、可能でしょうか? という課題も含めて配列の二次元目の大きさも関数の引数に入れれば よいでしょう。 (えーと、「ReadIni_pr(char *a[], ...」で受け取って良いかどうかはパスしておきます(汗  私もその程度のレベルなので)

すると、全ての回答が全文表示されます。

関連するQ&A