質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

4036閲覧

構造体に二次配列のメンバを持たせたい

extremetriangle

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/03/27 06:40

編集2018/03/27 07:34

構造体に盤面の情報を二次配列として持たせたい

一次配列なら問題なく実行出来るのですが、多次元になると記述方法が分からなくなってしまいます。
可能ならば配列のサイズを可変長にしたいです。

説明がおぼつかなくてすみません、よろしくお願いします。

試したこと

配列の最大要素数を予め固定して、使う要素数を決める方法

C

1#include<stdio.h> 2#define SIZE 256 3 4struct A{ 5 6 int height; 7 int whidth; 8 int board[SIZE][SIZE]; 9}; 10 11void Afunc(struct A a){ 12 13 printf("%d\n", a.board[a.height - 1][a.whidth - 1]); 14} 15 16int main(){ 17 18 struct A a; 19 a.height = 10; 20 a.whidth = 10; 21 22 for(int i = 0; i < a.height; i++){ 23 for(int j = 0; j < a.whidth; j++){ 24 a.board[i][j] = i*10 + j; 25 } 26 } 27 28 Afunc(a); 29 30 return 0; 31}

発生している問題・エラーメッセージ

今のところは問題ないのですが、256を超える大きなデータを入れる時にSIZEの値を書き直さないといけないのが気になってしまいます。

追記

whidthはスペルミスでした。
正確にはwidthです、すみません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

一次元での取り扱いができるなら、それでやれば問題ないと思います。

C

1int *board; 2/* 中略 */ 3 4board = (int *)malloc(sizeof(int) * width * height); 5/* 中略 */ 6 7for(int j = 0; j < height; j++) 8{ 9 for(int i = 0; i < width; i++) 10 { 11 board[j * width + i] = something; 12 } 13}

投稿2018/03/27 06:47

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extremetriangle

2018/03/27 07:13 編集

ご回答ありがとうございます。 確かに、構造体のboardをint*型にして動的に場所を確保すれば問題ないですね。 ただ、身勝手ながらheightとwidthの関係がコードから分かり辛くなってしまうのが気になっていました。 このように一次元配列にするのが一般的なのでしょうか? (すみません、widthの綴りを間違っていました。)
kazto

2018/03/27 07:23

少なくとも私の経験上では、2次元配列は全くと言っていいほど使いません。
extremetriangle

2018/03/27 07:28

これからはご指摘頂いた書き方にならいたいと思います ありがとうございました。
guest

0

定数じゃないサイズの二次元配列の動的確保はCでは無理だったはず。
何種類か方法がありますが、例えばここで解説されています。
http://tondol.hatenablog.jp/entry/20090713/1247426321

ただ、1024×1024×4Byteの構造体でも4MBなので、その構造体を1個しかつかわないのなら相当に大きいSIZEにしておくので実用的には構わないかも(個人で使うプログラムなら)。

投稿2018/03/27 07:27

a_saitoh

総合スコア702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extremetriangle

2018/03/27 07:42

ご回答ありがとうございます。 解説を読む限り、ある程度用途に合わせて書き方が変わりそうですね。 SIZEを大きく確保するのは危険、としか考えていませんでした。 頻繁に編集を加える個人用ならば、たまに使う事も検討したいと思います。
guest

0

構造体に配列を含める場合は、多次元配列でも全部の要素の数を確定しないと定義できません
配列のサイズが決まらないからですね。
ポインタの配列として、後付けでメモリ割り当てて多次元配列とするというなら、それは可能ですが。


んで、構造体に多次元の配列を定義する場合、その配列の占めるメモリ量に注意してください。
文字通り指数関数的にメモリ量が増大してしまい、簡単にメモリオーバとなってしまいます

投稿2018/03/27 06:54

編集2018/03/27 07:01
y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

extremetriangle

2018/03/27 07:18

ご回答ありがとうございます。 確かにむやみにSIZEを大きく確保するのも危険ですね、注意します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問