Рубрики

ВОРОТА | GATE-CS-2014- (Set-2) | Вопрос 44

Для программы на 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 является ПРАВИЛЬНЫМ?
(A) X объявлен как «int X [32] [32] [8]».
(B) X объявлен как «int X [4] [1024] [32]».
(C) X объявлен как «символ X [4] [32] [8]».
(D) X объявлен как «символ X [32] [16] [2]».

Ответ: (А)
Пояснение: окончательное выражение можно упростить в форме i, j и k, выполнив промежуточные шаги кода в обратном порядке.

t5 = X[t4]
   = X[t3 + t2]
   = X[t1 + t0 + t2]
   = X[i*1024 + j*32 + k*4]
   = X + i*1024 + j*32 + k*4 

Поскольку k умножается на 4, массив должен быть массивом int.
У нас есть 2 варианта (А и В) из 4 вариантов.

X [i] [j] [k] '-ый элемент в одномерном массиве эквивалентен
X [i * M * L + j * L + k] '-ый элемент в одномерном массиве
(Обратите внимание, что многомерные массивы хранятся в главном порядке строк в C).

Таким образом, мы получаем следующие уравнения

j*L*4 = j*32, we get L = 8 (4 is the sizeof(int))
i*1024 = i*M*L*4, we get M = 1024/32 = 32

Поэтому вариант A является единственно правильным, поскольку M и L равны 32 и 8 соответственно.
только в варианте А.
Тест на этот вопрос

Рекомендуемые посты:

ВОРОТА | GATE-CS-2014- (Set-2) | Вопрос 44

0.00 (0%) 0 votes