![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
2次元配列の引数の定義や渡し方や
ある変換する関数で、すべて' '(スペース)にしたり[memmoveなど1命令で]や、
それぞれ一つ違う値 A->B, O->Pに置き変える関数しようとしているのですが、
C言語のデータ操作に非常に疎く、どのようにすれば良いかわかりません。
どのようにすれば良いのでしょうか?
環境はWindowsで VisualC++6.0です。
GCCもソースを変えずに同じように出来るのでしょうか?
#include <stdio.h>
char lesson[7][6] = {
{'A', 'B', 'C', 'D', 'E', 'F'}, // MON
{'G', 'H', 'I', 'J', 'K', 'L'}, // TUE
{'M', 'N', 'O', 'P', 'Q', 'R'}, // WED
{'S', 'T', 'U', 'V', 'W', 'X'}, // THU
{'Y', 'Z', 'a', 'b', 'c', 'd'}, // FRI
{'e', 'f', 'g', 'h', 'i', 'j'}, // SAT
{'k', 'l', 'm', 'n', 'o', 'p'}, // SUN
};
// --- 多次元配列の引数の渡し方がわからないのでvoid ---
void print_data(void)
{
for(int i=0; i < 7; i++){
for(int j=0; j < 6; j++){
printf("%c ", lesson[i][j]);
}
printf("\n");
}
}
// --- 問題の変換関数(引数定義と内容 ---
int convert(????)
{
????
}
// --- メイン ---
int main(boid){
print_data();
conver(???); // <--- どのように引数に渡すのか?
print_data();
return 0;
}
No.3ベストアンサー
- 回答日時:
ggaogg さんの回答に補足します。
まず、配列は式の中では、コンパイラによってポインタに読み替えられます。
# 一部例外はありますが。
そして、この読替えは再帰的には行われません。
つまり、配列の配列 (2次元配列) は、配列のポインタには読み替えられますが、ポインタのポインタにはなりません。
この法則を適用すると、配列の配列は次のように読み替えられることになります。
char lesson[7][6];
→ char (*lesson)[6];
つまり、「要素数 6 の配列へのポインタ」となってしまうのです。
ということで、引数に渡す場合には、次のようにすれば良いことになります。
void convert( char (*array)[6], int size )
# 配列サイズが消えてしまうので、一緒に引数に渡してあげると良いと
# 思います。
# バッファオーバーフローの保険としてですけどね。
そして、この場合には、convert() は次のようにコールすれば良いことになります。
convert( lesson, 7 );
なぜ、こんなことをする必要があるのかというと、C が配列をまともに扱えない言語だからなんです。
配列を扱えない代表として、配列の代入ができないことがあります。
# 代入する場合は、for 文でグルグル回すことが多いですよね。
ちなみに、構造体は代入したり引数に渡したりできますよね。
# 構造体の実体を渡すことに対する賛否は別の話としてですけど。。。
【参考】
配列の宣言、定義については、一般にはポインタの宣言、定義との互換性はありません。
次の2つが別の定義になるのは明らかですよね?
--------------------------------------------------
char hoge[8];
⇒ char型のサイズ (1Byte) の領域を、連続して8個確保する。
sizeof( hoge ) は 8 を返します。
# hoge がポインタに読み替えられない例外のひとつ。
char *hoge;
⇒ char型へのポインタのサイズ (32bit マシンでは 4Byte) の領域を確保する。
sizeof( hoge ) は 4 を返します (最近の 32bit マシンの場合)。
--------------------------------------------------
ただし、関数の引数の宣言 (仮引数宣言) に限って、これらは同じ意味になります。
void convert( char (*array)[6] );
void convert( char array[][6] );
⇒いずれも、char型の6個分の配列へのポインタを引数としてとる関数になります。
…あ、もし混乱してしまったようでしたら、この参考は無視して下さい。
すべては、C の妙な (?) 文法によるものなのですけどね。。。
No.2
- 回答日時:
#1です。
まず、配列は、連続したポインタなので、引数にはアドレスを渡せばいいわけです。
次に、受け取る側では、配列をどのように要素に取り入れればいいかを教えてやる必要があります。
引数がchar array[][6]となっているのはそのためで、6つの要素ずつに分けて受け取るわけです。
つまり
ABCDEFGHIJKLMNOPQRSTUVWXYZ(以下省略)
の先頭のAのアドレスを受け取ったら、それを6つずつの配列に分解させて
ABCDEF GHIJKL MNOPQR STUVWX YZ(以下省略)
というふうに分解するんだよという情報が必要なので。
で、わたってるのがアドレスなので、convert関数で変更すると、おおもとであるmainの配列内容も変更されるわけです。
・・・まあこれだけでは多分わからないと思うので、一応URLを。
http://cai.cs.shinshu-u.ac.jp/sugsi/Lecture/c2/e …
(今ぐぐったやつですが・・)
'A'はASCIIコードでは65です。
つまり65をchar型で表示するとAになるわけで、それに1を足してやると66、つまり'B'になるわけです。
これはコードがAから順に1ずつ増加していく性質を利用したものです。
なんだか説明べたなせいか、文章がまとまってないので、「配列」と「ポインタ」でぐぐってください。。
このへんの情報ならたくさんでてくると思いますので。
No.1
- 回答日時:
まずソースを示します。
見難そうなので、解説は分けます
#include <stdio.h>
void print_data(char array[][6]){
int i,j;
for(i=0; i < 7; i++){
for(j=0; j < 6; j++){
printf("%c ", array[i][j]);
}
printf("\n");
}
}
void convert(char array[][6]){
int i,j;
for(i=0; i<7; i++){
for(j=0; j<6; j++){
array[i][j] += 1;
}
}
}
// --- メイン ---
int main(boid){
char lesson[7][6] = {
{'A', 'B', 'C', 'D', 'E', 'F'}, // MON
{'G', 'H', 'I', 'J', 'K', 'L'}, // TUE
{'M', 'N', 'O', 'P', 'Q', 'R'}, // WED
{'S', 'T', 'U', 'V', 'W', 'X'}, // THU
{'Y', 'Z', 'a', 'b', 'c', 'd'}, // FRI
{'e', 'f', 'g', 'h', 'i', 'j'}, // SAT
{'k', 'l', 'm', 'n', 'o', 'p'}, // SUN
};
print_data(lesson);
printf("\n");
convert(lesson); // <--- どのように引数に渡すのか?
printf("\n");
print_data(lesson);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使わずに、変数名を動的...
-
C言語 配列の長さの上限
-
C# 配列の変数宣言について。
-
配列で格納したものをmsgboxで...
-
テキストファイルから文字列を...
-
【速いブラインドタッチ】手を...
-
メモリの初期値
-
C言語 変換指定%sについてです。
-
2次元配列の、黒いマス目で囲...
-
Functionの戻り値を2次元配列...
-
C言語初心者 ポインタについて...
-
先頭アドレスとは何ですか?
-
9枚の写真がA4 1枚に印刷できま...
-
VB.NET 構造体の配列の検索機能...
-
配列をEraseしてもメモリが開放...
-
C言語で巨大配列を作るにはどう...
-
ExcelVBAで質問です。離れた二...
-
C言語で2次元配列の引数定義や...
-
unsigned char配列への入力の仕方
-
配列を含む構造体の初期値について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
配列の参照渡しで型が一致しま...
-
ExcelVBAで質問です。離れた二...
-
unsigned char配列への入力の仕方
-
VBで構造体の配列を関数に渡す...
-
C++ vectorに配列をプッシュしたい
-
C言語で特定列だけを抽出して配...
-
Excel、VBAのユーザーフォーム...
-
複数の選択範囲の行番号を個別...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
【速いブラインドタッチ】手を...
-
C言語 配列の再初期化
-
Redimした動的配列はEraseする...
おすすめ情報