今、動的オブジェクトの勉強をしております。
動的の一次元配列の作り方として
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *a;
int x;
printf("配列の大きさX入力>");
scanf("%d",&x);
a=calloc(x,sizeof(int));
return (0);
}
これでいいと思うんですが動的な2次元配列を
作りたいときはどのようにすればよろしいのでしょうか?
(↓作りたい二次元配列の例(1)↓)
int main(void)
{
int *a;
int x , y;
printf("配列の大きさX入力>");
scanf("%d",&x); //5と入力
printf("配列の大きさY入力>");
scanf("%d",&y); //10と入力
上のように入力するとa[5][10]という配列が完成する
}
よろしくお願いします
No.3ベストアンサー
- 回答日時:
★動的な2次配列の作り方。
パート2・マクロ関数のバージョンも載せておきます。
// これがマクロ関数
#define MacroCell(a,x,y) ((a)[(y) * arrayX + (x)])
サンプル:
int main( void )
{
int *a;
int arrayX; ←この名前とマクロ関数の定義を対応させること。
int arrayY;
printf( "配列の大きさX入力>" );
scanf( "%d", &arrayX ); //5と入力
printf( "配列の大きさY入力>" );
scanf( "%d", &arrayY ); //10と入力
if ( (a = (int *)calloc((arrayX * arrayY),sizeof(int))) != NULL ){
MacroCell(a,0,0)⇒X=0、Y=0
MacroCell(a,4,0)⇒X=4、Y=0
:
MacroCell(a,0,9)⇒X=0、Y=9
MacroCell(a,4,9)⇒X=4、Y=9
MacroCell(a,4,9) = 12345; ←代入時
printf( "a[9][4] = %d\n", MacroCell(a,4,9) ); ←参照時
free( a );
}
return 0;
}
その他:
・マクロ関数を作るときの注意点として、仮引数になる部分にカッコを付けます。
つまり、(y) とか、(x) とか、(a) とすること。カッコをなくして y、x、a とすると
マクロの呼び出しで
MacroCell( a, 3, 2 + 3 ) となっている場合に
a[ 2 + 3 * arrayX + 3 ] と展開されます。すると
a[ 3 * arrayX + 5 ] と計算されてしまいます。このためカッコをつけておくと
a[ (2 + 3) * arrayX + (3) ] と展開されて正しく
a[ 5 * arrayX + 3 ] と解釈されます。
・また、配列名を表す a にも括弧を付けます。
これも同様にマクロ関数の呼び出しで
MacroCell( a + 5, X, Y ) とした場合に正しく
(a + 5)[Y * arrayX + X] と展開されることを狙っています。
・以上。今後の参考に!→マクロの副作用も注意しましょう。
No.2
- 回答日時:
Oh-Orange さんの完璧ですね・・・(驚)
私だったら、
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define cell(X,Y,a,x)(a+X+x*Y)
// X=1次側、Y=2次側、a=配列先頭ポインタ,x=配列の大きさのX
int main(void)
{
int *a;
int x , y , X , Y, data;
printf("配列の大きさX入力>");
scanf("%d",&x);
printf("配列の大きさY入力>");
scanf("%d",&y);
a=(int*)calloc(x*y,sizeof(int));
X=1,Y=4;
*cell(X,Y,a,x)=2;
data=*cell(X,Y,a,x);
printf("%d\r\n",data);
free(a);
return 0;
}
のようにします。
Oh-Orange さんのリストはアーキテクチャに優れてますね。
No.1
- 回答日時:
★動的な2次配列の作り方。
・文章での説明が苦手なのでサンプルを載せます。
サンプル:
int main( void )
{
int *a;
int **aa; ←これ追加。
int i, x, y;
printf( "配列の大きさX入力>" );
scanf( "%d", &x ); //5と入力
printf( "配列の大きさY入力>" );
scanf( "%d", &y ); //10と入力
if ( (a = (int *)calloc((x * y),sizeof(int))) != NULL ){
if ( (aa = (int **)calloc(y,sizeof(int*))) != NULL ){
for ( i = 0 ; i < y ; i++ ){
aa[ i ] = &a[ i * x ];
}
aa[0][0]⇒X=0、Y=0
aa[0][4]⇒X=4、Y=0
:
aa[9][0]⇒X=0、Y=9
aa[9][4]⇒X=4、Y=9
free( aa );
}
free( a );
}
return 0;
}
その他:
・a は X、Y の全体のメモリを確保しています。
aa は a のメモリ領域の Y 軸のポインタを格納した配列です。
よって、aa[Y][X] としてアクセスすればよい。
・他にも方法はありますが、この方法が一番メモリの使用量や確保回数が少ないと思います。
あとマクロ関数を利用すれば a のメモリ領域だけを確保してマクロ関数でアクセスする
方法がメモリ量を一番抑えることが出来ます。
・以上。おわり。→3次元配列の考え方は同じに出来ます。
参考URL:http://oshiete1.goo.ne.jp/qa3002995.html
上のパート2]のとお礼の場所が逆になってしまいました。
マクロ関数の使う方法はちょっと難しそうですね・・・・
かなり勉強になりました。ありがとうございます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 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# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C#で構造体の配列を持った構造...
-
define で 配列
-
配列の要素数に変数を入れたい...
-
Cのエラー
-
C言語において、 配列要素をひ...
-
エラー:浮動小数点の不正な使用
-
構造体のextern方法
-
c言語 構造体
-
配列の不正アクセスについて
-
C言語 ファイルの指定された行...
-
C#で配列が空かを判定するには?
-
C言語についてです 5人のテスト...
-
万年カレンダーについて。
-
C言語から質問です。
-
C++DLLからC#へのコールバック...
-
二次元配列による文字列の配列...
-
配列のアドレス部
-
C言語 ビットフィールドについて
-
bsearch関数の内容について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語の2次元配列 容量が大き...
-
c言語 構造体
-
C言語 ファイルの指定された行...
-
C言語についてです 5人のテスト...
-
int i, int i[1];
-
fclose()でセグメンテーション違反
-
char型配列をint型に代入するには
-
C言語から質問です。
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
[C++]const int と配列
おすすめ情報