トップページ⇒tech
117コメント30KB

二次元配列の宿題が分かりません・・・。

■ このスレッドは過去ログ倉庫に格納されています
0001やばいいいNGNG
二次元配列の宿題が出されました。問題は十行十列の
二次元配列aをメモリ上の連続した領域へ行方向に格納するとき、
a(5,6)が格納される場所の番地はどれか。ここで番地は
十進数表示とする。ちなみにa(1,1)の時の番地は100です。
0002やばいいいNGNG
答えだけじゃなく、その経緯も書けといわれました。
0003デフォルトの名無しさんNGNG
君の隣の席の関根君に聞きたまえ。
=========END==========
0004やばいいいNGNG
友達いないので。
0005デフォルトの名無しさんNGNG
君は友達じゃなければ質問できないのか?
===========END==========
0006デフォルトの名無しさんNGNG
2ちゃんねらーは友達だ!
0007デフォルトの名無しさんNGNG
配列のベースは0?1?
要素のサイズは?
0008デフォルトの名無しさんNGNG
最近は、難しい宿題でるんだな・・・

自分も、なんか挑戦したくなったので、マジレスで答えてみる
今回だけだぞ

まず、
x = ( 5*8*256 + 6*8 ) / (5*6) + 100(=a(1,1)の番地)
(8は1バイトのbit数の事)

そして、
もし環境が16bitなら、
番地 = x * 256

32bitなら、
番地 = x * 65536

windows95以降使ってるなら、32bitだよ
わからなかったら、とりあえず32bitにしておいてね


俺も100%は自信ない もし間違ってたら、誰か指摘して
0009デフォルトの名無しさんNGNG
Cの配列の話なら
http://member.nifty.ne.jp/maebashi/programmer/pointer.html
もっと宿題に答えて欲しいなら
[プログラム板] お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi/tech/982853418/
0010>8NGNG
えっとそんなに大きな答えにはならないと思うよ。
番地がa(1,1)で100,101だから,
(5,6)に直すと、200くらいになるんじゃないか?
0011デフォルトの名無しさんNGNG
>>8
正解。
最短で答えるとそうなる。
0012デフォルトの名無しさんNGNG
素直に156だべ?
100+10*5+6
0013やばいいNGNG
>8
200以下とはいってました。
100代とはわかるんですが・
0014分NGNG
200くらいになると思う。
0015やばいいNGNG
バイトは関係ないらしいです。
純粋に番地が分かればいい
0016デフォルトの名無しさんNGNG
>>1
ソースきぼんぬ
0017デフォルトの名無しさんNGNG
つーかよ、数えりゃすぐわかるだろ。
0018デフォルトの名無しさんNGNG
a(n, 1)は 100 + (n - 1) * 10 番地に格納される。(1 <= n <= 10)
a(n, m)は 100 + (n - 1) * 10 + m - 1 番地に格納される。(1 <= m <= 10)
a(5, 6)は 100 + 4 * 10 + 5 = 145番地に格納される。
0019デフォルトの名無しさんNGNG
でも、こんなの実装次第だ。
0020デフォルトの名無しさんNGNG
うーむ
a[0..9,0..9]なのか
a[1..10,1..10]なのか
それをまずはっきりさせようよ
0021やばいいNGNG
(1,10)だと思います。
0022やばいいNGNG
バイトで言えば、a(1,1)が100で、
a(1,2) 102になっています。
0023デフォルトの名無しさんNGNG
ならもうわかるだろ。
0024やばいいNGNG
大体、200くらいになると言っていたので
190代だと思う。適当に答えを書き込めば、いいんだろうけど
その経緯も説明しろと言われたので、少しきついです。
0025デフォルトの名無しさんNGNG
>>18であってるのだろうが、
> バイトで言えば、a(1,1)が100で、
> a(1,2) 102になっています。
ということなら 190 かと。
0026デフォルトの名無しさんNGNG
>>22
番地の増加分は1ではなく、2なのか?
0027デフォルトの名無しさんNGNG
a(n, m)は 100 + (n - 1) * 20 + (m - 1) * 2 番地から格納される。(1 <= n, m <= 10)
a(5, 6)は 100 + 4 * 20 + 5 * 2 番地から格納される。
0028やばいいNGNG
a(1,1)の中に100と101が入ってる。
多分、100でいいんだろうと思う。
a(1,2)で102,103。
答えは190で間違いないと思う。
ただ、、経緯を書いてこいと言われた。
0029経緯なんて楽勝さNGNG
経緯か、、。
俺には解らん。
0030デフォルトの名無しさんNGNG
俺には >>1 が >>28 で言っている意味が分からんのだが。
0031経緯なんて楽勝さNGNG
よって、、、190になるって説明か・・
0032やばいNGNG
番地の増加分が2つと言う意味で間違いがないと思う。
0033デフォルトの名無しさんNGNG
多分、数え上げた振りをすればよい。
a(1, 1) 100, 101
a(1, 2) 102, 103
...
a(2, 1) 120, 121
...
a(5, 1) 180, 181
...
a(5, 6) 190, 191
0034デフォルトの名無しさんNGNG
それにしても変な宿題・・・・

100 102 104 106 108 110 112 114 116 118
120 122 124 126 128 130 132 134 136 138
140 142 144 146 148 150 152 154 156 158
160 162 164 166 168 170 172 174 176 178
180 182 184 186 188 190 192 194 196 198
200 202 204 206 208 210 212 214 216 218
220 222 224 226 228 230 232 234 236 238
240 242 244 246 248 250 252 254 256 258
260 262 264 266 268 270 272 274 276 278
0035デフォルトの名無しさんNGNG
>>34
なんで 9x9 の表?
0036デフォルトの名無しさんNGNG
>>1
つぅかネタでしょ?なんで質問に>>22の条件を含めなかったんだろ?
0037ageNGNG
経緯か、、、
0038デフォルトの名無しさんNGNG
190で間違いないけど経緯が分からんな。
0039やばいいNGNG
ねたじゃなくて、マジスレ
0040やばいいNGNG
もっと書きやすい経緯のあらわし方が、、あれば。。。
0041やばいいNGNG
皆さん、ありがとうございました、
感謝しています。後は自分で考えます。
0042やばいいNGNG
とりあえず答えが190だと言うことはわかりました。
あとはそれをどう説明するか、、考えてみます。
レポートとして出すのです。
0043デフォルトの名無しさんNGNG
それではめでたく終了。
0044おいおいNGNG
なんで190になるんだ?
経緯も分からんぞ。。「
0045デフォルトの名無しさんNGNG
>>44
スレ読め。
0046おいおいNGNG
まったく分からん。
0047デフォルトの名無しさんNGNG
http://www.geocities.co.jp/Milano-Killer/6419/kani.swf
0048デフォルトの名無しさんNGNG
>>47
うざ
0049デフォルトの名無しさんNGNG
FORTRANとCじゃ行と列の格納順が逆だ、
というマメ知識をひけらかしたくてしょうがないんだが、
…どうでもいいですか。
005049NGNG
問題よく読んでなかった。すまん。
0051デフォルトの名無しさんNGNG
>二次元配列の宿題が出されました。問題は十行十列の
>二次元配列aをメモリ上の連続した領域へ行方向に格納するとき、
>a(5,6)が格納される場所の番地はどれか。ここで番地は
>十進数表示とする。ちなみにa(1,1)の時の番地は100です。

この質問の意味がわからん。
何の意味があるんだ。
0052デフォルトの名無しさんNGNG
a(0,1)の番地がわかれば予想可能
0053デフォルトの名無しさんNGNG
この問題、よく考えると答えようが無いぞ。
問題出した先生は逝って善しなんじゃ。
&(a[0][0])からのオフセットを表示するソフトは書けるけど、
前提条件がなさすぎじゃ。
0054デフォルトの名無しさんNGNG
つーか、プログラムを組めって問題じゃないだろ。
0055デフォルトの名無しさんNGNG
駄問!
出題者は教師失格!
0056ろんNGNG
はあ、
0057ろんNGNG
と言うか190と答え出たんだ。
0058-NGNG
>>53
「〜と仮定すれば」と添えればよいのだから
答えようが無いということもない
0059ろんNGNG
>58
そんな事しなくても解けるよ。
190って答え出てるんだから。
0060デフォルトの名無しさんNGNG
あほか?
矛盾だらけだつうの。
1)なんでバイト配列で+2ずつアドレスが増加する?
2)配列とアドレスの関係は言語やOSのメモリ管理に依存するので
一概にこうだとは言えない。問題にも示されていない。
3)1,1からはじまる配列って本当なのか?実在しない感じだが??
4)なんだよこれ?>行方向に格納するとき
0061-NGNG
>>59
はぁ……

>20 :デフォルトの名無しさん :01/10/17 16:33
> うーむ
> a[0..9,0..9]なのか
> a[1..10,1..10]なのか
> それをまずはっきりさせようよ

>21 :やばいい :01/10/17 16:36
> (1,10)だと思います。

すでに仮定が入ってるんですけど.
0062デフォルトの名無しさんNGNG
>>1の学校出た人って

  int  a[10][10]
  a[10][10]=5;

とか書くんだろうか?
0063-NGNG
>4)なんだよこれ?>行方向に格納するとき
多分先生が使っているコンピュータはメモリ上でも定義した通りの二次元配列でマッピングされるコンピュータなのでしょう
0064デフォルトの名無しさんNGNG
問題は>>1が書いたって感じだな。
教師が書いたのをコピペってわけじゃなさそ。
0065デフォルトの名無しさんNGNG
>>60-62
0-origin の配列なら
> ちなみにa(1,1)の時の番地は100です。
なんて書き方しないだろ。
1-origin なのは間違いないと思う。

つか、fortran くさいな。
0066デフォルトの名無しさんNGNG
>3)1,1からはじまる配列って本当なのか?実在しない感じだが??

FORTRAN は 1 からはじまるよ。
0067デフォルトの名無しさんNGNG
”番地”なんだから、Originとは何の関係も無い
0068デフォルトの名無しさんNGNG
>4)なんだよこれ?>行方向に格納するとき
warata
006965NGNG
>>67
0-origin なら
> ちなみにa(1,1)の時の番地は100です。
って書かず
> ちなみにa(0,0)の時の番地は100です。
って書くだろって話なんだが。
0070 NGNG
>>1
答えが190って教師に聞いたやつなのか?それともここのスレで聞いた数のことなのか?

Base0かbase1かの問題よりも>>1の書いた問題がネタか?と言うほうに興味がある。

数学的な質問ならば154だとする。
0071デフォルトの名無しさん NGNG
>>62
ワラタ
0072 NGNG
>>1
前提条件がころころ変貌中。厨房
http://piza2.2ch.net/test/read.cgi/tech/982853418/
0073デフォルトの名無しさんNGNG
配列を[1]から使う教授ってきもいよね。
0074デフォルトの名無しさんNGNG
>>73
VBって[1]からじゃなかった?
0075デフォルトの名無しさんNGNG
いや、たしか(-1000)とかできたはずだ。今思えばむちゃくちゃだな。
0076デフォルトの名無しさんNGNG
>>73
1からの方が解りやすい。
0077デフォルトの名無しさんNGNG
>>74
オプションで1からと0からと選べる。
0078デフォルトの名無しさんNGNG
Dim A(-10000 to 10000) as Integer

VBは本当胸が悪くなる。
0079デフォルトの名無しさんNGNG
>>78
配列の番号の範囲が指定できるのは
Pascalとかも同じ。というかPascalを真似した?
便利。高級言語。

C/C++の配列が0から始まるのは、
ポインタ演算との兼ね合いのため。
0080ネタ決定NGNG
ネタ決定
もうあげんな
0081デフォルトの名無しさんNGNG
>>79
>C/C++の配列が0から始まるのは、
>ポインタ演算との兼ね合いのため

つーか効率最優先だからだろ?
0082デフォルトの名無しさんNGNG
処理系依存だけど、大抵の場合Cでは

char a[20][20]; の場合、
a == &a == &a[0] == &a[0][0]

だと思うけど、これらが全てバラバラとなる処理系も当然ありうるよね。
0083デフォルトの名無しさんNGNG
【1次元配列】の配列という説明だけは止めて欲しい
0084デフォルトの名無しさんNGNG
所詮すべて一次元だもんな
0085デフォルトの名無しさんNGNG
構造体を

struct UNIT{
double *x
double *y
}

と、取り
UNITとx、yを malloc,reallocで増すことはできないのでしょうか。

UNIT 1
x1,x2,x3,x4,・・・・・ 可変
y1,y2,y3,y4,・・・・・ 可変

UNIT 2
x1,x2,・・・
y1,y2,・・・

・
・
・

UNITも可変

(可変とかいてあるが、増やすだけで良い)
というようにしたいのです。

コンパイラはとおるのですが、走らせるとreallocでいつもエラーでとまりま
す。

どうか宜しくお願いいたします。
0086デフォルトの名無しさんNGNG
なにこれ?何やりたいのかぜんぜんわかんないのは俺の経験不足?
0087デフォルトの名無しさんNGNG
1はプログラムの授業中に居眠りでもしていたんだろう。
1はプログラムの授業中をサボっていたのだろう。
1はプログラムの実習中にどこぞのエロWEBでも見ていたのだろう。
1はプログラムの授業中友人との話に夢中だったのだろう。
1の周りには、宿題について聞けるような友人がいないのだろう。

こんなスレ立てる奴はどうかしている。
こんな質問に答える奴もどうかしてる。
まさに「スレ立てるまでもない質問」だ。
宿題わかりません、宿題おしえてくださいスレ見るたびにうんざりする。
そんなことは友人か先生に聞け。
ああ、ごめん。優秀な友人はいないのか。
先生も相手にしてくれないからここで聞いているのか。
だったらこっちにいけバカ。
http://piza2.2ch.net/test/read.cgi/tech/1001998049/l50
0088デフォルトの名無しさんNGNG
こんなスレageる奴もどうかしている、に20ペソ。
0089デフォルトの名無しさんNGNG
>>84
その認識も実は間違いなのでは?
というのが>>82の主張だったりします。

たとえば type a[A][B] があったとして
a[x][y] のアドレスが a+(x*A+y)*sizeof(type) である 保証
ってありましたっけ?
0090デフォルトの名無しさんNGNG
ありますよ。
0091デフォルトの名無しさんNGNG
>>85
typedef struct{
double *x;
double *y;
} UNIT;

[UNIT unit1,unit2;]※1

int main(void){

UNIT unit1,unit2;※0
[static UNIT unit1,unit2;]※2
   
unit1.x = realloc(unit1.x,sizeof(double)*10);
unit1.y = realloc(unit1.y,sizeof(double)*13);

unit2.x = realloc(unit2.x,sizeof(double)*5);
unit2.y = realloc(unit2.y,sizeof(double)*3);

return 0;
}
0092デフォルトの名無しさんNGNG
※1と※2は静的な領域で、※0は動的な領域。
静的な領域はたいがい0で初期化される。

で、reallocの引数に渡すポインタが適当な値だとエラー。
0ならOKなので、※1と※2がうまく動く。
009390NGNG
a+(x*A+y)*sizeof(type)
でなく
a+(x*B+y)*sizeof(type)
だな。
009489NGNG
>>93
ああ、タイプミス。

でも、保証があるっていうのは?
K&Rに載ってるのかな?見てみます。

これって10年前から疑問に思ってたんだけど
ほったらかしてたんだよね・・・
0095デフォルトの名無しさんNGNG
>>94
type a1[A][B];
を
typedef type t[B];
t a2[A];
として考えてみれ。
009689NGNG
>>95
うん。考えた。で、試したりもしました。

struct TY { char a,b,c; };
main()
{
 struct TY ty[3][3];
 int i,j;
 for( i=0;i<3;i++ ) {
  for( j=0;j<3;j++ ) {
   printf("%d %d: %x\n",i,j,&ty[i][j] );
  }
 }
}

$ ./a.out
0 0: bffffac0
0 1: bffffac3
0 2: bffffac6
1 0: bffffac9
1 1: bffffacc
1 2: bffffacf
2 0: bffffad2
2 1: bffffad5
2 2: bffffad8

むーん。ま、こういうもんか。
でも保証されてる っていう証拠にはならないんだよなぁ。
009790NGNG
1. 配列 type a[SIZE] において
a[x] のアドレスは a+x*sizeof(type) となることが保証されています。

typedef type t[B];
t a[A];
において a[x] のアドレスは
1より a+x*sizeof(t) すなわち
a+x*(sizeof(type)*B) = a+x*B*sizeof(type)
となります。

a[x][y] は
a[x] を b と置き、
b[y] のアドレスは b+y*sizeof(type) です。
b は a[x] = a+x*B*sizeof(type) なので置き換えてみると
(a+x*B*sizeof(type)) + y*sizeof(type)
= a+(x*B+y)*sizeof(type)
となります。

途中適当な所があるけど許して。
0098デフォルトの名無しさんNGNG
type a[A][B];
int i, j;

&a[i][j] ≡ a[i] + j ≡ (a + i) + j
ここでa + iの型は「type *」
aの型は「type[B] *」なので、

(unsigned long)(a + i)
≡ (unsigned long)a + sizeof(type[B]) * i
≡ (unsigned long)a + sizeof(type) * B * i

(unsigned long)((a + i) + j)
≡ (unsigned long)(a + i) + sizeof(type) * j
≡ (unsigned long)a + sizeof(type) * B * i + sizeof(type) * j
≡ (unsigned long)a + sizeof(type) * (B * i + j)

規格(ANSI ISO IEC 9899-1999)では6.5.2.1だ。
...(上のような規則の説明があって)、
It follows from this that arrays are stored in row-major
order (last subscript varies fastest).
0099デフォルトの名無しさんNGNG
>>89
結局は規格でどう定められているか、という問題でしょ。
この手の話題は Followup-To: fj.comp.lang.c だね。
イヤというほど詳細なフォローが貰えると思うよ。
010089NGNG
>>99
>規格でどう定められているか
まあ、そこです。
でもfjには投稿できないんだよな〜
0101デフォルトの名無しさんNGNG
これ、どこかで「保証されてる」って見たような気がするんだけど、
どこだったかな・・・。
■ このスレッドは過去ログ倉庫に格納されています