2014-10-19 4 views
0

После того, как я попытался решить проблему, я не смог решить следующий вопрос. Вопрос был задан в тесте «Высшая математика в инженерии» (GATE) 2014, Индия.Трехмерная матрица в программе c

Вопрос). Для программы C, получающей доступ к X[i][j][k], компилятор генерирует следующий промежуточный код. Предположим, что размер целого составляет 32 бита, а размер символа - 8 бит.

t0 = i * 1024

t1 = j * 32

t2 = k * 4

t3 = t1 + t0

t4 = t3 + t2

t5 = X[t4]

Какое из следующих утверждений о исходном коде для программы C является CORRECT?

(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

+1

Отредактировал вопрос с надлежащими вариантами в соответствии с официальным вопросом GATE 2014. См. Вопрос №. 34 этой статьи: http://gate.iitk.ac.in/GATE2015/docs/QP2014/CS02_2014.pdf –

+0

@ShantanuPaul Это должно быть действительно комментарий, поскольку он отклоняется от первоначального намерения вопроса и соответствия ответы. – Emil

ответ

2

t1 является i * (inumInts * sizeof(int)).

Так, inumInts * 32 = 1024.

Таким образом, inumInts = 32.

t1 является j * (jnumInts * (inumInts/sizeof(int)), еще потому есть 1 j для каждой строки из i.

Итак, jnumInts * 1 = 32.

Таким образом, jnumInts = 32.

t2 является k * (knumInts * (inumInts/sizeof(int)/((inumInts*jnumInts)/sizeof(int)))). (потому что есть один i и i ряды j для каждого k)

Итак, knumInts * 1/2 = 4.

Таким образом, knumInts = 8.

Таким образом, int X[32][32][8].

+1

технически звук и очень хорошо объяснено. Надеюсь, вы не возражаете, если я займу некоторое время –

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

Спасибо за хорошее объяснение, я набрал вопрос в форме как есть. Я также отредактирую вопрос, чтобы включить экзаменационные документы в его первоначальной форме как можно скорее. –

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 

От этого я бы сделал вывод, что и а), и в) являются правильными ответами.

2

Exp: Дано, что размер int равен 4B, а char - 1B. Память байта адресуема. Пусть массив будет объявлен как тип 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. 
Смежные вопросы