2014-10-19 48 views
0

经过努力,我无法解决以下问题。在印度工程研究生能力测试(GATE)2014中提出了问题。c程序中的三维数组

问题)对于访问X[i][j][k]的C程序,以下中间代码由编译器生成。假设一个整数的大小是32位,字符的大小是8位。

t0 = i * 1024

t1 = j * 32

t2 = k * 4

t3 = t1 + t0

t4 = t3 + t2

t5 = X[t4]

关于C程序的源代码,下列哪一项是正确的?

(a)X被声明为“int X[32][32][8]”。

(b)X被声明为“int X[4][1024][32]”。

(c)X被声明为“int X[4][32][8]”。

(d)X被声明为“int X[32][16][2]”。

一书里面以前的论文提供解决方案的说,答案是选项(A)。怎么样?任何解释

在此先感谢

+0

你确定所有的数组都是int类型吗? – user3386109 2014-10-19 02:06:45

+1

按照GATE 2014官方问题论文的正确选项编辑该问题。参见问题编号34本文:http://gate.iitk.ac.in/GATE2015/docs/QP2014/CS02_2014.pdf – 2015-01-13 16:25:25

+0

@ ShantanuPaul这应该是一个评论,因为它偏离了问题的原意,而匹配答案。 – Emil 2015-01-14 11:20:55

回答

2

t1i * (inumInts * sizeof(int))

所以,inumInts * 32 = 1024

因此,inumInts = 32。

t1j * (jnumInts * (inumInts/sizeof(int)),becasue有1 j用于i每一行。

所以,jnumInts * 1 = 32。

因此,jnumInts = 32。

t2k * (knumInts * (inumInts/sizeof(int)/((inumInts*jnumInts)/sizeof(int))))。 (因为没有为每个kj一个ii行)

所以,knumInts * 1/2 = 4

因此,knumInts = 8

因此,int X[32][32][8]

+1

技术上很好,很好的解释。希望你不介意我是否需要一些时间 – 2014-10-19 01:45:26

2

没有足够的信息。我会尝试向您证明:

为了让我们的生活更轻松,我们将所有值除以4,因为这是整数的大小(考虑到8位字符大小)。这留给我们:

i的倍数:256; j的乘数:8; k的乘数:1.

k必须是1,因为它是最后一个使用的索引,女巫意味着它只需要跳过1个整数就可以进入下一行。另一方面,j不得不跳过8个整数,因此它可以到达下一行的相同位置。这意味着每行有8个整数。我们对k有价值。我们的数组X现在看起来像:X [i] [j] [8]

我必须跳过256个整数才能到下一列。由于一行有8个整数,并且256/8 = 32,这意味着每列有32行,因此将数组X保留为:X [i] [32] [8]

最后,我们需要知道有多少页数组有。但是没有办法知道这一点,因为我们需要字节数组的全部大小,所以我们可以将它除以256,然后知道页数。这导致我们回到这个答案的开始:没有足够的信息。

+0

感谢您的好解释,我按照其形式输入了问题。我也会编辑这个问题,尽快将原始形式的考卷包括在内。 – 2014-10-19 01:38:34

1

该数组的第一维对地址计算没有影响。 sizeof(int)确实对地址计算有影响。因此,它可能有助于改写接听)作为

X[][32][8][4] 
    i j k 

其中最后[4]代表sizeof(int)。所以地址计算是

(k * 4) + (j * 8 * 4) + (i * 32 * 8 * 4) = i * 1024 + j * 32 + k * 4 

由此,我会得出结论,a)和c)都是正确的答案。

2

Exp:给出int的大小为4B,char的大小为1B。内存是字节可寻址的。 让数组声明为Type X [A] [B] [C](其中Type = int/char和A,B,C是自然数 )。

From t0 = i*1024, we conclude that B*C*(size of Type) = 1024. 
From t1 = j*32, we conclude that C*(size of Type) = 32. 
From t2 = k*4, we conclude that size of Type = 4. 
Type = int, and 
C = 8, and 
B = 32.