![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
#define PR_SIZE 40
char hp[PR_SIZE][3];
char *initial;
initial = "aa,aa";
GetPrivateProfileString("Setting", "hp", initial, strText, 1024, ini_path);
initial = strtok(strText, ",");
for(i = 0; i < PR_SIZE; i++) strcpy(hp[i], "\0");
for(i = 0; initial != NULL && i < PR_SIZE; i++){
strcpy(hp[i], initial);
initial = strtok(NULL, ",");
}
という部分を関数化しようとして、
ReadIni_pr(&(pr.hp[0][3]), "hp", "aa,aa"); //関数呼び出し
void ReadIni_pr(char *a[], const char* str, char* initial){
char strText[128];
GetPrivateProfileString("Setting", str, initial, strText, 1024, ini_path);
for(int i = 0; i < PR_SIZE; i++)
strcpy(a[i], "\0");
initial = strtok(strText, ",");
for(int i = 0; initial != NULL && i < PR_SIZE; i++){
strcpy(a[i], initial);
initial = strtok(NULL, ",");
}
}
と書いてみたのですが、第一引数の処理がどうしても上手くいきません
できるだけ関数の内部を変更しない形で、上手くいく方法はないでしょうか
(インクルードに関しては省略してあります)
あと、char sp[PR_SIZE][5];に関しても同様の関数で処理したいのですが、可能でしょうか?
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){
とすれば、当該配列の第一要素数がいくつであっても対応できます。
なるほど。その場所を括弧で囲むという考えが出てきませんでした。
a[][3]をポインタへ変形させたという捉え方でしょうか。
a[][3] → (a[])[3] → (*a)[3] といった具合に。
(真ん中はソースとしては変ですが…)
sp[PR_SIZE][5]に関しては、文字列なので逆転させると別の箇所での扱いが不便になるため、別の関数を使ってみます。
仮に*a[3]としたときには、a[3][]の方でしょうか。
これだと関数の引数としては不適格ではありますが。
No.2
- 回答日時:
>ReadIni_pr(&(pr.hp[0][3]), "hp", "aa,aa"); //関数呼び出し
あ、宣言細かく見てませんでした。
pr.hp[0][2]ですよね?
この回答への補足
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");の部分に関して上手く動作するようにしたい(ここを動作させることが目的です)ので、できればこれを主眼において引数を考えていただけるとありがたいです。
引数を…というのは、関数の呼び出しも勿論ですが、関数の宣言内の方も考慮して下さい。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- HTML・CSS html cssのmargin 5 2022/12/03 11:04
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
2次元配列をポインタで参照した...
-
C言語にて構造体のメンバがNULL...
-
strcat関数を自作したいです
-
csvファイルをfscanfで読み込む...
-
CStringからchar*への型変換に...
-
SubStringの使い方について
-
文字列strの中から文字cを探す...
-
C言語で文字列をかえす正しい書...
-
char形配列の整数を抜き出したい
-
小数点入りの文字列をfloat型に...
-
2次元配列の文字"列"の初期化方法
-
szとlpszの違い
-
std::stringクラスのc_str()で...
-
C言語のmemcpy関数について質問...
-
C言語のintとcharの違いってな...
-
C言語の文字リテラル中の16進文...
-
C,C++のsizeof演算子の仕様につ...
-
C++17で、unsigned char * 配列...
-
動的メモリの初期化方法について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報